├── .editorconfig ├── .eslintrc.json ├── .gitattributes ├── .github ├── ISSUE_TEMPLATE │ ├── bug_report.yml │ ├── config.yml │ └── feature_request.yml ├── issue-checker.yml └── workflows │ ├── codeql.yml │ ├── format-and-lint.yml │ ├── issue-checker.yml │ └── publish.yml ├── .gitignore ├── .husky └── pre-commit ├── .prettierrc.json ├── .vscode └── extensions.json ├── .whitesource ├── CICD └── build_json.js ├── CONTRIBUTING.md ├── LICENSE ├── README.md ├── index.html ├── package.json ├── pnpm-lock.yaml ├── public ├── config │ ├── json │ │ └── students.json │ └── yaml │ │ ├── momotalk │ │ ├── 10000.yml │ │ ├── 10001.yml │ │ ├── 10002.yml │ │ ├── 10003.yml │ │ ├── 10004.yml │ │ ├── 10005.yml │ │ ├── 10006.yml │ │ ├── 10007.yml │ │ ├── 10008.yml │ │ ├── 10009.yml │ │ ├── 10010.yml │ │ ├── 10011.yml │ │ ├── 10012.yml │ │ ├── 10013.yml │ │ ├── 10014.yml │ │ ├── 10015.yml │ │ ├── 10016.yml │ │ ├── 10017.yml │ │ ├── 10018.yml │ │ ├── 10019.yml │ │ ├── 10020.yml │ │ ├── 10021.yml │ │ ├── 10022.yml │ │ ├── 10023.yml │ │ ├── 10024.yml │ │ ├── 10025.yml │ │ ├── 10026.yml │ │ ├── 10027.yml │ │ ├── 10028.yml │ │ ├── 10029.yml │ │ ├── 10030.yml │ │ ├── 10031.yml │ │ ├── 10032.yml │ │ ├── 10033.yml │ │ ├── 10034.yml │ │ ├── 10035.yml │ │ ├── 10036.yml │ │ ├── 10037.yml │ │ ├── 10038.yml │ │ ├── 10039.yml │ │ ├── 10040.yml │ │ ├── 10041.yml │ │ ├── 10042.yml │ │ ├── 10043.yml │ │ ├── 10044.yml │ │ ├── 10045.yml │ │ ├── 10046.yml │ │ ├── 10047.yml │ │ ├── 10048.yml │ │ ├── 10049.yml │ │ ├── 10050.yml │ │ ├── 10051.yml │ │ ├── 10052.yml │ │ ├── 10053.yml │ │ ├── 10054.yml │ │ ├── 10055.yml │ │ ├── 10056.yml │ │ ├── 10057.yml │ │ ├── 10058.yml │ │ ├── 10059.yml │ │ ├── 10060.yml │ │ ├── 10061.yml │ │ ├── 10062.yml │ │ ├── 10063.yml │ │ ├── 10064.yml │ │ ├── 10065.yml │ │ ├── 10066.yml │ │ ├── 10067.yml │ │ ├── 10068.yml │ │ ├── 10069.yml │ │ ├── 10070.yml │ │ ├── 13000.yml │ │ ├── 13001.yml │ │ ├── 13002.yml │ │ ├── 13003.yml │ │ ├── 13004.yml │ │ ├── 13005.yml │ │ ├── 13006.yml │ │ ├── 13007.yml │ │ ├── 13008.yml │ │ ├── 13009.yml │ │ ├── 13010.yml │ │ ├── 13011.yml │ │ ├── 13012.yml │ │ ├── 16000.yml │ │ ├── 16001.yml │ │ ├── 16002.yml │ │ ├── 16003.yml │ │ ├── 16004.yml │ │ ├── 16005.yml │ │ ├── 16006.yml │ │ ├── 16007.yml │ │ ├── 16008.yml │ │ ├── 16009.yml │ │ ├── 16010.yml │ │ ├── 16011.yml │ │ ├── 16012.yml │ │ ├── 20000.yml │ │ ├── 20001.yml │ │ ├── 20002.yml │ │ ├── 20003.yml │ │ ├── 20004.yml │ │ ├── 20005.yml │ │ ├── 20006.yml │ │ ├── 20007.yml │ │ ├── 20008.yml │ │ ├── 20009.yml │ │ ├── 20010.yml │ │ ├── 20011.yml │ │ ├── 20012.yml │ │ ├── 20013.yml │ │ ├── 20014.yml │ │ ├── 20015.yml │ │ ├── 20016.yml │ │ ├── 20017.yml │ │ ├── 20018.yml │ │ ├── 20019.yml │ │ ├── 20020.yml │ │ ├── 20021.yml │ │ ├── 20022.yml │ │ ├── 20023.yml │ │ ├── 20024.yml │ │ ├── 20025.yml │ │ ├── 23000.yml │ │ ├── 23001.yml │ │ ├── 23002.yml │ │ ├── 23003.yml │ │ ├── 23004.yml │ │ ├── 23005.yml │ │ ├── 23006.yml │ │ ├── 23007.yml │ │ ├── 23008.yml │ │ ├── 26000.yml │ │ ├── 26001.yml │ │ ├── 26002.yml │ │ ├── 26003.yml │ │ ├── 26004.yml │ │ ├── 26005.yml │ │ ├── 26006.yml │ │ ├── 26007.yml │ │ ├── 26008.yml │ │ └── 26009.yml │ │ └── students.yaml ├── favicon │ ├── android-chrome-192x192.png │ ├── android-chrome-512x512.png │ ├── apple-touch-icon.png │ ├── favicon-16x16.png │ ├── favicon-32x32.png │ ├── favicon.ico │ └── maskable-192x192.png ├── font │ ├── AsapCondensed-BoldItalic.woff │ ├── AsapCondensed-BoldItalic.woff2 │ ├── AsapCondensed-Medium.woff │ ├── AsapCondensed-Medium.woff2 │ ├── bender-bold-italic.woff │ ├── bender-bold-italic.woff2 │ ├── bender-bold.woff │ ├── bender-bold.woff2 │ ├── fusion-pixel.ttf │ ├── fusion-pixel.woff │ └── fusion-pixel.woff2 ├── image │ ├── avatar_students │ │ ├── 10000.webp │ │ ├── 10001.webp │ │ ├── 10002.webp │ │ ├── 10003.webp │ │ ├── 10004.webp │ │ ├── 10005.webp │ │ ├── 10006.webp │ │ ├── 10007.webp │ │ ├── 10008.webp │ │ ├── 10009.webp │ │ ├── 10010.webp │ │ ├── 10011.webp │ │ ├── 10012.webp │ │ ├── 10013.webp │ │ ├── 10014.webp │ │ ├── 10015.webp │ │ ├── 10016.webp │ │ ├── 10017.webp │ │ ├── 10018.webp │ │ ├── 10019.webp │ │ ├── 10020.webp │ │ ├── 10021.webp │ │ ├── 10022.webp │ │ ├── 10023.webp │ │ ├── 10024.webp │ │ ├── 10025.webp │ │ ├── 10026.webp │ │ ├── 10027.webp │ │ ├── 10028.webp │ │ ├── 10029.webp │ │ ├── 10030.webp │ │ ├── 10031.webp │ │ ├── 10032.webp │ │ ├── 10033.webp │ │ ├── 10034.webp │ │ ├── 10035.webp │ │ ├── 10036.webp │ │ ├── 10037.webp │ │ ├── 10038.webp │ │ ├── 10039.webp │ │ ├── 10040.webp │ │ ├── 10041.webp │ │ ├── 10042.webp │ │ ├── 10043.webp │ │ ├── 10044.webp │ │ ├── 10045.webp │ │ ├── 10046.webp │ │ ├── 10047.webp │ │ ├── 10048.webp │ │ ├── 10049.webp │ │ ├── 10050.webp │ │ ├── 10051.webp │ │ ├── 10052.webp │ │ ├── 10053.webp │ │ ├── 10054.webp │ │ ├── 10055.webp │ │ ├── 10056.webp │ │ ├── 10057.webp │ │ ├── 10058.webp │ │ ├── 10059.webp │ │ ├── 10060.webp │ │ ├── 10061.webp │ │ ├── 10062.webp │ │ ├── 10063.webp │ │ ├── 10064.webp │ │ ├── 10065.webp │ │ ├── 10066.webp │ │ ├── 10067.webp │ │ ├── 10068.webp │ │ ├── 10069.webp │ │ ├── 10070.webp │ │ ├── 13000.webp │ │ ├── 13001.webp │ │ ├── 13002.webp │ │ ├── 13003.webp │ │ ├── 13004.webp │ │ ├── 13005.webp │ │ ├── 13006.webp │ │ ├── 13007.webp │ │ ├── 13008.webp │ │ ├── 13009.webp │ │ ├── 13010.webp │ │ ├── 13011.webp │ │ ├── 13012.webp │ │ ├── 16000.webp │ │ ├── 16001.webp │ │ ├── 16002.webp │ │ ├── 16003.webp │ │ ├── 16004.webp │ │ ├── 16005.webp │ │ ├── 16006.webp │ │ ├── 16007.webp │ │ ├── 16008.webp │ │ ├── 16009.webp │ │ ├── 16010.webp │ │ ├── 16011.webp │ │ ├── 16012.webp │ │ ├── 20000.webp │ │ ├── 20001.webp │ │ ├── 20002.webp │ │ ├── 20003.webp │ │ ├── 20004.webp │ │ ├── 20005.webp │ │ ├── 20006.webp │ │ ├── 20007.webp │ │ ├── 20008.webp │ │ ├── 20009.webp │ │ ├── 20010.webp │ │ ├── 20011.webp │ │ ├── 20012.webp │ │ ├── 20013.webp │ │ ├── 20014.webp │ │ ├── 20015.webp │ │ ├── 20016.webp │ │ ├── 20017.webp │ │ ├── 20018.webp │ │ ├── 20019.webp │ │ ├── 20020.webp │ │ ├── 20021.webp │ │ ├── 20022.webp │ │ ├── 20023.webp │ │ ├── 20024.webp │ │ ├── 20025.webp │ │ ├── 23000.webp │ │ ├── 23001.webp │ │ ├── 23002.webp │ │ ├── 23003.webp │ │ ├── 23004.webp │ │ ├── 23005.webp │ │ ├── 23006.webp │ │ ├── 23007.webp │ │ ├── 23008.webp │ │ ├── 26000.webp │ │ ├── 26001.webp │ │ ├── 26002.webp │ │ ├── 26003.webp │ │ ├── 26004.webp │ │ ├── 26005.webp │ │ ├── 26006.webp │ │ ├── 26007.webp │ │ ├── 26008.webp │ │ └── 26009.webp │ ├── contributor │ │ ├── airen.webp │ │ ├── amahashio.webp │ │ ├── banana.webp │ │ ├── ciisaichan.webp │ │ ├── cloudflare.svg │ │ ├── coya.webp │ │ ├── dianta.webp │ │ ├── diyigemt.webp │ │ ├── fachun.webp │ │ ├── feilongproject.webp │ │ ├── flamingo.webp │ │ ├── giantricebag.webp │ │ ├── github-logo.svg │ │ ├── icarus.webp │ │ ├── jkbojue.webp │ │ ├── kaiseixd.webp │ │ ├── leidian.webp │ │ ├── luckyray-fan.webp │ │ ├── mark9804.webp │ │ ├── mekliy.webp │ │ ├── mingmen.webp │ │ ├── misaka18655.webp │ │ ├── mizukiaaaaaisle.webp │ │ ├── momomomo.webp │ │ ├── nencao.webp │ │ ├── notnotype.webp │ │ ├── ourandream.webp │ │ ├── paoc.webp │ │ ├── pfjhyyj.webp │ │ ├── scn.webp │ │ ├── shinonomesetsuna.webp │ │ ├── takanasichi.webp │ │ ├── tiramisu.webp │ │ ├── unique.webp │ │ ├── violenza.webp │ │ ├── xiaofeitm233.webp │ │ ├── xingkongruoxi.webp │ │ ├── xingzhiyunlv.webp │ │ └── zixunzhan.webp │ ├── homescreen │ │ ├── background-dark.webp │ │ └── background.webp │ ├── menu │ │ ├── afterclass_sweets.webp │ │ ├── gehenna.webp │ │ ├── sanctum_tower.webp │ │ └── shiroko.webp │ └── story_cover │ │ ├── eden_treaty.webp │ │ └── prologue.webp └── story │ ├── favor │ ├── 10010 │ │ ├── 100102.json │ │ ├── 1001020.json │ │ ├── 100103.json │ │ ├── 100105.json │ │ ├── 100106.json │ │ ├── 100108.json │ │ ├── 100109.json │ │ └── index.yml │ ├── 10020 │ │ ├── 100202.json │ │ ├── 100203.json │ │ ├── 100205.json │ │ ├── 100206.json │ │ └── index.yml │ ├── 10032 │ │ ├── 100322.json │ │ ├── 100323.json │ │ ├── 100325.json │ │ └── index.yml │ ├── 10044 │ │ ├── 100442.json │ │ ├── 100443.json │ │ └── 100445.json │ ├── 10053 │ │ ├── 100532.json │ │ └── index.yml │ ├── 10063 │ │ ├── 100632.json │ │ ├── 100633.json │ │ ├── 100635.json │ │ ├── 100636.json │ │ ├── 100638.json │ │ └── index.yml │ ├── 10064 │ │ ├── 100642.json │ │ ├── 100643.json │ │ ├── 100645.json │ │ ├── 100646.json │ │ └── index.yml │ ├── 10065 │ │ ├── 100652.json │ │ ├── 100653.json │ │ ├── 100655.json │ │ ├── 100656.json │ │ └── index.yml │ ├── 10066 │ │ ├── 100662.json │ │ ├── 100663.json │ │ ├── 100665.json │ │ └── index.yml │ ├── 10067 │ │ ├── 100672.json │ │ ├── 100673.json │ │ ├── 100675.json │ │ └── index.yml │ ├── 10068 │ │ ├── 100682.json │ │ ├── 100683.json │ │ ├── 100685.json │ │ ├── 100686.json │ │ └── index.yml │ ├── 10069 │ │ ├── 100692.json │ │ ├── 100693.json │ │ ├── 100695.json │ │ ├── 100696.json │ │ └── index.yml │ ├── 10070 │ │ ├── 100702.json │ │ ├── 100703.json │ │ ├── 100705.json │ │ ├── 100706.json │ │ └── index.yml │ ├── 13004 │ │ ├── 130042.json │ │ ├── 130043.json │ │ ├── 130045.json │ │ ├── 130046.json │ │ └── 130048.json │ ├── 20025 │ │ ├── 200252.json │ │ ├── 200253.json │ │ ├── 200255.json │ │ └── index.yml │ └── 26009 │ │ ├── 260092.json │ │ ├── 260093.json │ │ ├── 260095.json │ │ ├── 260096.json │ │ └── index.yml │ └── main │ ├── 11000.json │ ├── 31010.json │ ├── 31020.json │ ├── 31030.json │ ├── 31040.json │ ├── 31050.json │ ├── 31060.json │ ├── 31070.json │ ├── 31080.json │ ├── 31090.json │ ├── 31100.json │ ├── 31110.json │ ├── 31120.json │ ├── 31130.json │ ├── 31140.json │ ├── 31150.json │ ├── 31160.json │ └── 31170.json ├── renovate.json ├── src ├── App.vue ├── assets │ ├── arona_icon.webp │ ├── be_patient.webp │ ├── bin.svg │ ├── clear-filter.svg │ ├── dark-mode.svg │ ├── filter-options.svg │ ├── filter.svg │ ├── heart.svg │ ├── info.svg │ ├── light-mode.svg │ ├── loading.webp │ ├── mika_sticker.webp │ ├── navigate-down.svg │ ├── network-error.svg │ ├── nnnoise.png │ ├── nnnoise.svg │ ├── padlock.svg │ ├── peach.svg │ └── roadmap.webp ├── components │ ├── AboutPage.vue │ ├── FriendLinks.vue │ ├── GroupStoryHome.vue │ ├── HomeWelcomeScreen.vue │ ├── MainStoryHome.vue │ ├── MiniStoryHome.vue │ ├── NotFound.vue │ ├── StoryViewer.vue │ ├── UpdateLog.vue │ ├── archive │ │ ├── StudentPersonalHome.vue │ │ ├── StudentSelector.vue │ │ ├── StudentStoryContainer.vue │ │ └── StudentStoryPlayer.vue │ ├── menu │ │ ├── DesktopMenu.vue │ │ └── MobileMenu.vue │ ├── momotalk │ │ ├── MomoTalkComponent.vue │ │ ├── MomotalkContainer.vue │ │ └── MomotalkViewer.vue │ ├── settings │ │ └── SettingsHome.vue │ ├── story │ │ ├── StoryBriefBlock.vue │ │ └── StoryLineContainer.vue │ └── widgets │ │ ├── DialogContent.vue │ │ ├── ErrorScreen.vue │ │ ├── LanguageSelector.vue │ │ ├── NeuUI │ │ ├── NeuDialog.vue │ │ ├── NeuProgressBar.vue │ │ ├── NeuRadio.vue │ │ ├── NeuRadioGroup.vue │ │ ├── NeuSwitch.vue │ │ ├── NeuTitleBar.vue │ │ └── README.md │ │ ├── StudentArchiveTitle.vue │ │ ├── StudentShowbox.vue │ │ ├── ThemeSwitcher.vue │ │ ├── UpdatedPortalCard.vue │ │ └── UserNameInput.vue ├── i18n │ ├── getI18nString.ts │ └── localeString.ts ├── index │ └── mainStoryIndex.ts ├── main.ts ├── route │ └── routes.ts ├── store │ ├── settings.ts │ └── students.ts ├── style.scss ├── types │ ├── AppliedFilter.d.ts │ ├── Chats.d.ts │ ├── Routes.ts │ ├── Settings.ts │ ├── StoryJson.ts │ ├── Student.d.ts │ └── UpdateNews.ts ├── util │ ├── filterStudents.ts │ ├── getAllFlattenedStoryIndex.ts │ ├── routerUtils.ts │ └── userInterfaceUtils.ts └── vite-env.d.ts ├── tools ├── gen.bat └── python │ ├── compress.py │ ├── csvcompress.py │ ├── momotalk.proto │ └── momotalk_pb2.py ├── tsconfig.json ├── tsconfig.node.json └── vite.config.ts /.editorconfig: -------------------------------------------------------------------------------- 1 | [*] 2 | charset = utf-8 3 | indent_style = space 4 | indent_size = 2 5 | end_of_line = lf -------------------------------------------------------------------------------- /.eslintrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "env": { 3 | "browser": true, 4 | "es2021": true 5 | }, 6 | "parser": "vue-eslint-parser", 7 | "extends": [ 8 | "eslint:recommended", 9 | "plugin:@typescript-eslint/eslint-recommended", 10 | "plugin:@typescript-eslint/recommended", 11 | "plugin:vue/vue3-essential", 12 | "@vue/eslint-config-typescript", 13 | "prettier" 14 | ], 15 | "plugins": ["vue", "import", "sort-exports", "@typescript-eslint"], 16 | "rules": { 17 | "indent": ["error", 2, { "SwitchCase": 1 }], 18 | "eqeqeq": ["error", "always"], 19 | "max-len": ["error", { "code": 120 }], 20 | "linebreak-style": ["error", "unix"], 21 | "quotes": ["error", "single", { "avoidEscape": true }], 22 | "semi": ["warn", "always"], 23 | "comma-dangle": [ 24 | "error", 25 | { 26 | "arrays": "always-multiline", 27 | "objects": "always-multiline", 28 | "imports": "always-multiline", 29 | "exports": "always-multiline", 30 | "functions": "ignore" 31 | } 32 | ], 33 | "sort-exports/sort-exports": ["error", { "sortDir": "asc" }], 34 | "sort-imports": [ 35 | "error", 36 | { 37 | "ignoreCase": false, 38 | "ignoreDeclarationSort": true, 39 | "ignoreMemberSort": false, 40 | "memberSyntaxSortOrder": ["all", "single", "multiple", "none"] 41 | } 42 | ] 43 | }, 44 | "overrides": [ 45 | { 46 | "files": ["*.yaml", "*.yml"], 47 | "plugins": ["yaml"], 48 | "extends": ["plugin:yaml/recommended"] 49 | } 50 | ] 51 | } 52 | -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | # Set the default behavior, in case people don't have core.autocrlf set. 2 | * text=auto 3 | 4 | # Explicitly declare text files you want to always be normalized and converted 5 | # to native line endings on checkout. 6 | 7 | # Declare files that will always have CRLF line endings on checkout. 8 | *.vue text eol=lf 9 | *.ts text eol=lf 10 | *.js text eol=lf 11 | *.scss text eol=lf 12 | 13 | # Denote all files that are truly binary and should not be modified. 14 | *.png binary 15 | *.jpg binary 16 | *.webp binary 17 | *.svg binary 18 | *.woff binary 19 | *.woff2 binary 20 | package.json !binary 21 | .prettierrc.json !binary 22 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/bug_report.yml: -------------------------------------------------------------------------------- 1 | name: 我要报告一个问题 2 | description: 它的行为好像和我预料的不太一样。 3 | labels: 4 | - bug 5 | - question 6 | title: '[Bug] ' 7 | 8 | body: 9 | - type: markdown 10 | attributes: 11 | value: | 12 | 请在这里描述你的问题。如果你有截图,请在下面的文本框中上传。 13 | Please describe your problem here. If you have screenshots, please upload them in the text box below. 14 | - type: textarea 15 | id: question 16 | attributes: 17 | label: 问题描述 18 | description: 在此详细描述你遇到的问题。 19 | placeholder: 背景图片不能随我的手机壳颜色变化 20 | #value: 21 | validations: 22 | required: true 23 | - type: textarea 24 | id: location 25 | attributes: 26 | label: 问题位置 27 | description: 请提供问题所在的页面地址。可以口头描述,但最好能提供一个完整链接。 28 | placeholder: blue-archive.io 29 | #value: 30 | validations: 31 | required: true 32 | - type: textarea 33 | id: operation 34 | attributes: 35 | label: 复现流程 36 | description: 告诉我们如何操作才有可能重现你的问题,以便我们定位和解决。 37 | placeholder: | 38 | 1. 换一个不是蓝色的手机壳 39 | 2. 打开网页 40 | 3. 背景图片还是蓝色的 41 | #value: 42 | validations: 43 | required: false 44 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/config.yml: -------------------------------------------------------------------------------- 1 | blank_issues_enabled: true 2 | contact_links: 3 | - name: 提问和交流 4 | url: https://github.com/ba-archive/blue-archive-story-viewer/discussions 5 | about: 我想来唠唠嗑。(我们比较忙,不一定会及时回复) 6 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/feature_request.yml: -------------------------------------------------------------------------------- 1 | name: 我想看到一个新功能 2 | description: 我觉得加上这个功能会更好。 3 | labels: 4 | - enhancement 5 | title: '[Enhancement] ' 6 | 7 | body: 8 | - type: markdown 9 | attributes: 10 | value: | 11 | 请在这里描述你的想法。如果你有示意图,请在下面的文本框中上传。 12 | Please describe your problem here. If you have screenshots, please upload them in the text box below. 13 | - type: textarea 14 | id: description 15 | attributes: 16 | label: 功能描述 17 | description: 在此描述你想新增的功能。 18 | placeholder: 我想让背景图片随手机壳的颜色变化 19 | #value: 20 | validations: 21 | required: true 22 | - type: textarea 23 | id: operation 24 | attributes: 25 | label: 具体操作 26 | description: 如果你有更具体的操作流程的想法,请在此描述。 27 | placeholder: | 28 | 1. 打开冰箱门 29 | 2. 把大象放进去 30 | 3. 关上冰箱门 31 | #value: 32 | validations: 33 | required: false 34 | -------------------------------------------------------------------------------- /.github/issue-checker.yml: -------------------------------------------------------------------------------- 1 | # For labels 2 | labels: 3 | - name: bug 4 | mode: add 5 | content: bug 6 | regexes: '[Bb]ug' 7 | - name: enhancement 8 | mode: add 9 | content: enhancement 10 | regexes: '[Ee]nhancement|[Ff]eature [Rr]equest|功能请求|新功能|(能|可以?|行)不(行|能|可以)' 11 | - name: UI 12 | mode: add 13 | content: UI 14 | regexes: '[Uu][Ii]|界面' 15 | - name: momotalk 16 | mode: add 17 | content: 'module: momotalk' 18 | regexes: '([Mm][Oo]){2}\s{0,}[Tt][Aa][Ll][Kk]' 19 | - name: story 20 | mode: add 21 | content: 'module: story' 22 | regexes: '([Ss][Tt][Oo][Rr][Yy])|故事|剧情' 23 | - name: safari 24 | mode: add 25 | content: safari 26 | regexes: '[Ss][Aa][Ff][Aa][Rr][Ii]' 27 | - name: chrome 28 | mode: add 29 | content: chrome 30 | regexes: '[Cc][Hh][Rr][Oo][Mm][Ee]|谷歌' 31 | - name: firefox 32 | mode: add 33 | content: firefox 34 | regexes: '[Ff][Ii][Rr][Ee][Ff][Oo][Xx]|火狐' 35 | - name: duplicate 36 | mode: add 37 | content: duplicate 38 | regexes: '[Dd]uplicate of #\d+|[和与跟]\s?#\d+\s?是?重复' 39 | - name: wontfix 40 | mode: add 41 | content: wontfix 42 | regexes: '没有(这个)?(想法|计划)' 43 | - name: remove-question-tag 44 | content: 45 | regexes: '(?> $GITHUB_OUTPUT 41 | echo check_failed="$check_failed" >> $GITHUB_OUTPUT 42 | - name: Comment if check failed 43 | uses: peter-evans/commit-comment@v2 44 | if: ${{ 'true' == steps.check-code.outputs.check_failed }} 45 | with: 46 | body: ${{ steps.check-code.outputs.check_output }} 47 | - name: Error if check failed 48 | if: ${{ 'true' == steps.check-code.outputs.check_failed }} 49 | run: exit -1 50 | -------------------------------------------------------------------------------- /.github/workflows/issue-checker.yml: -------------------------------------------------------------------------------- 1 | name: Issue Checker 2 | on: 3 | issues: 4 | types: [opened, edited] 5 | pull_request_target: 6 | types: [opened, edited] 7 | issue_comment: 8 | types: [created, edited] 9 | push: 10 | 11 | jobs: 12 | triage: 13 | runs-on: ubuntu-latest 14 | steps: 15 | - uses: zzyyyl/issue-checker@v1.7 16 | if: ${{ github.actor != 'renovate[bot]' }} 17 | with: 18 | repo-token: "${{ secrets.GITHUB_TOKEN }}" 19 | configuration-path: .github/issue-checker.yml 20 | not-before: 2022-08-05T00:00:00Z 21 | include-title: 1 22 | add_to_project: 23 | name: Add issue to project 24 | runs-on: ubuntu-latest 25 | needs: triage 26 | steps: 27 | - uses: actions/add-to-project@v0.5.0 28 | with: 29 | project-url: https://github.com/orgs/ba-archive/projects/1 30 | github-token: ${{ secrets.PROJECT_AUTOMATION }} 31 | labeled: 'bug, enhancement, UI, module: momotalk, module: story' 32 | label-operator: OR 33 | -------------------------------------------------------------------------------- /.github/workflows/publish.yml: -------------------------------------------------------------------------------- 1 | # workflow 工作流的名字,自定义 2 | name: publish 3 | 4 | # 配置触发条件 5 | on: 6 | push: # 监听到分支的 push 动作 7 | branches: 8 | - master 9 | 10 | # 工作流的任务集配置 11 | jobs: 12 | # 定义一个 job,id 为 build 13 | build: 14 | name: Build 15 | # 指定任务执行的运行器。latest 表示是 GitHub 提供的最新稳定映像,但可能不是操作系统供应商提供的最新版本。 16 | runs-on: ubuntu-latest 17 | 18 | # 定义 job 的具体步骤 19 | steps: # 每一个 step 或者是执行一个 action,或者是执行一个命令 20 | - name: Checkout # 定义 step 的名字,方便作日志排查 21 | uses: actions/checkout@v3 # uses 表示该步骤使用一个 action 。斜线前面的 'actions' 表示这是官方的action 22 | - name: pnpm-use 23 | uses: pnpm/action-setup@v2 24 | with: 25 | version: 7.21.0 26 | 27 | - name: Install and Build 28 | run: | 29 | pnpm install 30 | pnpm build:github 31 | tar -zcvf release.tgz ./dist/* 32 | - name: Deploy to Server # 执行部署任务 33 | uses: cross-the-world/ssh-scp-ssh-pipelines@latest # 第三方的 action 34 | with: 35 | host: ${{ secrets.SERVER_HOST }} 36 | user: ${{ secrets.SERVER_USER }} 37 | pass: ${{ secrets.SERVER_PASS }} 38 | # 由于网络情况,很容易超时,设置为60s 39 | connect_timeout: 60s 40 | # 将工作目录下的文件全部拷贝到部署服务器的工作目录, scp 会自动覆盖 41 | scp: | 42 | ./release.tgz => ~ 43 | # 解压也会自动覆盖 44 | last_ssh: | 45 | cd ~ 46 | tar -xzvf release.tgz 47 | cp -r ./dist/* /var/www/ 48 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | pnpm-debug.log* 8 | lerna-debug.log* 9 | 10 | node_modules 11 | dist 12 | dist-ssr 13 | *.local 14 | 15 | # Editor directories and files 16 | .vscode/* 17 | !.vscode/extensions.json 18 | .idea 19 | .DS_Store 20 | *.suo 21 | *.ntvs* 22 | *.njsproj 23 | *.sln 24 | *.sw? 25 | stats.html 26 | 27 | public/image/homescreen/* 28 | !public/image/homescreen/background.webp 29 | !public/image/homescreen/background-dark.webp 30 | 31 | test 32 | public/config/json 33 | /public/image/ScenarioImage/ 34 | /public/config/yaml/image/ 35 | index.json 36 | -------------------------------------------------------------------------------- /.husky/pre-commit: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env sh 2 | . "$(dirname -- "$0")/_/husky.sh" 3 | 4 | pnpx lint-staged -------------------------------------------------------------------------------- /.prettierrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "plugins": [ 3 | "@trivago/prettier-plugin-sort-imports", 4 | "prettier-plugin-css-order" 5 | ], 6 | "singleQuote": true, 7 | "arrowParens": "avoid", 8 | "trailingComma": "es5", 9 | "useTabs": false, 10 | "importOrder": [ 11 | "^([a-zA-Z0-9-]+)$", 12 | "^[^#](.+)/(.+)$", 13 | "^#(.+)/(.+)$", 14 | "^[.](.*)" 15 | ], 16 | "importOrderCaseInsensitive": false, 17 | "importOrderGroupNamespaceSpecifiers": true, 18 | "importOrderSeparation": false, 19 | "importOrderSortSpecifiers": true 20 | } 21 | -------------------------------------------------------------------------------- /.vscode/extensions.json: -------------------------------------------------------------------------------- 1 | { 2 | "recommendations": ["Vue.volar"] 3 | } 4 | -------------------------------------------------------------------------------- /.whitesource: -------------------------------------------------------------------------------- 1 | { 2 | "scanSettings": { 3 | "baseBranches": [] 4 | }, 5 | "checkRunSettings": { 6 | "vulnerableCheckRunConclusionLevel": "failure", 7 | "displayMode": "diff", 8 | "useMendCheckNames": true 9 | }, 10 | "issueSettings": { 11 | "minSeverityLevel": "LOW", 12 | "issueType": "DEPENDENCY" 13 | } 14 | } -------------------------------------------------------------------------------- /CICD/build_json.js: -------------------------------------------------------------------------------- 1 | import chalk from 'chalk'; 2 | import fs from 'fs'; 3 | import jsYaml from 'js-yaml'; 4 | import path from 'path'; 5 | import { fileURLToPath } from 'url'; 6 | 7 | const __filename = fileURLToPath(import.meta.url); 8 | const __dirname = path.dirname(__filename); 9 | 10 | function walk(dir, callback) { 11 | fs.readdir(dir, (err, files) => { 12 | if (err) { 13 | console.log(err); 14 | } else { 15 | files.forEach(file => { 16 | const pathname = path.join(dir, file); 17 | fs.stat(pathname, (err, stats) => { 18 | if (err) { 19 | console.log(err); 20 | } else if (stats.isDirectory()) { 21 | walk(pathname, callback); 22 | } else { 23 | callback(pathname); 24 | } 25 | }); 26 | }); 27 | } 28 | }); 29 | } 30 | 31 | walk(path.resolve(__dirname, '..', 'public'), pathname => { 32 | const startTime = new Date().getTime(); 33 | fs.readFile(pathname, 'utf8', (err, data) => { 34 | if (err) { 35 | console.log(`[${chalk.red('ERROR')}] ${pathname}\n${chalk.red(err)}`); 36 | } else { 37 | if (/\.ya?ml$/i.test(pathname)) { 38 | const json = jsYaml.load(data); 39 | const jsonPath = pathname.replaceAll(/ya?ml/gi, 'json'); 40 | const jsonDir = path.dirname(jsonPath); 41 | if (undefined !== json) { 42 | if (!fs.existsSync(jsonDir)) { 43 | fs.mkdirSync(jsonDir, { recursive: true }); 44 | } 45 | fs.writeFile(jsonPath, JSON.stringify(json, null, 0), err => { 46 | if (err) { 47 | console.log( 48 | `[${chalk.red('FAILED')}] ${jsonPath}: ${chalk.red(err)}` 49 | ); 50 | } else { 51 | const endTime = new Date().getTime(); 52 | console.log( 53 | `[${chalk.green('SUCCESS')}] ${chalk.green( 54 | jsonPath 55 | )} ${chalk.gray(`${endTime - startTime}ms`)}` 56 | ); 57 | } 58 | }); 59 | } else { 60 | console.log( 61 | `[${chalk.yellowBright('SKIPPED')}] ${pathname} (empty file)` 62 | ); 63 | } 64 | } else { 65 | console.log( 66 | `[${chalk.gray('IGNORED')}] ${chalk.gray(pathname + ' (not YAML)')}` 67 | ); 68 | } 69 | } 70 | }); 71 | }); 72 | -------------------------------------------------------------------------------- /CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | # 开发规范 2 | 3 | 项目使用 TS + Vue3 + Vite 进行开发。 4 | 5 | 其中,Vue SFC 组件使用 ` 11 | ``` 12 | 13 | ## 命名规则 14 | 15 | - 组件名称 : 大驼峰 16 | - 函数 : function 17 | - 函数命名 : 大驼峰 18 | - 私有变量 : 小驼峰 19 | - 公有变量 : 小驼峰 20 | - 常量 : 全大写,单词之间使用 `_` 分隔 21 | - 模板 : 大驼峰 22 | 23 | ## 注释规则 24 | 25 | - 尽可能详细 26 | 27 | ## 提交信息 28 | 29 | `提交类型`: `简要描述` 30 | 31 | # 设计规范 32 | 33 | ## 预定义的 `CSS` 样式 34 | 35 | 提供了毛玻璃样式。`class` 为 `acrylic`。 36 | 37 | ```scss 38 | .acrylic { 39 | position: relative; 40 | backdrop-filter: blur(12px); 41 | -webkit-backdrop-filter: blur(12px); 42 | background-image: url('/src/assets/nnnoise.svg'); 43 | background-position: center; 44 | background-repeat: repeat; 45 | overflow: hidden; 46 | } 47 | ``` 48 | 49 | ## 预定义的 `CSS` 布局 50 | 51 | 提供了以下预定义布局: 52 | 53 | ### 完全居中布局 `center` 54 | 55 | ```scss 56 | .center { 57 | display: flex; 58 | flex-direction: column; 59 | justify-content: center; 60 | align-items: center; 61 | } 62 | ``` 63 | 64 | ### 水平居中布局 `flex-horizontal` 65 | 66 | ```scss 67 | .flex-horizontal { 68 | display: flex; 69 | flex-direction: row; 70 | align-items: center; 71 | } 72 | ``` 73 | 74 | ### 垂直居中布局 `flex-vertical` 75 | 76 | ```scss 77 | .flex-vertical { 78 | display: flex; 79 | flex-direction: column; 80 | align-items: center; 81 | } 82 | ``` 83 | 84 | ### 其他补充布局 `fill-width`, `fill-screen` 85 | 86 | ```scss 87 | .fill-width { 88 | width: 100%; 89 | } 90 | 91 | .fill-screen { 92 | flex: 1; 93 | } 94 | ``` 95 | 96 | ## CSS 变量 97 | 98 | ### 颜色变量 99 | 100 | 颜色变量统一放置在 `/src/style.scss` 中的 `html` 选择器中,方便暗色模式使用。 101 | 102 | ```scss 103 | html { 104 | --color-main-background: #edf4fb; 105 | --color-text-main: #2f2f2f; 106 | --color-text-ingame: #344a6e; 107 | } 108 | 109 | html[data-theme='dark'] { 110 | --color-main-background: #343e50; 111 | --color-text-main: #eee; 112 | --color-text-ingame: #eee; 113 | } 114 | ``` 115 | 116 | ### 圆角 `class` 117 | 118 | 总共有三种圆角半径,分别为 `0.5rem`、`1rem`、`2rem`。对应的 `class` 为 `rounded-small`、`rounded-medium`、`rounded-large`。 119 | 120 | ```scss 121 | .rounded-small { 122 | border-radius: 0.5rem; 123 | -webkit-border-radius: 0.5rem; 124 | } 125 | 126 | .rounded-medium { 127 | border-radius: 1rem; 128 | -webkit-border-radius: 1rem; 129 | } 130 | 131 | .rounded-large { 132 | border-radius: 2rem; 133 | -webkit-border-radius: 2rem; 134 | } 135 | ``` 136 | 137 | ### 阴影 `class` 138 | 139 | 总共有三种阴影。对应 `class` 为 `shadow-near`, `shadow-far`, `shadow-farther`。 140 | 141 | ```scss 142 | .shadow-near { 143 | box-shadow: 0.1rem 0.1rem 0.2rem var(--color-shadow-near); 144 | } 145 | 146 | .shadow-far { 147 | box-shadow: 0.2rem 0.2rem 0.5rem var(--color-shadow-far); 148 | } 149 | 150 | .shadow-farther { 151 | box-shadow: 0.2rem 0.2rem 1rem var(--color-shadow-farther); 152 | } 153 | ``` 154 | 155 | 对于 `:hover` 样式改变,提供三种变量。 156 | 157 | ```scss 158 | html { 159 | --style-shadow-near: 0.1rem 0.1rem 0.2rem var(--color-shadow-near); 160 | --style-shadow-far: 0.2rem 0.2rem 0.5rem var(--color-shadow-far); 161 | --style-shadow-farther: 0.2rem 0.2rem 1rem var(--color-shadow-farther); 162 | } 163 | ``` 164 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Blue-archive-story-viewer 2 | 3 | 仓库已经迁移到 [monorepo](https://github.com/ba-archive/blue-archive),如无特殊情况此仓库不会再更新。 4 | 5 | 详情请参照 monorepo 内的相关内容。 6 | -------------------------------------------------------------------------------- /index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 13 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 碧蓝档案剧情站 25 | 31 | 32 | 33 | 34 | 35 |
36 | 37 | 38 | 39 | -------------------------------------------------------------------------------- /public/favicon/android-chrome-192x192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ba-archive/blue-archive-story-viewer/9d6055ebc22ab9a052ae13df0205ce85653bde0f/public/favicon/android-chrome-192x192.png -------------------------------------------------------------------------------- /public/favicon/android-chrome-512x512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ba-archive/blue-archive-story-viewer/9d6055ebc22ab9a052ae13df0205ce85653bde0f/public/favicon/android-chrome-512x512.png -------------------------------------------------------------------------------- /public/favicon/apple-touch-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ba-archive/blue-archive-story-viewer/9d6055ebc22ab9a052ae13df0205ce85653bde0f/public/favicon/apple-touch-icon.png -------------------------------------------------------------------------------- /public/favicon/favicon-16x16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ba-archive/blue-archive-story-viewer/9d6055ebc22ab9a052ae13df0205ce85653bde0f/public/favicon/favicon-16x16.png -------------------------------------------------------------------------------- /public/favicon/favicon-32x32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ba-archive/blue-archive-story-viewer/9d6055ebc22ab9a052ae13df0205ce85653bde0f/public/favicon/favicon-32x32.png -------------------------------------------------------------------------------- /public/favicon/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ba-archive/blue-archive-story-viewer/9d6055ebc22ab9a052ae13df0205ce85653bde0f/public/favicon/favicon.ico -------------------------------------------------------------------------------- /public/favicon/maskable-192x192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ba-archive/blue-archive-story-viewer/9d6055ebc22ab9a052ae13df0205ce85653bde0f/public/favicon/maskable-192x192.png -------------------------------------------------------------------------------- /public/font/AsapCondensed-BoldItalic.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ba-archive/blue-archive-story-viewer/9d6055ebc22ab9a052ae13df0205ce85653bde0f/public/font/AsapCondensed-BoldItalic.woff -------------------------------------------------------------------------------- /public/font/AsapCondensed-BoldItalic.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ba-archive/blue-archive-story-viewer/9d6055ebc22ab9a052ae13df0205ce85653bde0f/public/font/AsapCondensed-BoldItalic.woff2 -------------------------------------------------------------------------------- /public/font/AsapCondensed-Medium.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ba-archive/blue-archive-story-viewer/9d6055ebc22ab9a052ae13df0205ce85653bde0f/public/font/AsapCondensed-Medium.woff -------------------------------------------------------------------------------- /public/font/AsapCondensed-Medium.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ba-archive/blue-archive-story-viewer/9d6055ebc22ab9a052ae13df0205ce85653bde0f/public/font/AsapCondensed-Medium.woff2 -------------------------------------------------------------------------------- /public/font/bender-bold-italic.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ba-archive/blue-archive-story-viewer/9d6055ebc22ab9a052ae13df0205ce85653bde0f/public/font/bender-bold-italic.woff -------------------------------------------------------------------------------- /public/font/bender-bold-italic.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ba-archive/blue-archive-story-viewer/9d6055ebc22ab9a052ae13df0205ce85653bde0f/public/font/bender-bold-italic.woff2 -------------------------------------------------------------------------------- /public/font/bender-bold.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ba-archive/blue-archive-story-viewer/9d6055ebc22ab9a052ae13df0205ce85653bde0f/public/font/bender-bold.woff -------------------------------------------------------------------------------- /public/font/bender-bold.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ba-archive/blue-archive-story-viewer/9d6055ebc22ab9a052ae13df0205ce85653bde0f/public/font/bender-bold.woff2 -------------------------------------------------------------------------------- /public/font/fusion-pixel.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ba-archive/blue-archive-story-viewer/9d6055ebc22ab9a052ae13df0205ce85653bde0f/public/font/fusion-pixel.ttf -------------------------------------------------------------------------------- /public/font/fusion-pixel.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ba-archive/blue-archive-story-viewer/9d6055ebc22ab9a052ae13df0205ce85653bde0f/public/font/fusion-pixel.woff -------------------------------------------------------------------------------- /public/font/fusion-pixel.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ba-archive/blue-archive-story-viewer/9d6055ebc22ab9a052ae13df0205ce85653bde0f/public/font/fusion-pixel.woff2 -------------------------------------------------------------------------------- /public/image/avatar_students/10000.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ba-archive/blue-archive-story-viewer/9d6055ebc22ab9a052ae13df0205ce85653bde0f/public/image/avatar_students/10000.webp -------------------------------------------------------------------------------- /public/image/avatar_students/10001.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ba-archive/blue-archive-story-viewer/9d6055ebc22ab9a052ae13df0205ce85653bde0f/public/image/avatar_students/10001.webp -------------------------------------------------------------------------------- /public/image/avatar_students/10002.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ba-archive/blue-archive-story-viewer/9d6055ebc22ab9a052ae13df0205ce85653bde0f/public/image/avatar_students/10002.webp -------------------------------------------------------------------------------- /public/image/avatar_students/10003.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ba-archive/blue-archive-story-viewer/9d6055ebc22ab9a052ae13df0205ce85653bde0f/public/image/avatar_students/10003.webp -------------------------------------------------------------------------------- /public/image/avatar_students/10004.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ba-archive/blue-archive-story-viewer/9d6055ebc22ab9a052ae13df0205ce85653bde0f/public/image/avatar_students/10004.webp -------------------------------------------------------------------------------- /public/image/avatar_students/10005.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ba-archive/blue-archive-story-viewer/9d6055ebc22ab9a052ae13df0205ce85653bde0f/public/image/avatar_students/10005.webp -------------------------------------------------------------------------------- /public/image/avatar_students/10006.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ba-archive/blue-archive-story-viewer/9d6055ebc22ab9a052ae13df0205ce85653bde0f/public/image/avatar_students/10006.webp -------------------------------------------------------------------------------- /public/image/avatar_students/10007.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ba-archive/blue-archive-story-viewer/9d6055ebc22ab9a052ae13df0205ce85653bde0f/public/image/avatar_students/10007.webp -------------------------------------------------------------------------------- /public/image/avatar_students/10008.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ba-archive/blue-archive-story-viewer/9d6055ebc22ab9a052ae13df0205ce85653bde0f/public/image/avatar_students/10008.webp -------------------------------------------------------------------------------- /public/image/avatar_students/10009.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ba-archive/blue-archive-story-viewer/9d6055ebc22ab9a052ae13df0205ce85653bde0f/public/image/avatar_students/10009.webp -------------------------------------------------------------------------------- /public/image/avatar_students/10010.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ba-archive/blue-archive-story-viewer/9d6055ebc22ab9a052ae13df0205ce85653bde0f/public/image/avatar_students/10010.webp -------------------------------------------------------------------------------- /public/image/avatar_students/10011.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ba-archive/blue-archive-story-viewer/9d6055ebc22ab9a052ae13df0205ce85653bde0f/public/image/avatar_students/10011.webp -------------------------------------------------------------------------------- /public/image/avatar_students/10012.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ba-archive/blue-archive-story-viewer/9d6055ebc22ab9a052ae13df0205ce85653bde0f/public/image/avatar_students/10012.webp -------------------------------------------------------------------------------- /public/image/avatar_students/10013.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ba-archive/blue-archive-story-viewer/9d6055ebc22ab9a052ae13df0205ce85653bde0f/public/image/avatar_students/10013.webp -------------------------------------------------------------------------------- /public/image/avatar_students/10014.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ba-archive/blue-archive-story-viewer/9d6055ebc22ab9a052ae13df0205ce85653bde0f/public/image/avatar_students/10014.webp -------------------------------------------------------------------------------- /public/image/avatar_students/10015.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ba-archive/blue-archive-story-viewer/9d6055ebc22ab9a052ae13df0205ce85653bde0f/public/image/avatar_students/10015.webp -------------------------------------------------------------------------------- /public/image/avatar_students/10016.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ba-archive/blue-archive-story-viewer/9d6055ebc22ab9a052ae13df0205ce85653bde0f/public/image/avatar_students/10016.webp -------------------------------------------------------------------------------- /public/image/avatar_students/10017.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ba-archive/blue-archive-story-viewer/9d6055ebc22ab9a052ae13df0205ce85653bde0f/public/image/avatar_students/10017.webp -------------------------------------------------------------------------------- /public/image/avatar_students/10018.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ba-archive/blue-archive-story-viewer/9d6055ebc22ab9a052ae13df0205ce85653bde0f/public/image/avatar_students/10018.webp -------------------------------------------------------------------------------- /public/image/avatar_students/10019.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ba-archive/blue-archive-story-viewer/9d6055ebc22ab9a052ae13df0205ce85653bde0f/public/image/avatar_students/10019.webp -------------------------------------------------------------------------------- /public/image/avatar_students/10020.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ba-archive/blue-archive-story-viewer/9d6055ebc22ab9a052ae13df0205ce85653bde0f/public/image/avatar_students/10020.webp -------------------------------------------------------------------------------- /public/image/avatar_students/10021.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ba-archive/blue-archive-story-viewer/9d6055ebc22ab9a052ae13df0205ce85653bde0f/public/image/avatar_students/10021.webp -------------------------------------------------------------------------------- /public/image/avatar_students/10022.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ba-archive/blue-archive-story-viewer/9d6055ebc22ab9a052ae13df0205ce85653bde0f/public/image/avatar_students/10022.webp -------------------------------------------------------------------------------- /public/image/avatar_students/10023.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ba-archive/blue-archive-story-viewer/9d6055ebc22ab9a052ae13df0205ce85653bde0f/public/image/avatar_students/10023.webp -------------------------------------------------------------------------------- /public/image/avatar_students/10024.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ba-archive/blue-archive-story-viewer/9d6055ebc22ab9a052ae13df0205ce85653bde0f/public/image/avatar_students/10024.webp -------------------------------------------------------------------------------- /public/image/avatar_students/10025.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ba-archive/blue-archive-story-viewer/9d6055ebc22ab9a052ae13df0205ce85653bde0f/public/image/avatar_students/10025.webp -------------------------------------------------------------------------------- /public/image/avatar_students/10026.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ba-archive/blue-archive-story-viewer/9d6055ebc22ab9a052ae13df0205ce85653bde0f/public/image/avatar_students/10026.webp -------------------------------------------------------------------------------- /public/image/avatar_students/10027.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ba-archive/blue-archive-story-viewer/9d6055ebc22ab9a052ae13df0205ce85653bde0f/public/image/avatar_students/10027.webp -------------------------------------------------------------------------------- /public/image/avatar_students/10028.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ba-archive/blue-archive-story-viewer/9d6055ebc22ab9a052ae13df0205ce85653bde0f/public/image/avatar_students/10028.webp -------------------------------------------------------------------------------- /public/image/avatar_students/10029.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ba-archive/blue-archive-story-viewer/9d6055ebc22ab9a052ae13df0205ce85653bde0f/public/image/avatar_students/10029.webp -------------------------------------------------------------------------------- /public/image/avatar_students/10030.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ba-archive/blue-archive-story-viewer/9d6055ebc22ab9a052ae13df0205ce85653bde0f/public/image/avatar_students/10030.webp -------------------------------------------------------------------------------- /public/image/avatar_students/10031.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ba-archive/blue-archive-story-viewer/9d6055ebc22ab9a052ae13df0205ce85653bde0f/public/image/avatar_students/10031.webp -------------------------------------------------------------------------------- /public/image/avatar_students/10032.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ba-archive/blue-archive-story-viewer/9d6055ebc22ab9a052ae13df0205ce85653bde0f/public/image/avatar_students/10032.webp -------------------------------------------------------------------------------- /public/image/avatar_students/10033.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ba-archive/blue-archive-story-viewer/9d6055ebc22ab9a052ae13df0205ce85653bde0f/public/image/avatar_students/10033.webp -------------------------------------------------------------------------------- /public/image/avatar_students/10034.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ba-archive/blue-archive-story-viewer/9d6055ebc22ab9a052ae13df0205ce85653bde0f/public/image/avatar_students/10034.webp -------------------------------------------------------------------------------- /public/image/avatar_students/10035.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ba-archive/blue-archive-story-viewer/9d6055ebc22ab9a052ae13df0205ce85653bde0f/public/image/avatar_students/10035.webp -------------------------------------------------------------------------------- /public/image/avatar_students/10036.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ba-archive/blue-archive-story-viewer/9d6055ebc22ab9a052ae13df0205ce85653bde0f/public/image/avatar_students/10036.webp -------------------------------------------------------------------------------- /public/image/avatar_students/10037.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ba-archive/blue-archive-story-viewer/9d6055ebc22ab9a052ae13df0205ce85653bde0f/public/image/avatar_students/10037.webp -------------------------------------------------------------------------------- /public/image/avatar_students/10038.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ba-archive/blue-archive-story-viewer/9d6055ebc22ab9a052ae13df0205ce85653bde0f/public/image/avatar_students/10038.webp -------------------------------------------------------------------------------- /public/image/avatar_students/10039.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ba-archive/blue-archive-story-viewer/9d6055ebc22ab9a052ae13df0205ce85653bde0f/public/image/avatar_students/10039.webp -------------------------------------------------------------------------------- /public/image/avatar_students/10040.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ba-archive/blue-archive-story-viewer/9d6055ebc22ab9a052ae13df0205ce85653bde0f/public/image/avatar_students/10040.webp -------------------------------------------------------------------------------- /public/image/avatar_students/10041.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ba-archive/blue-archive-story-viewer/9d6055ebc22ab9a052ae13df0205ce85653bde0f/public/image/avatar_students/10041.webp -------------------------------------------------------------------------------- /public/image/avatar_students/10042.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ba-archive/blue-archive-story-viewer/9d6055ebc22ab9a052ae13df0205ce85653bde0f/public/image/avatar_students/10042.webp -------------------------------------------------------------------------------- /public/image/avatar_students/10043.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ba-archive/blue-archive-story-viewer/9d6055ebc22ab9a052ae13df0205ce85653bde0f/public/image/avatar_students/10043.webp -------------------------------------------------------------------------------- /public/image/avatar_students/10044.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ba-archive/blue-archive-story-viewer/9d6055ebc22ab9a052ae13df0205ce85653bde0f/public/image/avatar_students/10044.webp -------------------------------------------------------------------------------- /public/image/avatar_students/10045.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ba-archive/blue-archive-story-viewer/9d6055ebc22ab9a052ae13df0205ce85653bde0f/public/image/avatar_students/10045.webp -------------------------------------------------------------------------------- /public/image/avatar_students/10046.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ba-archive/blue-archive-story-viewer/9d6055ebc22ab9a052ae13df0205ce85653bde0f/public/image/avatar_students/10046.webp -------------------------------------------------------------------------------- /public/image/avatar_students/10047.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ba-archive/blue-archive-story-viewer/9d6055ebc22ab9a052ae13df0205ce85653bde0f/public/image/avatar_students/10047.webp -------------------------------------------------------------------------------- /public/image/avatar_students/10048.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ba-archive/blue-archive-story-viewer/9d6055ebc22ab9a052ae13df0205ce85653bde0f/public/image/avatar_students/10048.webp -------------------------------------------------------------------------------- /public/image/avatar_students/10049.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ba-archive/blue-archive-story-viewer/9d6055ebc22ab9a052ae13df0205ce85653bde0f/public/image/avatar_students/10049.webp -------------------------------------------------------------------------------- /public/image/avatar_students/10050.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ba-archive/blue-archive-story-viewer/9d6055ebc22ab9a052ae13df0205ce85653bde0f/public/image/avatar_students/10050.webp -------------------------------------------------------------------------------- /public/image/avatar_students/10051.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ba-archive/blue-archive-story-viewer/9d6055ebc22ab9a052ae13df0205ce85653bde0f/public/image/avatar_students/10051.webp -------------------------------------------------------------------------------- /public/image/avatar_students/10052.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ba-archive/blue-archive-story-viewer/9d6055ebc22ab9a052ae13df0205ce85653bde0f/public/image/avatar_students/10052.webp -------------------------------------------------------------------------------- /public/image/avatar_students/10053.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ba-archive/blue-archive-story-viewer/9d6055ebc22ab9a052ae13df0205ce85653bde0f/public/image/avatar_students/10053.webp -------------------------------------------------------------------------------- /public/image/avatar_students/10054.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ba-archive/blue-archive-story-viewer/9d6055ebc22ab9a052ae13df0205ce85653bde0f/public/image/avatar_students/10054.webp -------------------------------------------------------------------------------- /public/image/avatar_students/10055.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ba-archive/blue-archive-story-viewer/9d6055ebc22ab9a052ae13df0205ce85653bde0f/public/image/avatar_students/10055.webp -------------------------------------------------------------------------------- /public/image/avatar_students/10056.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ba-archive/blue-archive-story-viewer/9d6055ebc22ab9a052ae13df0205ce85653bde0f/public/image/avatar_students/10056.webp -------------------------------------------------------------------------------- /public/image/avatar_students/10057.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ba-archive/blue-archive-story-viewer/9d6055ebc22ab9a052ae13df0205ce85653bde0f/public/image/avatar_students/10057.webp -------------------------------------------------------------------------------- /public/image/avatar_students/10058.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ba-archive/blue-archive-story-viewer/9d6055ebc22ab9a052ae13df0205ce85653bde0f/public/image/avatar_students/10058.webp -------------------------------------------------------------------------------- /public/image/avatar_students/10059.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ba-archive/blue-archive-story-viewer/9d6055ebc22ab9a052ae13df0205ce85653bde0f/public/image/avatar_students/10059.webp -------------------------------------------------------------------------------- /public/image/avatar_students/10060.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ba-archive/blue-archive-story-viewer/9d6055ebc22ab9a052ae13df0205ce85653bde0f/public/image/avatar_students/10060.webp -------------------------------------------------------------------------------- /public/image/avatar_students/10061.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ba-archive/blue-archive-story-viewer/9d6055ebc22ab9a052ae13df0205ce85653bde0f/public/image/avatar_students/10061.webp -------------------------------------------------------------------------------- /public/image/avatar_students/10062.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ba-archive/blue-archive-story-viewer/9d6055ebc22ab9a052ae13df0205ce85653bde0f/public/image/avatar_students/10062.webp -------------------------------------------------------------------------------- /public/image/avatar_students/10063.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ba-archive/blue-archive-story-viewer/9d6055ebc22ab9a052ae13df0205ce85653bde0f/public/image/avatar_students/10063.webp -------------------------------------------------------------------------------- /public/image/avatar_students/10064.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ba-archive/blue-archive-story-viewer/9d6055ebc22ab9a052ae13df0205ce85653bde0f/public/image/avatar_students/10064.webp -------------------------------------------------------------------------------- /public/image/avatar_students/10065.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ba-archive/blue-archive-story-viewer/9d6055ebc22ab9a052ae13df0205ce85653bde0f/public/image/avatar_students/10065.webp -------------------------------------------------------------------------------- /public/image/avatar_students/10066.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ba-archive/blue-archive-story-viewer/9d6055ebc22ab9a052ae13df0205ce85653bde0f/public/image/avatar_students/10066.webp -------------------------------------------------------------------------------- /public/image/avatar_students/10067.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ba-archive/blue-archive-story-viewer/9d6055ebc22ab9a052ae13df0205ce85653bde0f/public/image/avatar_students/10067.webp -------------------------------------------------------------------------------- /public/image/avatar_students/10068.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ba-archive/blue-archive-story-viewer/9d6055ebc22ab9a052ae13df0205ce85653bde0f/public/image/avatar_students/10068.webp -------------------------------------------------------------------------------- /public/image/avatar_students/10069.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ba-archive/blue-archive-story-viewer/9d6055ebc22ab9a052ae13df0205ce85653bde0f/public/image/avatar_students/10069.webp -------------------------------------------------------------------------------- /public/image/avatar_students/10070.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ba-archive/blue-archive-story-viewer/9d6055ebc22ab9a052ae13df0205ce85653bde0f/public/image/avatar_students/10070.webp -------------------------------------------------------------------------------- /public/image/avatar_students/13000.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ba-archive/blue-archive-story-viewer/9d6055ebc22ab9a052ae13df0205ce85653bde0f/public/image/avatar_students/13000.webp -------------------------------------------------------------------------------- /public/image/avatar_students/13001.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ba-archive/blue-archive-story-viewer/9d6055ebc22ab9a052ae13df0205ce85653bde0f/public/image/avatar_students/13001.webp -------------------------------------------------------------------------------- /public/image/avatar_students/13002.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ba-archive/blue-archive-story-viewer/9d6055ebc22ab9a052ae13df0205ce85653bde0f/public/image/avatar_students/13002.webp -------------------------------------------------------------------------------- /public/image/avatar_students/13003.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ba-archive/blue-archive-story-viewer/9d6055ebc22ab9a052ae13df0205ce85653bde0f/public/image/avatar_students/13003.webp -------------------------------------------------------------------------------- /public/image/avatar_students/13004.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ba-archive/blue-archive-story-viewer/9d6055ebc22ab9a052ae13df0205ce85653bde0f/public/image/avatar_students/13004.webp -------------------------------------------------------------------------------- /public/image/avatar_students/13005.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ba-archive/blue-archive-story-viewer/9d6055ebc22ab9a052ae13df0205ce85653bde0f/public/image/avatar_students/13005.webp -------------------------------------------------------------------------------- /public/image/avatar_students/13006.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ba-archive/blue-archive-story-viewer/9d6055ebc22ab9a052ae13df0205ce85653bde0f/public/image/avatar_students/13006.webp -------------------------------------------------------------------------------- /public/image/avatar_students/13007.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ba-archive/blue-archive-story-viewer/9d6055ebc22ab9a052ae13df0205ce85653bde0f/public/image/avatar_students/13007.webp -------------------------------------------------------------------------------- /public/image/avatar_students/13008.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ba-archive/blue-archive-story-viewer/9d6055ebc22ab9a052ae13df0205ce85653bde0f/public/image/avatar_students/13008.webp -------------------------------------------------------------------------------- /public/image/avatar_students/13009.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ba-archive/blue-archive-story-viewer/9d6055ebc22ab9a052ae13df0205ce85653bde0f/public/image/avatar_students/13009.webp -------------------------------------------------------------------------------- /public/image/avatar_students/13010.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ba-archive/blue-archive-story-viewer/9d6055ebc22ab9a052ae13df0205ce85653bde0f/public/image/avatar_students/13010.webp -------------------------------------------------------------------------------- /public/image/avatar_students/13011.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ba-archive/blue-archive-story-viewer/9d6055ebc22ab9a052ae13df0205ce85653bde0f/public/image/avatar_students/13011.webp -------------------------------------------------------------------------------- /public/image/avatar_students/13012.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ba-archive/blue-archive-story-viewer/9d6055ebc22ab9a052ae13df0205ce85653bde0f/public/image/avatar_students/13012.webp -------------------------------------------------------------------------------- /public/image/avatar_students/16000.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ba-archive/blue-archive-story-viewer/9d6055ebc22ab9a052ae13df0205ce85653bde0f/public/image/avatar_students/16000.webp -------------------------------------------------------------------------------- /public/image/avatar_students/16001.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ba-archive/blue-archive-story-viewer/9d6055ebc22ab9a052ae13df0205ce85653bde0f/public/image/avatar_students/16001.webp -------------------------------------------------------------------------------- /public/image/avatar_students/16002.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ba-archive/blue-archive-story-viewer/9d6055ebc22ab9a052ae13df0205ce85653bde0f/public/image/avatar_students/16002.webp -------------------------------------------------------------------------------- /public/image/avatar_students/16003.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ba-archive/blue-archive-story-viewer/9d6055ebc22ab9a052ae13df0205ce85653bde0f/public/image/avatar_students/16003.webp -------------------------------------------------------------------------------- /public/image/avatar_students/16004.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ba-archive/blue-archive-story-viewer/9d6055ebc22ab9a052ae13df0205ce85653bde0f/public/image/avatar_students/16004.webp -------------------------------------------------------------------------------- /public/image/avatar_students/16005.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ba-archive/blue-archive-story-viewer/9d6055ebc22ab9a052ae13df0205ce85653bde0f/public/image/avatar_students/16005.webp -------------------------------------------------------------------------------- /public/image/avatar_students/16006.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ba-archive/blue-archive-story-viewer/9d6055ebc22ab9a052ae13df0205ce85653bde0f/public/image/avatar_students/16006.webp -------------------------------------------------------------------------------- /public/image/avatar_students/16007.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ba-archive/blue-archive-story-viewer/9d6055ebc22ab9a052ae13df0205ce85653bde0f/public/image/avatar_students/16007.webp -------------------------------------------------------------------------------- /public/image/avatar_students/16008.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ba-archive/blue-archive-story-viewer/9d6055ebc22ab9a052ae13df0205ce85653bde0f/public/image/avatar_students/16008.webp -------------------------------------------------------------------------------- /public/image/avatar_students/16009.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ba-archive/blue-archive-story-viewer/9d6055ebc22ab9a052ae13df0205ce85653bde0f/public/image/avatar_students/16009.webp -------------------------------------------------------------------------------- /public/image/avatar_students/16010.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ba-archive/blue-archive-story-viewer/9d6055ebc22ab9a052ae13df0205ce85653bde0f/public/image/avatar_students/16010.webp -------------------------------------------------------------------------------- /public/image/avatar_students/16011.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ba-archive/blue-archive-story-viewer/9d6055ebc22ab9a052ae13df0205ce85653bde0f/public/image/avatar_students/16011.webp -------------------------------------------------------------------------------- /public/image/avatar_students/16012.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ba-archive/blue-archive-story-viewer/9d6055ebc22ab9a052ae13df0205ce85653bde0f/public/image/avatar_students/16012.webp -------------------------------------------------------------------------------- /public/image/avatar_students/20000.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ba-archive/blue-archive-story-viewer/9d6055ebc22ab9a052ae13df0205ce85653bde0f/public/image/avatar_students/20000.webp -------------------------------------------------------------------------------- /public/image/avatar_students/20001.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ba-archive/blue-archive-story-viewer/9d6055ebc22ab9a052ae13df0205ce85653bde0f/public/image/avatar_students/20001.webp -------------------------------------------------------------------------------- /public/image/avatar_students/20002.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ba-archive/blue-archive-story-viewer/9d6055ebc22ab9a052ae13df0205ce85653bde0f/public/image/avatar_students/20002.webp -------------------------------------------------------------------------------- /public/image/avatar_students/20003.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ba-archive/blue-archive-story-viewer/9d6055ebc22ab9a052ae13df0205ce85653bde0f/public/image/avatar_students/20003.webp -------------------------------------------------------------------------------- /public/image/avatar_students/20004.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ba-archive/blue-archive-story-viewer/9d6055ebc22ab9a052ae13df0205ce85653bde0f/public/image/avatar_students/20004.webp -------------------------------------------------------------------------------- /public/image/avatar_students/20005.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ba-archive/blue-archive-story-viewer/9d6055ebc22ab9a052ae13df0205ce85653bde0f/public/image/avatar_students/20005.webp -------------------------------------------------------------------------------- /public/image/avatar_students/20006.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ba-archive/blue-archive-story-viewer/9d6055ebc22ab9a052ae13df0205ce85653bde0f/public/image/avatar_students/20006.webp -------------------------------------------------------------------------------- /public/image/avatar_students/20007.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ba-archive/blue-archive-story-viewer/9d6055ebc22ab9a052ae13df0205ce85653bde0f/public/image/avatar_students/20007.webp -------------------------------------------------------------------------------- /public/image/avatar_students/20008.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ba-archive/blue-archive-story-viewer/9d6055ebc22ab9a052ae13df0205ce85653bde0f/public/image/avatar_students/20008.webp -------------------------------------------------------------------------------- /public/image/avatar_students/20009.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ba-archive/blue-archive-story-viewer/9d6055ebc22ab9a052ae13df0205ce85653bde0f/public/image/avatar_students/20009.webp -------------------------------------------------------------------------------- /public/image/avatar_students/20010.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ba-archive/blue-archive-story-viewer/9d6055ebc22ab9a052ae13df0205ce85653bde0f/public/image/avatar_students/20010.webp -------------------------------------------------------------------------------- /public/image/avatar_students/20011.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ba-archive/blue-archive-story-viewer/9d6055ebc22ab9a052ae13df0205ce85653bde0f/public/image/avatar_students/20011.webp -------------------------------------------------------------------------------- /public/image/avatar_students/20012.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ba-archive/blue-archive-story-viewer/9d6055ebc22ab9a052ae13df0205ce85653bde0f/public/image/avatar_students/20012.webp -------------------------------------------------------------------------------- /public/image/avatar_students/20013.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ba-archive/blue-archive-story-viewer/9d6055ebc22ab9a052ae13df0205ce85653bde0f/public/image/avatar_students/20013.webp -------------------------------------------------------------------------------- /public/image/avatar_students/20014.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ba-archive/blue-archive-story-viewer/9d6055ebc22ab9a052ae13df0205ce85653bde0f/public/image/avatar_students/20014.webp -------------------------------------------------------------------------------- /public/image/avatar_students/20015.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ba-archive/blue-archive-story-viewer/9d6055ebc22ab9a052ae13df0205ce85653bde0f/public/image/avatar_students/20015.webp -------------------------------------------------------------------------------- /public/image/avatar_students/20016.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ba-archive/blue-archive-story-viewer/9d6055ebc22ab9a052ae13df0205ce85653bde0f/public/image/avatar_students/20016.webp -------------------------------------------------------------------------------- /public/image/avatar_students/20017.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ba-archive/blue-archive-story-viewer/9d6055ebc22ab9a052ae13df0205ce85653bde0f/public/image/avatar_students/20017.webp -------------------------------------------------------------------------------- /public/image/avatar_students/20018.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ba-archive/blue-archive-story-viewer/9d6055ebc22ab9a052ae13df0205ce85653bde0f/public/image/avatar_students/20018.webp -------------------------------------------------------------------------------- /public/image/avatar_students/20019.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ba-archive/blue-archive-story-viewer/9d6055ebc22ab9a052ae13df0205ce85653bde0f/public/image/avatar_students/20019.webp -------------------------------------------------------------------------------- /public/image/avatar_students/20020.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ba-archive/blue-archive-story-viewer/9d6055ebc22ab9a052ae13df0205ce85653bde0f/public/image/avatar_students/20020.webp -------------------------------------------------------------------------------- /public/image/avatar_students/20021.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ba-archive/blue-archive-story-viewer/9d6055ebc22ab9a052ae13df0205ce85653bde0f/public/image/avatar_students/20021.webp -------------------------------------------------------------------------------- /public/image/avatar_students/20022.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ba-archive/blue-archive-story-viewer/9d6055ebc22ab9a052ae13df0205ce85653bde0f/public/image/avatar_students/20022.webp -------------------------------------------------------------------------------- /public/image/avatar_students/20023.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ba-archive/blue-archive-story-viewer/9d6055ebc22ab9a052ae13df0205ce85653bde0f/public/image/avatar_students/20023.webp -------------------------------------------------------------------------------- /public/image/avatar_students/20024.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ba-archive/blue-archive-story-viewer/9d6055ebc22ab9a052ae13df0205ce85653bde0f/public/image/avatar_students/20024.webp -------------------------------------------------------------------------------- /public/image/avatar_students/20025.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ba-archive/blue-archive-story-viewer/9d6055ebc22ab9a052ae13df0205ce85653bde0f/public/image/avatar_students/20025.webp -------------------------------------------------------------------------------- /public/image/avatar_students/23000.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ba-archive/blue-archive-story-viewer/9d6055ebc22ab9a052ae13df0205ce85653bde0f/public/image/avatar_students/23000.webp -------------------------------------------------------------------------------- /public/image/avatar_students/23001.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ba-archive/blue-archive-story-viewer/9d6055ebc22ab9a052ae13df0205ce85653bde0f/public/image/avatar_students/23001.webp -------------------------------------------------------------------------------- /public/image/avatar_students/23002.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ba-archive/blue-archive-story-viewer/9d6055ebc22ab9a052ae13df0205ce85653bde0f/public/image/avatar_students/23002.webp -------------------------------------------------------------------------------- /public/image/avatar_students/23003.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ba-archive/blue-archive-story-viewer/9d6055ebc22ab9a052ae13df0205ce85653bde0f/public/image/avatar_students/23003.webp -------------------------------------------------------------------------------- /public/image/avatar_students/23004.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ba-archive/blue-archive-story-viewer/9d6055ebc22ab9a052ae13df0205ce85653bde0f/public/image/avatar_students/23004.webp -------------------------------------------------------------------------------- /public/image/avatar_students/23005.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ba-archive/blue-archive-story-viewer/9d6055ebc22ab9a052ae13df0205ce85653bde0f/public/image/avatar_students/23005.webp -------------------------------------------------------------------------------- /public/image/avatar_students/23006.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ba-archive/blue-archive-story-viewer/9d6055ebc22ab9a052ae13df0205ce85653bde0f/public/image/avatar_students/23006.webp -------------------------------------------------------------------------------- /public/image/avatar_students/23007.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ba-archive/blue-archive-story-viewer/9d6055ebc22ab9a052ae13df0205ce85653bde0f/public/image/avatar_students/23007.webp -------------------------------------------------------------------------------- /public/image/avatar_students/23008.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ba-archive/blue-archive-story-viewer/9d6055ebc22ab9a052ae13df0205ce85653bde0f/public/image/avatar_students/23008.webp -------------------------------------------------------------------------------- /public/image/avatar_students/26000.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ba-archive/blue-archive-story-viewer/9d6055ebc22ab9a052ae13df0205ce85653bde0f/public/image/avatar_students/26000.webp -------------------------------------------------------------------------------- /public/image/avatar_students/26001.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ba-archive/blue-archive-story-viewer/9d6055ebc22ab9a052ae13df0205ce85653bde0f/public/image/avatar_students/26001.webp -------------------------------------------------------------------------------- /public/image/avatar_students/26002.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ba-archive/blue-archive-story-viewer/9d6055ebc22ab9a052ae13df0205ce85653bde0f/public/image/avatar_students/26002.webp -------------------------------------------------------------------------------- /public/image/avatar_students/26003.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ba-archive/blue-archive-story-viewer/9d6055ebc22ab9a052ae13df0205ce85653bde0f/public/image/avatar_students/26003.webp -------------------------------------------------------------------------------- /public/image/avatar_students/26004.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ba-archive/blue-archive-story-viewer/9d6055ebc22ab9a052ae13df0205ce85653bde0f/public/image/avatar_students/26004.webp -------------------------------------------------------------------------------- /public/image/avatar_students/26005.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ba-archive/blue-archive-story-viewer/9d6055ebc22ab9a052ae13df0205ce85653bde0f/public/image/avatar_students/26005.webp -------------------------------------------------------------------------------- /public/image/avatar_students/26006.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ba-archive/blue-archive-story-viewer/9d6055ebc22ab9a052ae13df0205ce85653bde0f/public/image/avatar_students/26006.webp -------------------------------------------------------------------------------- /public/image/avatar_students/26007.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ba-archive/blue-archive-story-viewer/9d6055ebc22ab9a052ae13df0205ce85653bde0f/public/image/avatar_students/26007.webp -------------------------------------------------------------------------------- /public/image/avatar_students/26008.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ba-archive/blue-archive-story-viewer/9d6055ebc22ab9a052ae13df0205ce85653bde0f/public/image/avatar_students/26008.webp -------------------------------------------------------------------------------- /public/image/avatar_students/26009.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ba-archive/blue-archive-story-viewer/9d6055ebc22ab9a052ae13df0205ce85653bde0f/public/image/avatar_students/26009.webp -------------------------------------------------------------------------------- /public/image/contributor/airen.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ba-archive/blue-archive-story-viewer/9d6055ebc22ab9a052ae13df0205ce85653bde0f/public/image/contributor/airen.webp -------------------------------------------------------------------------------- /public/image/contributor/amahashio.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ba-archive/blue-archive-story-viewer/9d6055ebc22ab9a052ae13df0205ce85653bde0f/public/image/contributor/amahashio.webp -------------------------------------------------------------------------------- /public/image/contributor/banana.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ba-archive/blue-archive-story-viewer/9d6055ebc22ab9a052ae13df0205ce85653bde0f/public/image/contributor/banana.webp -------------------------------------------------------------------------------- /public/image/contributor/ciisaichan.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ba-archive/blue-archive-story-viewer/9d6055ebc22ab9a052ae13df0205ce85653bde0f/public/image/contributor/ciisaichan.webp -------------------------------------------------------------------------------- /public/image/contributor/cloudflare.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | -------------------------------------------------------------------------------- /public/image/contributor/coya.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ba-archive/blue-archive-story-viewer/9d6055ebc22ab9a052ae13df0205ce85653bde0f/public/image/contributor/coya.webp -------------------------------------------------------------------------------- /public/image/contributor/dianta.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ba-archive/blue-archive-story-viewer/9d6055ebc22ab9a052ae13df0205ce85653bde0f/public/image/contributor/dianta.webp -------------------------------------------------------------------------------- /public/image/contributor/diyigemt.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ba-archive/blue-archive-story-viewer/9d6055ebc22ab9a052ae13df0205ce85653bde0f/public/image/contributor/diyigemt.webp -------------------------------------------------------------------------------- /public/image/contributor/fachun.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ba-archive/blue-archive-story-viewer/9d6055ebc22ab9a052ae13df0205ce85653bde0f/public/image/contributor/fachun.webp -------------------------------------------------------------------------------- /public/image/contributor/feilongproject.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ba-archive/blue-archive-story-viewer/9d6055ebc22ab9a052ae13df0205ce85653bde0f/public/image/contributor/feilongproject.webp -------------------------------------------------------------------------------- /public/image/contributor/flamingo.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ba-archive/blue-archive-story-viewer/9d6055ebc22ab9a052ae13df0205ce85653bde0f/public/image/contributor/flamingo.webp -------------------------------------------------------------------------------- /public/image/contributor/giantricebag.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ba-archive/blue-archive-story-viewer/9d6055ebc22ab9a052ae13df0205ce85653bde0f/public/image/contributor/giantricebag.webp -------------------------------------------------------------------------------- /public/image/contributor/github-logo.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /public/image/contributor/icarus.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ba-archive/blue-archive-story-viewer/9d6055ebc22ab9a052ae13df0205ce85653bde0f/public/image/contributor/icarus.webp -------------------------------------------------------------------------------- /public/image/contributor/jkbojue.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ba-archive/blue-archive-story-viewer/9d6055ebc22ab9a052ae13df0205ce85653bde0f/public/image/contributor/jkbojue.webp -------------------------------------------------------------------------------- /public/image/contributor/kaiseixd.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ba-archive/blue-archive-story-viewer/9d6055ebc22ab9a052ae13df0205ce85653bde0f/public/image/contributor/kaiseixd.webp -------------------------------------------------------------------------------- /public/image/contributor/leidian.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ba-archive/blue-archive-story-viewer/9d6055ebc22ab9a052ae13df0205ce85653bde0f/public/image/contributor/leidian.webp -------------------------------------------------------------------------------- /public/image/contributor/luckyray-fan.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ba-archive/blue-archive-story-viewer/9d6055ebc22ab9a052ae13df0205ce85653bde0f/public/image/contributor/luckyray-fan.webp -------------------------------------------------------------------------------- /public/image/contributor/mark9804.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ba-archive/blue-archive-story-viewer/9d6055ebc22ab9a052ae13df0205ce85653bde0f/public/image/contributor/mark9804.webp -------------------------------------------------------------------------------- /public/image/contributor/mekliy.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ba-archive/blue-archive-story-viewer/9d6055ebc22ab9a052ae13df0205ce85653bde0f/public/image/contributor/mekliy.webp -------------------------------------------------------------------------------- /public/image/contributor/mingmen.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ba-archive/blue-archive-story-viewer/9d6055ebc22ab9a052ae13df0205ce85653bde0f/public/image/contributor/mingmen.webp -------------------------------------------------------------------------------- /public/image/contributor/misaka18655.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ba-archive/blue-archive-story-viewer/9d6055ebc22ab9a052ae13df0205ce85653bde0f/public/image/contributor/misaka18655.webp -------------------------------------------------------------------------------- /public/image/contributor/mizukiaaaaaisle.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ba-archive/blue-archive-story-viewer/9d6055ebc22ab9a052ae13df0205ce85653bde0f/public/image/contributor/mizukiaaaaaisle.webp -------------------------------------------------------------------------------- /public/image/contributor/momomomo.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ba-archive/blue-archive-story-viewer/9d6055ebc22ab9a052ae13df0205ce85653bde0f/public/image/contributor/momomomo.webp -------------------------------------------------------------------------------- /public/image/contributor/nencao.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ba-archive/blue-archive-story-viewer/9d6055ebc22ab9a052ae13df0205ce85653bde0f/public/image/contributor/nencao.webp -------------------------------------------------------------------------------- /public/image/contributor/notnotype.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ba-archive/blue-archive-story-viewer/9d6055ebc22ab9a052ae13df0205ce85653bde0f/public/image/contributor/notnotype.webp -------------------------------------------------------------------------------- /public/image/contributor/ourandream.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ba-archive/blue-archive-story-viewer/9d6055ebc22ab9a052ae13df0205ce85653bde0f/public/image/contributor/ourandream.webp -------------------------------------------------------------------------------- /public/image/contributor/paoc.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ba-archive/blue-archive-story-viewer/9d6055ebc22ab9a052ae13df0205ce85653bde0f/public/image/contributor/paoc.webp -------------------------------------------------------------------------------- /public/image/contributor/pfjhyyj.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ba-archive/blue-archive-story-viewer/9d6055ebc22ab9a052ae13df0205ce85653bde0f/public/image/contributor/pfjhyyj.webp -------------------------------------------------------------------------------- /public/image/contributor/scn.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ba-archive/blue-archive-story-viewer/9d6055ebc22ab9a052ae13df0205ce85653bde0f/public/image/contributor/scn.webp -------------------------------------------------------------------------------- /public/image/contributor/shinonomesetsuna.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ba-archive/blue-archive-story-viewer/9d6055ebc22ab9a052ae13df0205ce85653bde0f/public/image/contributor/shinonomesetsuna.webp -------------------------------------------------------------------------------- /public/image/contributor/takanasichi.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ba-archive/blue-archive-story-viewer/9d6055ebc22ab9a052ae13df0205ce85653bde0f/public/image/contributor/takanasichi.webp -------------------------------------------------------------------------------- /public/image/contributor/tiramisu.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ba-archive/blue-archive-story-viewer/9d6055ebc22ab9a052ae13df0205ce85653bde0f/public/image/contributor/tiramisu.webp -------------------------------------------------------------------------------- /public/image/contributor/unique.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ba-archive/blue-archive-story-viewer/9d6055ebc22ab9a052ae13df0205ce85653bde0f/public/image/contributor/unique.webp -------------------------------------------------------------------------------- /public/image/contributor/violenza.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ba-archive/blue-archive-story-viewer/9d6055ebc22ab9a052ae13df0205ce85653bde0f/public/image/contributor/violenza.webp -------------------------------------------------------------------------------- /public/image/contributor/xiaofeitm233.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ba-archive/blue-archive-story-viewer/9d6055ebc22ab9a052ae13df0205ce85653bde0f/public/image/contributor/xiaofeitm233.webp -------------------------------------------------------------------------------- /public/image/contributor/xingkongruoxi.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ba-archive/blue-archive-story-viewer/9d6055ebc22ab9a052ae13df0205ce85653bde0f/public/image/contributor/xingkongruoxi.webp -------------------------------------------------------------------------------- /public/image/contributor/xingzhiyunlv.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ba-archive/blue-archive-story-viewer/9d6055ebc22ab9a052ae13df0205ce85653bde0f/public/image/contributor/xingzhiyunlv.webp -------------------------------------------------------------------------------- /public/image/contributor/zixunzhan.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ba-archive/blue-archive-story-viewer/9d6055ebc22ab9a052ae13df0205ce85653bde0f/public/image/contributor/zixunzhan.webp -------------------------------------------------------------------------------- /public/image/homescreen/background-dark.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ba-archive/blue-archive-story-viewer/9d6055ebc22ab9a052ae13df0205ce85653bde0f/public/image/homescreen/background-dark.webp -------------------------------------------------------------------------------- /public/image/homescreen/background.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ba-archive/blue-archive-story-viewer/9d6055ebc22ab9a052ae13df0205ce85653bde0f/public/image/homescreen/background.webp -------------------------------------------------------------------------------- /public/image/menu/afterclass_sweets.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ba-archive/blue-archive-story-viewer/9d6055ebc22ab9a052ae13df0205ce85653bde0f/public/image/menu/afterclass_sweets.webp -------------------------------------------------------------------------------- /public/image/menu/gehenna.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ba-archive/blue-archive-story-viewer/9d6055ebc22ab9a052ae13df0205ce85653bde0f/public/image/menu/gehenna.webp -------------------------------------------------------------------------------- /public/image/menu/sanctum_tower.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ba-archive/blue-archive-story-viewer/9d6055ebc22ab9a052ae13df0205ce85653bde0f/public/image/menu/sanctum_tower.webp -------------------------------------------------------------------------------- /public/image/menu/shiroko.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ba-archive/blue-archive-story-viewer/9d6055ebc22ab9a052ae13df0205ce85653bde0f/public/image/menu/shiroko.webp -------------------------------------------------------------------------------- /public/image/story_cover/eden_treaty.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ba-archive/blue-archive-story-viewer/9d6055ebc22ab9a052ae13df0205ce85653bde0f/public/image/story_cover/eden_treaty.webp -------------------------------------------------------------------------------- /public/image/story_cover/prologue.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ba-archive/blue-archive-story-viewer/9d6055ebc22ab9a052ae13df0205ce85653bde0f/public/image/story_cover/prologue.webp -------------------------------------------------------------------------------- /public/story/favor/10020/index.yml: -------------------------------------------------------------------------------- 1 | id: 10020 2 | abstracts: 3 | - groupId: 100202 4 | title: 5 | TextJp: 何考えてるの? 6 | TextCn: 你想什么呢? 7 | TextKr: 무슨 생각을 하는 거야? 8 | TextEn: What Are You Thinking About? 9 | TextTh: คิดอะไรอยู่งั้นเหรอ? 10 | TextTw: 在想什麼呢? 11 | abstract: 12 | TextCn: “有问题想问老师”……小春这么说着,把老师叫了出来。然而她同往常一样总是自顾自地在脑中加速自己的妄想,就这样不知道跑到哪里去了。 13 | TextJp: 聞きたいことがあって……と先生を呼び出したコハルだったが、いつも通りに勝手な妄想が加速してしまい、そのままどこかへと行ってしまうのだった。 14 | TextKr: 공부를 핑계로 선생님을 불러낸 코하루. 그러나 오히려 스스로 황당한 오해와 의심을 만들어내며 달아나 버린다. 15 | TextEn: Koharu calls Sensei for study help but ends up running away after creating an absurd misunderstanding entirely in her own head. 16 | TextTh: โคฮารุเรียกคุณครูออกมาเพราะเธออยากจะเรียน แต่ว่าจู่ๆ เธอก็กลับวิ่ง\nหนีไปหลังจากเข้าใจผิดและทำเรื่องที่น่าสงสัยเอาไว้ 17 | TextTw: 小春以讀書為由把老師叫了出來,但反而自己製造出荒唐的誤會和令人起疑的窘境而逃之夭夭。 18 | - groupId: 100203 19 | title: 20 | TextCn: 你说什么呢? 21 | TextKr: 무슨 소릴 하는 거야? 22 | TextJp: 何言ってるの? 23 | TextTh: พูดอะไรน่ะ? 24 | TextTw: 在說什麼呢? 25 | TextEn: What Are You Talking About? 26 | abstract: 27 | TextCn: 对小春在MomoTalk里的举止感到担忧,老师来到了圣三一。看到老师后的小春百感交集,态度也渐渐变得奇怪起来。当其他学生离开后,小春逐渐恢复了冷静,再次像往常一样放飞了她的妄想。 28 | TextKr: 다른 학생들과 함께하는 곳에서의 코하루는 너무나도 조용하고 소심하다. 하지만 선생님과 단 둘이 남게 되자, 본래의 모습으로 돌아가 망상을 폭주시킨다. 29 | TextJp: >- 30 | モモトークでのやり取りが気になって先生がトリニティを訪れると、色んな感情がない交ぜになってコハルはやや変な態度になってしまう。周囲の生徒がいなくなる頃には徐々に落ち着きを取り戻し、またいつものように妄想を爆発させるのだった。 31 | TextTh: >- 32 | เมื่ออยู่ในที่ที่มีเด็กนักเรียนคนอื่นอยู่ด้วย 33 | โคฮารุจะเงียบขรึมและขี้อายมาก 34 | 35 | แต่หากอยู่สองคนตามลำพังกับคุณครู เธอจะเผยให้เห็นความสดใส 36 | 37 | และความสนุกสนานของเธอออกมา 38 | TextTw: 和其他學生共處一處的小春極其安靜且膽小。但是到了和老師兩人獨處的時候,就會恢復本性讓妄想暴走。 39 | TextEn: >- 40 | Koharu is very quiet and timid when she's around other students. However, 41 | when left alone with Sensei, she reveals her true colors and her delusions 42 | run wild. 43 | - groupId: 100205 44 | title: 45 | TextCn: 你有什么事? 46 | TextKr: 무슨 용무로 부른 거야? 47 | TextJp: 何の用? 48 | TextTh: เรียกมามีธุระอะไร? 49 | TextTw: 有什麼事? 50 | TextEn: What Can I Do for You? 51 | abstract: 52 | TextCn: “我得监督老师”,小春这么说着把老师叫了出来,然后告诉老师她希望老师能帮她学习。结果在这个过程中,她从书包里拿出了一本黄书。 53 | TextKr: 선생님을 감시하겠다며 공부를 빌미로 불러낸 코하루. 그러나 오히려 선생님에게 자신의 불건전한 책을 들키고 만다. 54 | TextJp: >- 55 | 私が監視しておかないと、と先生を呼び出したコハル。一応勉強も見てもらいたくて、と先生に告げて教えてもらっていたものの、その流れで彼女はカバンの中からエッチな本を取り出してしまう。 56 | TextTh: |- 57 | โคฮารุใช้เรื่องเรียนเป็นข้ออ้างเพื่อที่จะติดตามคุณครู แต่ว่าคุณครูกลับพบ 58 | เรื่องลับๆ ที่เขียนเกี่ยวกับตัวเองเอาไว้ 59 | TextTw: 說要感謝老師,以讀書為由把老師叫出來的小春。結果卻反而被老師發現自己持有不健康的書。 60 | TextEn: >- 61 | Koharu summons Sensei under the pretext of studying and announces that 62 | Sensei needs to be monitored. However, Sensei finds an unwholesome book of 63 | hers. 64 | - groupId: 100206 65 | title: 66 | TextCn: 你想干什么? 67 | TextKr: 무슨 짓을 하는 거야? 68 | TextJp: 何するつもり? 69 | TextTh: 'ทำอะไรน่ะ? ' 70 | TextTw: 打算做什麼? 71 | TextEn: 'What Are You Doing? ' 72 | abstract: 73 | TextCn: 尽管快要累倒了,但老师看到小春的联络后依然前往了圣三一。小春给了老师一些零食作为辅导她学习的感谢,但在这之后,她的妄想像往常一样加速起来。这时,老师靠近了她的身边……。 74 | TextKr: '피로로 지친 선생님을 불러낸 코하루는 평소처럼 선생님을 질타하지만, 피로에 지친 선생님의 모습을 보며 뇌내 망상이 폭주하기 시작한다.' 75 | TextJp: >- 76 | 疲労で今にも倒れそうな状態だったものの、コハルの連絡を受けてトリニティへと向かう先生。コハルから勉強を見てもらったお礼に、とお菓子を貰うものの、そこからいつものように彼女の妄想が加速。先生はそんな彼女のそばに近づき……。 77 | TextTh: |- 78 | โคฮารุเรียกคุณครูที่กำลังเหน็ดเหนื่อยออกมาและบ่นคุณครูเหมือนอย่าง 79 | ทุกที แต่พอเธอได้เห็นสภาพที่อิดโรยของคุณครู เธอก็เริ่มจินตนาการ 80 | ภาพในหัวไปต่างๆ นาๆ 81 | TextTw: 把筋疲力盡的老師叫出來的小春,雖然和平常一樣斥責老師,但是看到老師筋疲力盡的樣子,她腦中的妄想就開始暴走了。 82 | TextEn: >- 83 | Koharu summons an exhausted Sensei for another scolding but seeing how 84 | exhausted Sensei is causes her delusions to run wild. 85 | -------------------------------------------------------------------------------- /public/story/favor/10032/index.yml: -------------------------------------------------------------------------------- 1 | id: 10053 2 | abstracts: 3 | - groupId: 100322 4 | title: 5 | TextCn: 为老师准备的礼物 6 | TextJp: 先生のためにプレゼント 7 | TextKr: '' 8 | TextEn: '' 9 | TextTh: '' 10 | TextTw: '' 11 | abstract: 12 | TextCn: 新年伊始,穿着和服的睦月出现在熟睡的老师身边。睦月给老师送来了年节菜,但里面装的却是一颗定时炸弹!老师苦恼于要剪断哪根线,但是倒计时已经无情地结束了……? 13 | TextJp: 年明け早々熟睡していた先生の元に、着物姿のムツキが現れる。そんなムツキからおせちを受け取る先生だったが、その中身は時限爆弾だった!どちらの線を切るべきか悩む先生、しかし無情にもタイムアップが告げられて……? 14 | TextKr: '' 15 | TextEn: '' 16 | TextTw: '' 17 | - groupId: 100323 18 | title: 19 | TextCn: 正月就要有正月的样子! 20 | TextJp: 正月には正月らしく! 21 | TextKr: '' 22 | TextEn: '' 23 | TextTh: '' 24 | TextTw: '' 25 | abstract: 26 | TextJp: 絵馬にお願い事を書くため、先生はムツキと外へ出かけることに。人混みを抜けてようやく書き始めた先生の絵馬を、ムツキが横から楽しそうに奪い取ってしまう。逆にムツキの方は何も願い事を書いておらず、それならばと先生が代わりに書いてあげるという流れに。 27 | TextCn: 老师决定和睦月一起去神社,在绘马上写下自己的愿望。穿过人群后,老师终于开始写下愿望,但绘马却被睦月从旁边开心地抢走了。然而,睦月自己并没有写下愿望,于是老师代替她写了一个。 28 | TextKr: '' 29 | TextEn: '' 30 | TextTw: '' 31 | - groupId: 100325 32 | title: 33 | TextCn: 激烈的战斗 34 | TextJp: 激しい戦い 35 | TextKr: '' 36 | TextEn: '' 37 | TextTh: '' 38 | TextTw: '' 39 | abstract: 40 | TextJp: ムツキから呼び出しを受けて先生が約束の場所へ向かうと、突然「羽根つき」が始まることに。「負けた方は勝った方の言うことを何でもひとつ聞く」というルールの下、ムツキはいつも通り楽しそうに勝負を始めるのだが……? 41 | TextCn: 被睦月叫出门的老师前往约定地点,睦月突然要和老师打“板羽球”。在“输的人必须听从赢家的任何要求”的规则下,睦月和往常一样兴高采烈地开始了比赛,不过……? 42 | TextKr: '' 43 | TextEn: '' 44 | TextTw: '' 45 | -------------------------------------------------------------------------------- /public/story/favor/10053/index.yml: -------------------------------------------------------------------------------- 1 | id: 10053 2 | abstracts: 3 | - groupId: 100532 4 | title: 5 | TextCn: 晨跑 6 | TextJp: 朝のジョギング 7 | TextKr: 아침 조깅 8 | TextEn: '' 9 | TextTh: '' 10 | TextTw: '' 11 | abstract: 12 | TextCn: 早上,在公园散步的老师偶然间遇到了优香。在询问之后,得知优香正在为了即将举行的晄轮大祭锻炼。老师与优香一起跑步,没过多久优香的体力就不足了。看着深受打击的优香,老师笑着建议她先从慢跑开始。 13 | TextJp: 早朝、散歩をしていると公園でユウカと偶然出会った先生。聞くと、もうすぐ行われる晄輪大祭に向けて体力づくりをしているのだとか。ユウカと共にランニングをすると、ユウカはすぐに体力が切れてしまう。ショックを受けている彼女に対し、先生はまずはジョギングから始めていこうと笑いかけるのだった。 14 | TextKr: 이른 아침, 공원 산책로에서 조깅 중인 유우카를 만난 선생님. 유우카는 밀레니엄에서 주관하는 대운동회를 대비해 특훈을 준비하고 있었다. 지구력만큼은 자신 있다고 말하는 유우카. 하지만 그 호언장담과는 달리 유우카의 체력은 금방 바닥나고 만다. 15 | TextEn: '' 16 | TextTw: '' 17 | -------------------------------------------------------------------------------- /public/story/favor/10063/index.yml: -------------------------------------------------------------------------------- 1 | id: 10053 2 | abstracts: 3 | - groupId: 100632 4 | title: 5 | TextCn: 禁闭室的住客 6 | TextJp: 反省部屋の住人 7 | TextKr: '' 8 | TextEn: '' 9 | TextTh: '' 10 | TextTw: 禁閉室的住民 11 | abstract: 12 | TextCn: 访问千年的老师见到了禁闭室里的小雪。本以为小雪会在狭小的房间里生活,没想到小雪把禁闭室装饰成了自己喜欢的样子,过得很舒服。 13 | TextJp: ミレニアムを訪れた先生は反省部屋のコユキを訪れる。窮屈な暮らしをしているかと思ったコユキは、むしろ反省部屋を自分好みに飾りつけて寛いでいるのだった。 14 | TextKr: '' 15 | TextEn: '' 16 | TextTw: 前去訪問千年學園的老師見到了待在禁閉室的小雪。本以為小雪會生活地很不自在,沒想到小雪反而把禁閉室裝飾成自己喜歡的樣子,過得很舒適。 17 | - groupId: 100633 18 | title: 19 | TextCn: 潘多拉的魔盒(1) 20 | TextJp: パンドラの箱(1) 21 | TextKr: '' 22 | TextEn: '' 23 | TextTh: '' 24 | TextTw: 潘朵拉的盒子(1) 25 | abstract: 26 | TextJp: シャーレ当番になったコユキは、今までパスワードを解除する作業ばかりしていたのだとこぼす。シャーレでも同じようにパスワードを解除すればいいのかと問いかけるコユキに、むしろシャーレのパスワードは解除しないでほしいとお願いする先生。その言葉を聞いて、いいことを思いついたとコユキはほくそ笑みながらミレニアムに戻っていくのだった。 27 | TextCn: 在夏莱值班的小雪对老师发牢骚说她直到现在只能做解除密码的工作。小雪询问老师在夏莱是不是也只要做解除密码的活就好了,老师却拜托小雪不要解除夏莱的密码。听到这样的话,小雪仿佛想到了什么好事一样暗自窃喜,然后回到了千年。 28 | TextKr: '' 29 | TextEn: '' 30 | TextTw: 在夏萊當值日生的小雪對老師發牢騷說她直到現在都是在做解鎖密碼的工作。小雪詢問老師在夏萊是不是也只要做同樣的事就好了,老師卻請求小雪不要這麼做。聽到了這番話,小雪彷彿想到了什麼好事一樣暗自竊喜,回到了千年學園。 31 | - groupId: 100635 32 | title: 33 | TextCn: 潘多拉的魔盒(2) 34 | TextJp: パンドラの箱(2) 35 | TextKr: '' 36 | TextEn: '' 37 | TextTh: '' 38 | TextTw: 潘朵拉的盒子(2) 39 | abstract: 40 | TextJp: シャーレに潜入したコユキは、シャーレの秘密に触れようとするも、先生に見つかってしまう。そうしてシャーレ居住区に逃走したコユキは、そこで「不思議な本」を発見するのだった。 41 | TextCn: 偷偷潜入夏莱的小雪想要接触夏莱的秘密,却被老师发现了。小雪于是逃到了夏莱居住区,在那里发现了一本“奇怪的书”。 42 | TextKr: '' 43 | TextEn: '' 44 | TextTw: 偷偷潛入夏萊的小雪想要接觸夏萊的秘密,卻被老師發現了。小雪逃到了夏萊的居住區,卻在那裡發現了一本“奇怪的書”。 45 | - groupId: 100636 46 | title: 47 | TextCn: 日常举止 48 | TextJp: 日頃の行い 49 | TextKr: '' 50 | TextEn: '' 51 | TextTh: '' 52 | TextTw: 平日的行為舉止 53 | abstract: 54 | TextJp: 先生は、偶然ゲームセンターでコユキを見かける。ゲームが好きなのかと問うと、自分の能力が関係ない運が絡むものが好きなのだと答えるコユキ。日頃の行いが良ければ運も良いはずだ、と話した二人はゲームセンターで対戦ゲームを楽しむのだった。 55 | TextCn: 老师偶然在游戏中心遇到了小雪。当被问到喜不喜欢游戏的时候,小雪答道喜欢与自身能力没有关系而是与运气相关的游戏。老师说日常的举止越好,运气就越好,于是二人在游戏中心玩了一会儿对战类游戏。 56 | TextKr: '' 57 | TextEn: '' 58 | TextTw: 老師偶然在遊戲中心遇見了小雪。被問到喜不喜歡遊戲時,小雪回應喜歡與自身能力無關,而是跟運氣有關的遊戲。老師說平日的行為舉止越好,運氣就越好,於是兩人在遊戲中心玩了一會對戰類遊戲。 59 | - groupId: 100638 60 | title: 61 | TextCn: 幸运之证 62 | TextJp: 幸運の証 63 | TextKr: '' 64 | TextEn: '' 65 | TextTh: '' 66 | TextTw: 幸運的證明 67 | abstract: 68 | TextJp: 草むらでしゃがんでいるコユキを見つけた先生。コユキは運がよくなるかもしれないという希望を持ちながら四つ葉のクローバーを探していた。そうして、先生とコユキは二人で四つ葉のクローバー探しを楽しむのだった。 69 | TextCn: 老师发现了蹲在草丛中的小雪。小雪希望自己的运气会变好,所以在寻找四叶草。于是,老师和小雪二人一起享受了寻找四叶草的过程。 70 | TextKr: '' 71 | TextEn: '' 72 | TextTw: 老師發現了蹲在草叢裡的小雪。小雪正在尋找或許能讓自己運氣變好的幸運草。於是老師和小雪一起享受了尋找幸運草的過程 73 | -------------------------------------------------------------------------------- /public/story/favor/10064/index.yml: -------------------------------------------------------------------------------- 1 | id: 10064 2 | abstracts: 3 | - groupId: 100642 4 | title: 5 | TextCn: 加深的误解 6 | TextJp: 深まる誤解 7 | TextKr: 또 다른 오해 8 | TextEn: '' 9 | TextTh: '' 10 | TextTw: 加深的誤解 11 | abstract: 12 | TextCn: 为了购买新的和服,佳代子到访了一家和服店。但她与店员的对话仿佛对牛弹琴,佳代子感到十分困惑。幸好路过的老师出手帮忙,佳代子终于成功购买到了她心仪的和服。 13 | TextKr: >- 14 | 우연히 가게에서 기모노를 구매하는 카요코를 발견한 선생님. 가게 점원은 카요코를 암흑가 조직의 높은 사람으로 착각하고 곤란해하고 15 | 있었다. 선생님은 점원의 오해를 풀어준 뒤 카요코에게 잘 어울리는 기모노를 추천해준다. 16 | TextJp: >- 17 | 着物を新調すべくお店を訪れていたカヨコは、店員とのかみ合わない会話に困惑していた。通りすがりの先生がとりなしてくれたお陰で、カヨコは目当ての着物を買うことができたのだった。 18 | TextEn: '' 19 | TextTh: '' 20 | TextTw: '' 21 | - groupId: 100643 22 | title: 23 | TextJp: 新年の鐘音 24 | TextCn: 新年的钟声 25 | TextKr: 새해의 종소리 26 | TextEn: '' 27 | TextTh: '' 28 | TextTw: 新年鐘聲 29 | abstract: 30 | TextCn: 除夕夜,老师与佳代子一起去听除夕敲钟。然而,由于钟正在维修中,二人的计划落空了……回家路上,二人聆听着第一班电车经过铁路道口的声音,迎接新的一年的到来。 31 | TextKr: >- 32 | 한 해의 마지막 날, 타종 행사에 참여하기 위해 사찰을 찾은 선생님과 카요코. 하지만 안타깝게도 종루의 상태가 좋지 못하여 행사는 33 | 취소된 상태였다. 돌아오는 길에 막차를 놓친 선생님과 카요코는 정거장에서 첫차가 들어오는 신호 종소리를 들으며 새해를 맞는다. 34 | TextJp: >- 35 | 大晦日、除夜の鐘を聞きに来た先生とカヨコ。しかし、鐘の修理中だったため、聞くことは叶わず……帰り道、始発電車の踏切の音を聞きながら新年を迎えるのだった。 36 | TextTh: '' 37 | TextTw: '' 38 | TextEn: '' 39 | - groupId: 100645 40 | title: 41 | TextCn: 猫与佳代子与甜酒与 42 | TextJp: 猫とカヨコと甘酒と 43 | TextKr: 감주와 고양이 44 | TextEn: '' 45 | TextTh: '' 46 | TextTw: 貓,佳代子,甜酒 47 | abstract: 48 | TextCn: 和老师去买护身符的佳代子和老师,为了暖和一下冷了的身体决定喝点甜酒。二人聊到每年都会有学生因为甜酒中微量的酒精而醉倒的事情时,佳代子被猫的声音吸引而离开了。过了一会儿,老师开始担心佳代子,决定去找她,却看到她在模仿猫的声音玩耍的可爱模样。佳代子被老师看到后有些尴尬,于是将这一切都归咎于甜酒。 49 | TextKr: >- 50 | 부적을 사기 위해 사찰을 방문한 선생님과 카요코. 둘은 추운 몸을 덥히기 위해 따듯한 감주를 마신다. 그때, 어디선가 들려 온 51 | 고양이의 울음소리에 카요코는 잠시 자리를 비우고, 뒤늦게 카요코를 뒤따라간 선생님은 고양이와 함께 즐겁게 놀고 있는 카요코의 모습을 52 | 발견한다. 53 | TextJp: >- 54 | お守りを買いにきたカヨコと先生は、冷えてしまった身体を温めるべく甘酒を飲むことに。甘酒の少量のアルコールで酔う生徒が毎年出るという話をしながら、カヨコは猫の声に惹かれて席を少し外す。しばらく待っても帰ってこないカヨコを心配して見に行くと、そこには猫の声真似をしながら可愛く遊んでいるカヨコの姿が。先生に見られてバツが悪くなったカヨコは、これも甘酒のせいだと誤魔化すのだった。 55 | TextTh: '' 56 | TextTw: '' 57 | TextEn: '' 58 | - groupId: 100646 59 | title: 60 | TextJp: ストレス解消法 61 | TextCn: 压力消除法 62 | TextKr: 스트레스 해소법 63 | TextEn: '' 64 | TextTh: '' 65 | TextTw: 消除壓力法 66 | abstract: 67 | TextCn: 新年伊始,老师忙于应对各种学生的咨询,一直在四处奔走。为了让老师稍微放松一下,佳代子带老师去听了一场和乐器的现场演出。听到和乐器这个名字,老师想象了一幅雅乐般的平和画面,但实际上现场却响起了和式金属摇滚乐。 68 | TextKr: >- 69 | 새해 초부터 바쁜 시간을 보내는 선생님. 카요코는 지친 선생님을 위해 화악기 공연을 보러 가자고 권한다. 선생님은 평화로운 느낌의 70 | 화악기 공연을 기대하지만, 카요코가 소개한 공연은 강렬한 메탈 풍으로 어레인지된 화악기 공연이었다. 71 | TextJp: >- 72 | 新年早々、様々な生徒の相談に乗って奔走している先生。カヨコはそうやって忙しそうにしている先生の息抜きに、と和楽器のライブに連れ出してくれる。和楽器というからには雅楽のような穏やかなものを想像していた先生の前に、和ロックメタルの音が鳴り響くのだった。 73 | TextTh: '' 74 | TextTw: '' 75 | TextEn: '' 76 | -------------------------------------------------------------------------------- /public/story/favor/10065/index.yml: -------------------------------------------------------------------------------- 1 | id: 10065 2 | abstracts: 3 | - groupId: 100652 4 | title: 5 | TextCn: 百鬼夜行的宣传负责人,果穗同学 6 | TextJp: 百鬼夜行の広報担当、カホさん 7 | TextKr: 백귀야행의 홍보대사 카호 님 8 | TextEn: '' 9 | TextTh: '' 10 | TextTw: '' 11 | abstract: 12 | TextCn: 果穗突然给老师发消息,想和老师谈谈“那件事”。正当老师不知道是什么事情而感到困惑的时候,果穗开始了她关于百鬼夜行旅游产业的演讲。一同说明之后,老师又问起了关于“那件事”的事情。果穗表示她应该已经发送了电子邮件,然而老师并没有收到……老师安慰了白干一场的果穗,并请她重新进行演示。 13 | TextKr: >- 14 | 카호는 선생님에게 관광산업과 관련된 프레젠테이션을 진행하지만, 기대와 다른 선생님의 반응에 뒤늦게 업무 메일이 제대로 보내지지 15 | 않았다는 걸 깨닫는다. 죄송해하는 카호를 선생님이 위로하자, 카호는 기운을 차린 뒤 새로운 프레젠테이션을 시작한다. 16 | TextJp: >- 17 | 急にカホから「例の件」で相談があると連絡を受けた先生。一体何の事だろうと困惑する中、カホは百鬼夜行の観光産業についてのプレゼンを始める。一通りの説明が終わった頃に、「例の件」について改めて問うと、カホはメールを送ったはずだとこぼすも、メールは届いておらず……自身の空回りに気づいたカホをフォローし、改めてプレゼンをしてもらうのだった。 18 | TextEn: '' 19 | TextTh: '' 20 | TextTw: '' 21 | - groupId: 100653 22 | title: 23 | TextCn: 比部长更有部长风范的果穗同学 24 | TextKr: 부장님보다 더 부장님 다운 카호 님 25 | TextJp: 部長よりも部長らしいカホさん 26 | TextEn: '' 27 | TextTh: '' 28 | TextTw: '' 29 | abstract: 30 | TextCn: 为了挽回上次的失误,果穗主动提出要陪同老师参观百鬼夜行。果穗充满了干劲,然而被前来咨询各种问题的学生们缠住了。果穗因未能成功陪老师参观而感到沮丧,而老师则安慰了她。 31 | TextKr: >- 32 | 선생님은 음양부 부실에서 업무를 정리하고 있던 카호를 만난다. 카호는 선생님에게 백귀야행 학원을 소개해주기 위해 나서려던 찰나, 33 | 백귀야행 학생들이 들이닥치기 시작한다. 백귀야행 학생들의 일들을 해결하고 나니 저녁이 되어 결국 선생님의 에스코트는 다음으로 미루게 34 | 된다. 35 | TextJp: >- 36 | 前回の挽回をすべく、先生をエスコートしたいと申し出るカホ。百鬼夜行連合学院の中を案内すると張り切っているカホの前に、生徒から様々な相談が舞い込んでしまう。うまくエスコートができなかったと落ち込むカホを先生は慰めるのだった。 37 | TextTh: '' 38 | TextTw: '' 39 | TextEn: '' 40 | - groupId: 100655 41 | title: 42 | TextCn: 果穗同学的完美随行 43 | TextKr: 카호 님의 완벽한 에스코트 44 | TextJp: カホさんの完璧なエスコート 45 | TextEn: '' 46 | TextTh: '' 47 | TextTw: '' 48 | abstract: 49 | TextCn: 为了一雪前耻,果穗再次邀请老师参观百鬼夜行。这次没有被任何事情干扰的果穗兴致勃勃地全力介绍着旅游景点和百鬼夜行的魅力,老师也享受着与果穗的约会。 50 | TextKr: >- 51 | 카호는 지난번의 실수를 만회하고자 다시 한번 선생님을 백귀야행으로 초대한다. 카호는 백귀야행의 매력을 소개하지만 여러 유혹에 흔들리게 52 | 된다. 어느덧 저녁이 되고 선생님은 카호와의 데이트에 즐거워한다. 53 | TextJp: >- 54 | カホは前回のリベンジに、ともう一度先生を百鬼夜行に招待する。今度は邪魔が入ることもなく観光スポットや百鬼夜行の魅力を楽しそうに全力で紹介する姿に、先生もカホとのデートを楽しむのだった。 55 | TextTh: '' 56 | TextTw: '' 57 | TextEn: '' 58 | - groupId: 100656 59 | title: 60 | TextCn: 果穗同学有计划的营业战略 61 | TextKr: 카호 님의 진정한 영업전략 62 | TextJp: カホさんの計画的な営業戦略 63 | TextEn: '' 64 | TextTh: '' 65 | TextTw: '' 66 | abstract: 67 | TextCn: 接到果穗的联络而前往阴阳部休息室的老师,遇到了正在整理特别订购的宣传用周边的果穗。 68 | TextKr: '카호의 연락에 음양부 휴게실을 방문한 선생님은, 그곳에서 특별 발주한 홍보용 굿즈를 정리하고 있는 카호와 만난다.' 69 | TextJp: カホから連絡を受け、陰陽部の休憩室を訪れた先生は、そこで特別発注した広報用グッズをまとめているカホに出会うのだった。 70 | TextTh: '' 71 | TextTw: '' 72 | TextEn: '' 73 | -------------------------------------------------------------------------------- /public/story/favor/10066/index.yml: -------------------------------------------------------------------------------- 1 | id: 10066 2 | abstracts: 3 | - groupId: 100662 4 | title: 5 | TextCn: 女仆大危机! 6 | TextJp: メイド大ピンチ! 7 | TextKr: 메이드 대 핀치! 8 | TextEn: '' 9 | TextTh: '' 10 | TextTw: '' 11 | abstract: 12 | TextCn: 老师收到了爱丽丝发来的求救信号,并见到了身穿女仆装的爱丽丝。爱丽丝说所有的衣服都被洗掉了,所以她只能穿着这套服装。然而,爱丽丝对女仆装还有些抗拒,老师建议她“转职成为女仆就好了”。于是,成功转职的爱丽丝努力打扫房间,对女仆装的抵触感渐渐消失了。 13 | TextJp: アリスからSOSを受け取った先生は、メイド服姿のアリスと出会う。服をすべて洗濯してしまった関係で、これしか着る服がないのだと。しかし、メイド服にはまだ若干の抵抗があるというアリスに対し、先生は「メイドにジョブチェンジすればいい」とアドバイスをする。そうして、ジョブチェンジに成功したアリスは掃除に励み、メイド服への苦手意識を減らしていくのだった。 14 | TextKr: 아리스의 연락을 받고 황급히 게임개발부 부실로 향한 선생님. 일련의 사정으로 메이드복을 입고 정신적 고통을 호소하는 아리스를 위해, 선생님은 메이드복을 극복할 방법을 제안한다. 15 | TextEn: '' 16 | TextTw: '' 17 | - groupId: 100663 18 | title: 19 | TextCn: 女仆的学习大作战! 20 | TextJp: メイドお勉強大作戦! 21 | TextKr: 공부! 메이드 대작전! 22 | TextEn: '' 23 | TextTh: '' 24 | TextTw: '' 25 | abstract: 26 | TextJp: メイドレベルを上げると決めたアリスは、インターネットでメイドについて調べることに。様々なメイドの知識を手に入れたアリスは、レベルアップすることができそうだと笑うのだった。 27 | TextCn: 决定提升女仆技能等级的爱丽丝开始在互联网上搜索有关女仆的信息。获取了各种各样有关女仆的知识后,爱丽丝笑着表示自己的等级似乎可以提升了。 28 | TextKr: 아리스는 메이드 레벨을 올리기 위한 공부를 선언한다. 염려스러운 마음에 게임개발부 부실로 향한 선생님은, 올바른 매체로 메이드에 대해 공부할 수 있도록 아리스를 돕는다. 29 | TextEn: '' 30 | TextTw: '' 31 | - groupId: 100665 32 | title: 33 | TextCn: 出击准备完毕! 34 | TextJp: 出撃準備完了! 35 | TextKr: 출격 준비 완료! 36 | TextEn: '' 37 | TextTh: '' 38 | TextTw: '' 39 | abstract: 40 | TextJp: アリスから大事な話があると言われて、ミレニアムを訪れた先生。冒険に出かける準備を整えたアリスは、メイドレベルが十分にあがったから最強のメイド勇者を目指すと宣言するのだった。 41 | TextCn: 老师收到爱丽丝的信息说有重要事情要谈,于是前往千年。做好启程冒险准备的爱丽丝宣布,由于她的女仆等级已经足够高,她将追求成为最强的女仆勇者。 42 | TextKr: 중대한 소식을 전하고 싶다는 연락과 함께 선생님을 호출한 아리스. 도착한 장소에는 허둥지둥 메이드복으로 갈아입고 있는 아리스가 선생님을 반기고 있었다. 몸단장이 끝난 아리스는 최강의 메이드 용사가 되겠다는 선언과 함께 결의를 불태운다. 43 | TextEn: '' 44 | TextTw: '' 45 | -------------------------------------------------------------------------------- /public/story/favor/10067/index.yml: -------------------------------------------------------------------------------- 1 | id: 10067 2 | abstracts: 3 | - groupId: 100672 4 | title: 5 | TextCn: 理由之后再说 6 | TextJp: 理由は後から 7 | TextKr: 문제의 원인 8 | TextEn: '' 9 | TextTh: '' 10 | TextTw: '' 11 | abstract: 12 | TextCn: 老师决定与时一起进行潜入豪华游轮上的宴会的任务。穿着兔女郎服装的时引起了周围人的注意——而同行的老师则饱受周遭的冷眼。然而,时并不在意这些,并冷静地完成了任务。 13 | TextJp: トキと一緒に豪華クルーズ船で行われるパーティーの潜入任務をすることになった先生。バニーガール姿のトキに対し、周囲から注目が集まってしまい――同行者の先生は冷たい視線にさらされることに。しかし、トキは意に介さず任務を淡々と遂行するのだった。 14 | TextKr: 토키와 함께 호화 크루즈에 열리는 파티의 잠입 임무에 참여하게 된 선생님. 바니걸 복장을 한 토키와 동행하는 선생님은 주변으로부터 의혹의 눈초리를 받으며 정신적인 한계를 경험한다. 15 | TextEn: '' 16 | TextTw: '' 17 | - groupId: 100673 18 | title: 19 | TextCn: 兔女郎的传闻 20 | TextJp: バニーの噂 21 | TextKr: 존재의 이유 22 | TextEn: '' 23 | TextTh: '' 24 | TextTw: '' 25 | abstract: 26 | TextJp: バニー姿のトキがシャーレに入り浸っているせいで、シャーレの先生は生徒にバニー服を無理やり着せている変態だという噂が立ってしまう。先生は、トキにその事を相談するも、「人の噂も七十五日」と取り合ってくれず……今日も一日が終わるのだった。 27 | TextCn: 由于时整天泡在夏莱里,周遭传开了“夏莱的老师是个强迫学生穿着兔女郎装的变态”的传闻。先生向时谈起这件事,但时却不予理睬,并说“谣言这种东西,传着传着就会被人忘掉了”……于是,一天又结束了。 28 | TextKr: 생각하며 종일 집무실에서 상주하고 있는 것. 이 문제로 토키와 진지하게 이야기는 나누는 선생님. 하지만 별다른 소득은 얻지 못한다. 29 | TextEn: '' 30 | TextTw: '' 31 | - groupId: 100675 32 | title: 33 | TextCn: 放松心情的地方 34 | TextJp: 心休まる場所 35 | TextKr: 휴식의 장소 36 | TextEn: '' 37 | TextTh: '' 38 | TextTw: '' 39 | abstract: 40 | TextJp: トキから任務の通信が入ってくるも、途切れ途切れの上、返答はなく。ついに留守電メッセージしか返ってこなくなってしまう。トキの安否が心配になってしまった先生は、朝まで彼女を待つも、いつの間にかうたた寝してしまい――目が覚めると、そこには同じベッドで眠るトキの姿があった。 41 | TextCn: 老师接到了时关于任务的联络,但信号不佳,时一直没有回应,最后老师甚至只能收到时语音信箱的留言。由于担心时的安危,老师等她等到了清晨,但不知不觉却睡着了——当老师醒来时,发现时正与自己同床共眠。 42 | TextKr: 임무로 연락이 되지 않은 토키가 걱정되어, 뜬눈으로 밤을 지새운 선생님. 이내 아침이 밝아오고 선잠에서 눈을 뜬 선생님은 자신의 침대에서 바니걸 복장으로 곤히 자는 토키를 발견한다. 43 | TextEn: '' 44 | TextTw: '' 45 | -------------------------------------------------------------------------------- /public/story/favor/10068/index.yml: -------------------------------------------------------------------------------- 1 | id: 10068 2 | abstracts: 3 | - groupId: 100682 4 | title: 5 | TextCn: 早上好,玲纱 6 | TextJp: おはよう、レイサ 7 | TextKr: 안녕 레이사 8 | TextEn: '' 9 | TextTh: '' 10 | TextTw: '' 11 | abstract: 12 | TextCn: 老师在公交车站与玲纱偶遇了。玲纱决定向老师咨询应该如何与同班友人之间进行交流。在得到老师“坦诚相待是最好的”的建议后,玲纱轻快地迈开脚步回家了。 13 | TextKr: 우연히 버스 정류장에서 레이사와 만난 선생님. 레이사는 자신을 편하게 대했으면 한다는 선생님의 배려에, 속마음을 터놓고 큰 힘을 얻는다. 14 | TextJp: 偶然バス停でレイサと出会った先生。レイサは、クラスの友人とのモモトークのやりとりについて先生に相談することに。自分に素直になって話すのが一番だというアドバイスを受けたレイサは、足取り軽く帰路につくのだった。 15 | TextEn: '' 16 | TextTh: '' 17 | TextTw: '' 18 | - groupId: 100683 19 | title: 20 | TextCn: 相信吧,玲纱 21 | TextKr: 믿어봐 레이사 22 | TextJp: 信じて、レイサ 23 | TextEn: '' 24 | TextTh: '' 25 | TextTw: '' 26 | abstract: 27 | TextCn: 玲纱来向老师咨询能够有效地从疲劳中恢复的方法。玲纱担心一旦自己拒绝他人的请求与邀约之后可能会对以后的关系产生影响,因此一直来者不拒。老师告诉玲纱,如果她这样勉强自己,周围的人会感到担心,并让她休息一下。 28 | TextKr: 피로회복에 관한 조언을 구하기 위해 샬레로 찾아온 레이사. 피곤한 모습이 역력한 레이사의 상태에, 선생님은 무리하지 않아도 괜찮다는 조언을 해준다. 29 | TextJp: 疲労回復に効果的な方法はないかと先生に相談しにきたレイサ。なんでも、他人に頼まれた事や遊びの誘いを断ると今後の関係に響いてしまう、と全てを引き受けているのだという。レイサがそうして無理をすると、周囲の人間が心配すると伝え、レイサに休息をとってもらうことに。 30 | TextTh: '' 31 | TextTw: '' 32 | TextEn: '' 33 | - groupId: 100685 34 | title: 35 | TextCn: 谢谢你,玲纱 36 | TextKr: 고마워 레이사 37 | TextJp: ありがとう、レイサ 38 | TextEn: '' 39 | TextTh: '' 40 | TextTw: '' 41 | abstract: 42 | TextCn: 作为对过去老师一直帮助自己的感谢,玲纱兴致勃勃地要陪伴老师。二人参观了咖啡厅、游戏中心和游乐园等地方,然而老师都已经去过一次了,玲纱感到十分沮丧。但当老师告诉玲纱自己是第一次和玲纱来,并且今天是非常重要的时刻时,她开心地笑了起来。 43 | TextKr: 그간 선생님께 받은 도움에 보답하고자 직접 에스코트를 나선 레이사. 함께 이곳저곳 다니며 정신없는 시간을 보내지만, 마음 한편으론 특별한 날을 만들어 드리지 못했다는 아쉬움이 남는다. 44 | TextJp: 今までのお礼として、先生をエスコートすると息巻くレイサ。カフェやゲームセンター、遊園地などを見て回るも、先生が既に一度来たことがあることに、レイサは落ち込んでいた。レイサと来るのは初めてで、今日はとても大切な時間だったと告げると、彼女は嬉しそうに笑うのだった。 45 | TextTh: '' 46 | TextTw: '' 47 | TextEn: '' 48 | - groupId: 100686 49 | title: 50 | TextCn: 做个好梦,玲纱 51 | TextKr: 잘 자 레이사 52 | TextJp: おやすみ、レイサ 53 | TextEn: '' 54 | TextTh: '' 55 | TextTw: '' 56 | abstract: 57 | TextCn: 老师与玲纱一同在深夜巡逻街道,听着玲纱分享她作为义警团成员的心情。二人一同眺望着日出的时候,玲纱开心地笑着说这是她第一次和别人一起欣赏日出。随后,老师背着由于缺乏睡眠已经走不稳路的玲纱,结束了早上的巡逻。 58 | TextKr: 선생님은 홀로 순찰 중인 레이사를 찾아 슬럼가로 향한다. 그곳에서 꾸벅꾸벅 졸고 있는 레이사를 발견한 선생님. 이윽고 서로의 졸음을 쫓으며 순찰을 함께한다. 아침이 되고, 레이사는 떠오르는 해를 바라보며 소중한 감상을 전한다. 59 | TextJp: 深夜のパトロールをしているレイサと共に街を歩く先生は、レイサの自警団としての気持ちを聞いていた。日の出を眺めながら、こうして誰かと二人で日の出をみるのは初めてだとレイサは嬉しそうに笑う。そうして、眠気で足取りが覚束ないレイサを抱えて、早朝のパトロールを終えるのだった。 60 | TextTh: '' 61 | TextTw: '' 62 | TextEn: '' 63 | -------------------------------------------------------------------------------- /public/story/favor/10069/index.yml: -------------------------------------------------------------------------------- 1 | id: 10069 2 | abstracts: 3 | - groupId: 100692 4 | title: 5 | TextCn: 尽情享用吧! 6 | TextKr: '많이 먹고 힘 내야지!' 7 | TextJp: たくさん召し上がれ! 8 | TextEn: '' 9 | TextTh: '' 10 | TextTw: '' 11 | abstract: 12 | TextCn: 因为有事情需要与老师相谈,瑠美到夏莱拜访老师。看着老师平日里忙于工作甚至没时间吃午饭,瑠美产生了危机感。她一边说着这样下去不好,一边站了起来,动手用夏莱存放的食材为老师做了一顿美食。 13 | TextKr: '개인적인 도움을 받기 위해 샬레에 찾아온 루미. 문제가 해결될 때까지 하루 동안 선생님을 지켜보던 루미는, 선생님의 불규칙적인 식생활에 매우 분노해버린다.' 14 | TextJp: 先生に相談がありシャーレを訪れたルミは、昼食も食べずに仕事をしている先生の生活に危機感を覚える。このままでは良くない、と立ち上がった彼女は、シャーレにあった食材で料理を振る舞ってくれるのだった。 15 | TextEn: '' 16 | TextTh: '' 17 | TextTw: '' 18 | - groupId: 100693 19 | title: 20 | TextCn: 先尝尝味道吧! 21 | TextKr: '일단 맛을 보고 평가해!' 22 | TextJp: まずは味見して! 23 | TextEn: '' 24 | TextTh: '' 25 | TextTw: '' 26 | abstract: 27 | TextCn: 被玄武商会委托品尝正在研发的料理的老师,一边接连品尝着端上来的料理,一边向瑠美反馈感想。平日里被瑠美用极为美味的料理款待的老师被瑠美的细致与努力打动,尽管已经吃得饱饱的,但试吃会还在继续。 28 | TextKr: '선생님은 루미의 시식 요청을 받고 현무상회에 방문한다. 그런데 선생님의 기대와 달리, 루미가 준비한 것은 대단히 혁신적인 요리들뿐이었다.' 29 | TextJp: 玄武商会で試作している料理の味見をしてほしいと頼まれた先生は、次々と出てくる料理を食べてはルミに感想を返していく。普段とても美味しい料理を振る舞ってくれるルミの、細やかな努力に胸を打たれながら、試食会はお腹がいっぱいになっても続くのだった。 30 | TextTh: '' 31 | TextTw: '' 32 | TextEn: '' 33 | - groupId: 100695 34 | title: 35 | TextCn: 服务业的烦恼 36 | TextKr: 손님 맞이는 힘든 법이야. 37 | TextJp: 接客業の悩み 38 | TextEn: '' 39 | TextTh: '' 40 | TextTw: '' 41 | abstract: 42 | TextCn: 完成了山海经的工作后,老师顺路经过玄武商会,恰巧目睹了瑠美处理客人投诉的场景。在这名投诉者身上,老师感到了些许违和,于是悄悄跟了上去……结果查明对方是瓦尔基里的案件记录中出现过的吃霸王餐的惯犯。就在这时瑠美出现,对投诉者降下了正义的制裁。 43 | TextKr: "업무를 마치고 현무상회에 방문한 선생님. 루미의 '주방장 추천 메뉴'를 대접받으려는 찰나, 반갑지 않은 진상 손님을 마주한다." 44 | TextJp: 山海経での仕事を終えて玄武商会に立ち寄った先生は、ルミがクレーマー対応をしている所に立ち会ってしまう。クレーマーに違和感を覚えた先生は、そっと後を尾け……相手がヴァルキューレの事件記録にいた無銭飲食常習犯である事を突き止める。そこにルミが現れ、クレーマーに正義の鉄槌を下すのだった。 45 | TextTh: '' 46 | TextTw: '' 47 | TextEn: '' 48 | - groupId: 100696 49 | title: 50 | TextCn: 不介意的哟? 51 | TextKr: '아무려면 어때!' 52 | TextJp: 気にしてないよ? 53 | TextEn: '' 54 | TextTh: '' 55 | TextTw: '' 56 | abstract: 57 | TextCn: 老师被告知今天是玄武商会大量蒸饺子的日子,为了参观而前去拜访瑠美。在如同浴室一般蒸气弥漫的厨房中,老师意外目睹了瑠美的另一面。 58 | TextKr: 현무상회에서 만두를 대량으로 조리하는 특별한 날. 그 과정을 구경하고 싶었던 선생님은 루미를 찾아간다. 하지만 만두 외의 뜻밖의 구경거리도 보게 된다. 59 | TextJp: 今日は玄武商会で餃子を大量に蒸す日だと連絡を受けた先生は、その過程を見学すべくルミの元を訪れる。厨房は蒸気に満ち溢れたサウナのようになってしまっており、先生はルミの意外な姿を目撃してしまうのだった。 60 | TextTh: '' 61 | TextTw: '' 62 | TextEn: '' 63 | -------------------------------------------------------------------------------- /public/story/favor/10070/index.yml: -------------------------------------------------------------------------------- 1 | id: 10070 2 | abstracts: 3 | - groupId: 100702 4 | title: 5 | TextCn: 第一印象 6 | TextKr: 첫 인상 7 | TextJp: 第一印象 8 | TextEn: '' 9 | TextTh: '' 10 | TextTw: '' 11 | abstract: 12 | TextCn: 初次来夏莱值日的弥奈因为兴致过于高涨,在夏莱门前对自己应该用何种方式登场过于犹豫不决,结果迟到了。重新振作精神的弥奈本想开始自己的工作,却因为初次见面想要和老师确定一下二人之间的称呼方式,和老师就此话题进行了一次认真讨论。 13 | TextKr: '야심찬 선언과 달리 첫 당번 일부터 지각을 해버리고 만 미나. 첫 단추를 잘못 꿰였기 때문인지, 미나의 당번 활동은 예상치 못한 방향으로 흘러간다.' 14 | TextJp: 初めてのシャーレ当番を張り切りすぎてしまったミナは、扉の前で初登場の仕方について悩みすぎて遅刻してしまう。気を取り直して、当番を始めようとするものの、初当番にあたって先生との呼び名を決めたいと話すミナと、互いにどのような呼び方をするか真剣に話し合うのだった。 15 | TextEn: '' 16 | TextTh: '' 17 | TextTw: '' 18 | - groupId: 100703 19 | title: 20 | TextCn: 练习竖笛 21 | TextKr: 리코더 연습 22 | TextJp: リコーダーの練習 23 | TextEn: '' 24 | TextTh: '' 25 | TextTw: '' 26 | abstract: 27 | TextCn: 与弥奈一同参加玄龙门的治安维持活动的老师,对于吹着竖笛突然出现在自己面前的弥奈感到十分惊讶。原来弥奈之前看过的一部电影里同事在牺牲时吹奏单簧管的场面深深触动了她的心灵,所以弥奈想要效仿。就这样,弥奈奇特的竖笛演奏成为了山海经茶余饭后的谈资。 28 | TextKr: '현룡문의 집행부장 미나는 언제나 산해경의 치안 유지에 불철주야 노력한다. 타의 모범이 될 행동이지만, 그 활동에는 뭔가 독특한 취향이 깃든 듯하다.' 29 | TextJp: ミナと共に玄龍門の治安維持活動をする事になった先生は、突如としてリコーダーを演奏しながら登場するミナに面食らってしまう。曰く、以前見た映画で同僚が死ぬ時にクラリネットを演奏する姿に胸を打たれたから、自分も真似をするのだとか。斯くして、ミナの珍妙なリコーダーの演奏は、山海経の噂になってしまうのだった。 30 | TextTh: '' 31 | TextTw: '' 32 | TextEn: '' 33 | - groupId: 100705 34 | title: 35 | TextCn: 落雨时的天色 36 | TextKr: 비 내리는 날의 느와르 37 | TextJp: 雨空の色 38 | TextEn: '' 39 | TextTh: '' 40 | TextTw: '' 41 | abstract: 42 | TextCn: 在山海经结束工作准备回家的老师,被突如其来的大雨淋湿了。就在这时,撑着伞的弥奈出现在老师面前。弥奈说自己很喜欢雨天的景色,轻柔地打破了僵硬的氛围。 43 | TextKr: '산해경에서 공무를 마치고 나오던 선생님은 갑작스러운 소나기를 맞는다. 우산이 없어 당황하던 차, 선생님의 앞에 우산을 든 미나가 나타난다.' 44 | TextJp: 山海経で公務を終えた先生は夕立に降られてしまう。そんな先生の前に、傘を持ったミナが現れ、雨の日の景色がとても好きなのだと、やわらかく相好を崩すのだった。 45 | TextTh: '' 46 | TextTw: '' 47 | TextEn: '' 48 | - groupId: 100706 49 | title: 50 | TextCn: 纵使时光流逝 51 | TextKr: 시간이 지나도 52 | TextJp: 時が経てども 53 | TextEn: '' 54 | TextTh: '' 55 | TextTw: '' 56 | abstract: 57 | TextCn: 老师和弥奈一起去梅花园见孩子们。专心照顾着孩子们的弥奈展现出了与平时的“黑道风格”截然不同的样子,露出开心的笑容并且乐在其中,让老师发现了弥奈的另一面。 58 | TextKr: "미나와 함께 매화원의 아이들을 만나러 간 선생님. '느와르'적인 평소 모습과 달리, 아이들과 잘 놀아주는 미나를 보며 선생님은 의외의 면을 본다." 59 | TextJp: ミナと共に梅花園の子供たちに会いに行った先生。先生は「ノワール」的な玄龍門で活動する普段とは異なり、子供たちの面倒をよく見て、楽しそうに笑うミナの姿に新しい一面を発見するのだった。 60 | TextTh: '' 61 | TextTw: '' 62 | TextEn: '' 63 | -------------------------------------------------------------------------------- /public/story/favor/20025/index.yml: -------------------------------------------------------------------------------- 1 | id: 20025 2 | abstracts: 3 | - groupId: 200252 4 | title: 5 | TextCn: 制作门松 6 | TextJp: 門松作り 7 | TextKr: '' 8 | TextEn: '' 9 | TextTh: '' 10 | TextTw: '' 11 | abstract: 12 | TextCn: 新年伊始,老师前去拜访遥香。遥香正在寻找合适的竹子制作门松来装饰事务所。老师与遥香一起寻找竹子却没找到,遥香感到十分沮丧。老师鼓励道给大家的这份心意也是很重要的。受到鼓励后的遥香开始制作门松,并与老师一起带回了事务所。 13 | TextJp: 新年を迎え、ハルカの元を訪れた先生。ハルカは事務所を飾る門松を自作すべく、竹を探していた。先生と共に竹を探しに行くもなかなか見つからず落ち込むハルカに、こういうのは気持ちが大事なのだと伝える。その言葉に励まされたハルカは、自作の門松を作り上げ、先生と共に事務所に持っていくのだった。 14 | TextKr: '' 15 | TextEn: '' 16 | TextTw: '' 17 | - groupId: 200253 18 | title: 19 | TextCn: 季节感 20 | TextJp: 季節感 21 | TextKr: '' 22 | TextEn: '' 23 | TextTh: '' 24 | TextTw: '' 25 | abstract: 26 | TextJp: 冬なのに短い着物を着ているハルカが気になった先生は、長い着物を買いに行こうとハルカを誘うも、買ってもらうのは申し訳ないと断られてしまう。それならば、と先生はスイーツを一緒に食べ、カイロを買ってあげるのだった。 27 | TextCn: 明明在冬天,遥香却穿着短和服,老师感到担心并想和遥香一起买一件长点的和服,遥香却拒绝了。于是,老师带着遥香一起吃了甜点,并给她买了暖宝宝。 28 | TextKr: '' 29 | TextEn: '' 30 | TextTw: '' 31 | - groupId: 200255 32 | title: 33 | TextCn: 刺骨的寒风与滚烫的心房 34 | TextJp: 冷たい風と、暖かい心 35 | TextKr: '' 36 | TextEn: '' 37 | TextTh: '' 38 | TextTw: '' 39 | abstract: 40 | TextJp: 気温が急激に下がった、寒い日の事。ハルカと雑草の様子が心配になった先生はハルカの元を訪れる。ちょうど雑草のお世話は終わったと話すハルカと共に、温かいスープを飲みに行くのだった。 41 | TextCn: 在气温急剧下降的寒冷的一天,老师担心遥香与她的杂草,于是前去看望遥香。和遥香一起照顾完杂草后,老师带着遥香一起去喝了热汤。 42 | TextKr: '' 43 | TextEn: '' 44 | TextTw: '' 45 | -------------------------------------------------------------------------------- /public/story/favor/26009/index.yml: -------------------------------------------------------------------------------- 1 | id: 26009 2 | abstracts: 3 | - groupId: 260092 4 | title: 5 | TextCn: 参考资料是……? 6 | TextJp: 参考資料は……? 7 | TextKr: 작업 레퍼런스 8 | TextEn: '' 9 | TextTh: '' 10 | TextTw: '' 11 | abstract: 12 | TextCn: 为了给新游戏提供参考资料,柚子自愿穿上了女仆装。然而,由于天生缺乏自信,躲在柜子里的她被老师发现了。了解情况后,老师鼓励了柚子。就在此时,前来游戏开发部活动室的千年学生看到了她的样子——柚子再次成为了柜子里的居民。 13 | TextJp: 新しいゲームの参考資料用にと自分でメイド服を着ることになったユズ。しかし、生来の自信のなさから、ロッカーに引きこもっているところを先生に見つけられる。事情を聞いた先生がユズを励ましていると、ユズを訪ねてきたミレニアム生にその姿を見られてしまい――ユズはまたロッカーの住人と化すのだった。 14 | TextKr: 유즈는 새로 개발 중인 게임의 레퍼런스 참조를 위해 메이드복을 입게 된다. 하지만 타고난 자신감이 부족한 탓에 자신은 모델로는 적합하지 않다며 불안을 드러낸다. 선생님은 기가 죽은 유즈가 기운을 낼 수 있도록 응원하며 특별한 조언을 해준다. 15 | TextEn: '' 16 | TextTw: '' 17 | - groupId: 260093 18 | title: 19 | TextCn: 新的兼职 20 | TextJp: 新しいアルバイト 21 | TextKr: 새로운 아르바이트 22 | TextEn: '' 23 | TextTh: '' 24 | TextTw: '' 25 | abstract: 26 | TextJp: 新作ゲームの開発費を得るためにバイトを始めたユズ。先生が行きつけのカフェを紹介するが――そこはメイドカフェだった。自分にメイドカフェの接客など難しいと嘆くユズに対し、先生は接客の練習に付き合うことに。 27 | TextCn: 柚子为了筹集新游戏的开发经费而开始打工。老师把柚子介绍给了他常去的咖啡咖啡厅——然而那里是一家女仆咖啡厅。柚子向老师抱怨让自己去女仆咖啡厅接待客人太难了,于是老师决定陪柚子一起练习接待技巧。 28 | TextKr: 샬레에서 한가로이 업무를 보던 선생님. 잠시 후 다급한 발소리와 함께 울상을 짓는 유즈가 샬레에 들어온다. 사연을 듣자하니 선생님이 주선해 준 아르바이트가 메이드 카페라는 사실을 깨닫고 카페에서 도망쳐 나온 것. 선생님은 유즈가 아르바이트에 잘 적응할 수 있도록 메이드 특훈을 제안한다. 29 | TextEn: '' 30 | TextTw: '' 31 | - groupId: 260095 32 | title: 33 | TextCn: 柜子中的不速之客 34 | TextJp: ロッカーの中の招かれざる客 35 | TextKr: 캐비닛 안의 불청객 36 | TextEn: '' 37 | TextTh: '' 38 | TextTw: '' 39 | abstract: 40 | TextJp: ユズのアルバイト中の様子を見にメイドカフェを訪れた先生。しかし、ユズは先生が来る事を意識しすぎたからか、普段ならしないミスを連発してしまう。その後、休憩から戻ってこないユズを探しに行くと、猫に囲まれた彼女を見つけ――先生に悩みを受け止めてもらい、晴れやかな笑顔で仕事に戻ったユズは、指名新記録を達成するのだった。 41 | TextCn: 老师去女仆咖啡厅看了柚子打工时的样子。然而,由于过于在意老师的到来,柚子频繁地犯下平时不会犯的错误。之后,老师去找休息时间结束后还没回来的柚子,发现她被一群猫咪围绕着——向老师倾诉烦恼并得到开解后的柚子满怀笑容地回到工作中,最终创下了被点名的新纪录。 42 | TextKr: 외근 중 선생님은 유즈의 상태를 보기 위해 그녀가 아르바이트를 하고 있는 메이드 카페로 향한다. 선생님의 방문에 잔뜩 긴장한 유즈는 평소와는 다르게 실수를 연발하고 만다. 잠시 후. 휴식 시간이 지나도 유즈가 돌아오지 않자 선생님은 걱정스러운 마음에 유즈를 찾아 나서고 의외의 광경을 마주한다. 43 | TextEn: '' 44 | TextTw: '' 45 | - groupId: 260096 46 | title: 47 | TextCn: 游戏开发部的大扫除 48 | TextJp: ゲーム開発部の掃除 49 | TextKr: 게임개발부의 청소 50 | TextEn: '' 51 | TextTh: '' 52 | TextTw: '' 53 | abstract: 54 | TextJp: ユズの掃除を手伝うべくゲーム開発部の部室を訪れた先生。しかし、ユズのいう掃除は、部屋の掃除ではなく、パソコンの最適化のことだった。リアルの掃除もしようと提案した先生は、ユズと共に部室を掃除するのだった。 55 | TextCn: 老师前往游戏开发部的活动室,准备帮助柚子打扫卫生。然而,柚子所说的“打扫”并非指打扫房间,而是指优化电脑。老师提议也进行一遍现实中的打扫,并与柚子一同打扫了活动室。 56 | TextKr: 유즈의 청소를 돕기 위해 게임개발부 부실을 찾은 선생님. 하지만 유즈가 말한 청소는 부실 청소가 아닌, 컴퓨터의 최적화를 의미하는 것이었다. 하지만 어질러진 부실을 마주한 선생님은 청소의 필요성을 느끼고 유즈에게 부실 청소를 제안한다. 57 | TextEn: '' 58 | TextTw: '' 59 | -------------------------------------------------------------------------------- /renovate.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://docs.renovatebot.com/renovate-schema.json", 3 | "baseBranches": ["dev"], 4 | "extends": ["config:base", ":semanticCommitTypeAll(chore)"], 5 | "schedule": ["after 8pm every weekend"], 6 | "timezone": "Asia/Tokyo", 7 | "packageRules": [ 8 | { 9 | "matchPackagePatterns": ["*"], 10 | "matchUpdateTypes": ["minor", "patch"], 11 | "groupName": "all non-major dependencies", 12 | "groupSlug": "all-minor-patch", 13 | "stabilityDays": 7, 14 | "automerge": true 15 | }, 16 | { 17 | "matchPackageNames": ["ba-story-player"], 18 | "enabled": false 19 | }, 20 | { 21 | "matchPackagePatterns": ["@pixi/*", "pixi*"], 22 | "matchUpdateTypes": ["minor", "patch"], 23 | "groupName": "pixi.js", 24 | "enabled": false 25 | } 26 | ], 27 | "ignoreDeps": [ 28 | "ba-story-player", 29 | "pixi.js", 30 | "pixi-spine", 31 | "@pixi/utils", 32 | "@pixi/constants", 33 | "@pixi-spine/base", 34 | "@pixi/utils", 35 | "@pixi/ticker", 36 | "@pixi/sprite", 37 | "@pixi/sound", 38 | "@pixi/settings", 39 | "@pixi/runner", 40 | "@pixi/mesh-extras", 41 | "@pixi/mesh", 42 | "@pixi/math", 43 | "@pixi/graphics", 44 | "@pixi/filter-motion-blur", 45 | "@pixi/filter-crt", 46 | "@pixi/filter-color-overlay", 47 | "@pixi/filter-adjustment", 48 | "@pixi/extensions", 49 | "@pixi/display", 50 | "@pixi/core" 51 | ] 52 | } 53 | -------------------------------------------------------------------------------- /src/App.vue: -------------------------------------------------------------------------------- 1 | 55 | 56 | 68 | 69 | 99 | -------------------------------------------------------------------------------- /src/assets/arona_icon.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ba-archive/blue-archive-story-viewer/9d6055ebc22ab9a052ae13df0205ce85653bde0f/src/assets/arona_icon.webp -------------------------------------------------------------------------------- /src/assets/be_patient.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ba-archive/blue-archive-story-viewer/9d6055ebc22ab9a052ae13df0205ce85653bde0f/src/assets/be_patient.webp -------------------------------------------------------------------------------- /src/assets/bin.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/assets/clear-filter.svg: -------------------------------------------------------------------------------- 1 | 3 | 4 | 6 | 8 | 9 | -------------------------------------------------------------------------------- /src/assets/dark-mode.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/assets/filter-options.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 9 | 13 | 19 | 21 | 23 | 25 | 26 | -------------------------------------------------------------------------------- /src/assets/filter.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/assets/heart.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/assets/info.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/assets/light-mode.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/assets/loading.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ba-archive/blue-archive-story-viewer/9d6055ebc22ab9a052ae13df0205ce85653bde0f/src/assets/loading.webp -------------------------------------------------------------------------------- /src/assets/mika_sticker.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ba-archive/blue-archive-story-viewer/9d6055ebc22ab9a052ae13df0205ce85653bde0f/src/assets/mika_sticker.webp -------------------------------------------------------------------------------- /src/assets/navigate-down.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /src/assets/nnnoise.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ba-archive/blue-archive-story-viewer/9d6055ebc22ab9a052ae13df0205ce85653bde0f/src/assets/nnnoise.png -------------------------------------------------------------------------------- /src/assets/nnnoise.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /src/assets/padlock.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/assets/peach.svg: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /src/assets/roadmap.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ba-archive/blue-archive-story-viewer/9d6055ebc22ab9a052ae13df0205ce85653bde0f/src/assets/roadmap.webp -------------------------------------------------------------------------------- /src/components/AboutPage.vue: -------------------------------------------------------------------------------- 1 | 61 | 62 | 65 | 66 | 100 | -------------------------------------------------------------------------------- /src/components/FriendLinks.vue: -------------------------------------------------------------------------------- 1 | 42 | 43 | 69 | 70 | 150 | -------------------------------------------------------------------------------- /src/components/GroupStoryHome.vue: -------------------------------------------------------------------------------- 1 | 13 | 14 | 17 | 18 | 24 | -------------------------------------------------------------------------------- /src/components/HomeWelcomeScreen.vue: -------------------------------------------------------------------------------- 1 | 40 | 41 | 60 | 61 | 109 | -------------------------------------------------------------------------------- /src/components/MainStoryHome.vue: -------------------------------------------------------------------------------- 1 | 17 | 18 | 28 | 29 | 34 | -------------------------------------------------------------------------------- /src/components/MiniStoryHome.vue: -------------------------------------------------------------------------------- 1 | 13 | 14 | 17 | 18 | 24 | -------------------------------------------------------------------------------- /src/components/NotFound.vue: -------------------------------------------------------------------------------- 1 | 17 | 18 | 27 | 28 | 78 | -------------------------------------------------------------------------------- /src/components/archive/StudentPersonalHome.vue: -------------------------------------------------------------------------------- 1 | 18 | 19 | 22 | 23 | 45 | -------------------------------------------------------------------------------- /src/components/story/StoryBriefBlock.vue: -------------------------------------------------------------------------------- 1 | 55 | 56 | 72 | 73 | 133 | -------------------------------------------------------------------------------- /src/components/story/StoryLineContainer.vue: -------------------------------------------------------------------------------- 1 | 41 | 42 | 67 | 68 | 94 | -------------------------------------------------------------------------------- /src/components/widgets/DialogContent.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | 45 | -------------------------------------------------------------------------------- /src/components/widgets/ErrorScreen.vue: -------------------------------------------------------------------------------- 1 | 22 | 23 | 31 | 32 | 62 | -------------------------------------------------------------------------------- /src/components/widgets/LanguageSelector.vue: -------------------------------------------------------------------------------- 1 | 49 | 50 | 65 | 66 | 89 | -------------------------------------------------------------------------------- /src/components/widgets/NeuUI/NeuProgressBar.vue: -------------------------------------------------------------------------------- 1 | 12 | 13 | 24 | 25 | 65 | -------------------------------------------------------------------------------- /src/components/widgets/NeuUI/NeuRadio.vue: -------------------------------------------------------------------------------- 1 | 9 | 10 | 24 | 25 | 75 | -------------------------------------------------------------------------------- /src/components/widgets/NeuUI/NeuRadioGroup.vue: -------------------------------------------------------------------------------- 1 | 15 | 16 | 26 | 27 | 49 | -------------------------------------------------------------------------------- /src/components/widgets/NeuUI/NeuSwitch.vue: -------------------------------------------------------------------------------- 1 | 22 | 23 | 91 | 92 | 121 | -------------------------------------------------------------------------------- /src/components/widgets/NeuUI/NeuTitleBar.vue: -------------------------------------------------------------------------------- 1 | 15 | 16 | 54 | 55 | 127 | -------------------------------------------------------------------------------- /src/components/widgets/NeuUI/README.md: -------------------------------------------------------------------------------- 1 | # Neu UI 组件库 2 | 3 | ## 组件 4 | 5 | ### 进度条 Progress Bar 6 | 7 | #### 接受参数 8 | 9 | | 名称 | 必须 | 类型 | 默认值 | 说明 | 10 | | ----------------- | ---- | --------- | ----------- | -------------- | 11 | | `progress` | ✅ | `number` | `0` | 进度条进度 | 12 | | `show-percentage` | ❌ | `boolean` | `undefined` | 是否显示百分比 | 13 | 14 | ### 开关 Switch 15 | 16 | #### 接受参数 17 | 18 | | 名称 | 必须 | 类型 | 默认值 | 说明 | 19 | | ----------------- | ---- | --------------------------------- | ------- | ------------------------ | 20 | | `checked` | ❌ | `boolean` | `false` | 开关是否开启 | 21 | | `checked-value` | ❌ | `boolean` \| `string` \| `number` | `true` | 触发开启事件时 emit 的值 | 22 | | `unchecked-value` | ❌ | `boolean` \| `string` \| `number` | `false` | 触发关闭事件时 emit 的值 | 23 | -------------------------------------------------------------------------------- /src/components/widgets/StudentShowbox.vue: -------------------------------------------------------------------------------- 1 | 37 | 38 | 49 | 50 | 79 | -------------------------------------------------------------------------------- /src/components/widgets/ThemeSwitcher.vue: -------------------------------------------------------------------------------- 1 | 41 | 42 | 63 | 64 | 127 | -------------------------------------------------------------------------------- /src/components/widgets/UserNameInput.vue: -------------------------------------------------------------------------------- 1 | 11 | 12 | 31 | 32 | 39 | -------------------------------------------------------------------------------- /src/i18n/getI18nString.ts: -------------------------------------------------------------------------------- 1 | import { Language } from '../types/Settings'; 2 | import { localeString } from './localeString'; 3 | 4 | const fallbackLocale: Language = 'en'; 5 | 6 | function getDeepI18nString(userLanguage: Language, key: string): string { 7 | const keys = key.split('.'); 8 | /* eslint-disable-next-line @typescript-eslint/no-explicit-any */ 9 | let result: any = {}; 10 | 11 | keys.forEach((key, index) => { 12 | if (0 === index) { 13 | result = Reflect.get(localeString, userLanguage); 14 | } 15 | result = 'object' === typeof result ? Reflect.get(result, key) : undefined; 16 | }); 17 | 18 | return 'string' === typeof result ? result : key; 19 | } 20 | 21 | function getI18nString( 22 | userLanguage: Language = 'cn', 23 | key: string, 24 | params: { [key: string]: string } = {} 25 | ) { 26 | let translatedString = key.includes('.') 27 | ? getDeepI18nString(userLanguage, key) 28 | : Reflect.get(Reflect.get(localeString, userLanguage), key) || 29 | Reflect.get(Reflect.get(localeString, fallbackLocale), key) || 30 | key; 31 | 32 | if (0 !== Object.keys(params).length) { 33 | for (const [key, value] of Object.entries(params)) { 34 | translatedString = translatedString?.replaceAll(`{${key}}`, value); 35 | } 36 | } 37 | 38 | return translatedString; 39 | } 40 | 41 | export { getI18nString }; 42 | -------------------------------------------------------------------------------- /src/main.ts: -------------------------------------------------------------------------------- 1 | // eslint-disable-next-line @typescript-eslint/ban-ts-comment 2 | // @ts-ignore 3 | import { registerSW } from 'virtual:pwa-register'; 4 | import { createPinia } from 'pinia'; 5 | import piniaPluginPersistedstate from 'pinia-plugin-persistedstate'; 6 | import Toastify from 'toastify-js'; 7 | import { createApp } from 'vue'; 8 | import { routerConvert } from './route/routes'; 9 | import App from './App.vue'; 10 | import './style.scss'; 11 | 12 | console.log('build ' + import.meta.env?.__BUILD_TIME__); 13 | 14 | const updateSW = registerSW({ 15 | onNeedRefresh() { 16 | Toastify({ 17 | text: `

后台资源已更新,请点击按钮更新以使用新版本

18 |
刷新
`, 19 | duration: -1, 20 | className: 'sw-update-toast', 21 | escapeMarkup: false, 22 | gravity: 'bottom', 23 | style: { 24 | transform: 'none !important', 25 | bottom: 'unset !important', 26 | }, 27 | onClick() { 28 | // noinspection JSIgnoredPromiseFromCall 29 | updateSW(true); 30 | }, 31 | }).showToast(); 32 | }, 33 | }); 34 | 35 | const pinia = createPinia(); 36 | pinia.use(piniaPluginPersistedstate); 37 | createApp(App).use(pinia).use(routerConvert).mount('#app'); 38 | -------------------------------------------------------------------------------- /src/store/settings.ts: -------------------------------------------------------------------------------- 1 | import { defineStore } from 'pinia'; 2 | import { Language } from '../types/Settings'; 3 | import { StudentAttributeFilters, StudentFilters } from '../types/Student'; 4 | 5 | export const useSettingsStore = defineStore({ 6 | id: 'ba-main-storage', 7 | state: () => { 8 | return { 9 | settings: { 10 | lang: 'cn' as Language, 11 | theme: 'light' as 'light' | 'dark', 12 | username: 'Sensei' as string, 13 | useMp3: false, 14 | useSuperSampling: '' as '' | '2' | '4', 15 | }, 16 | studentFilters: { 17 | searchString: '', 18 | rarity: [] as number[], 19 | club: [] as string[], 20 | affiliation: [] as string[], 21 | type: [] as ('Striker' | 'Special')[], 22 | armorType: [] as ('LightArmor' | 'HeavyArmor' | 'Unarmed')[], 23 | bulletType: [] as ('Pierce' | 'Explode' | 'Mystic')[], 24 | }, 25 | }; 26 | }, 27 | persist: true, 28 | getters: { 29 | getLang: state => state.settings.lang, 30 | getTheme: state => state.settings.theme, 31 | getUsername: state => state.settings.username, 32 | getSearchStringFilter: state => state.studentFilters.searchString, 33 | getRarityFilter: state => state.studentFilters.rarity, 34 | getClubFilter: state => state.studentFilters.club, 35 | getAffiliationFilter: state => state.studentFilters.affiliation, 36 | getTypeFilter: state => state.studentFilters.type, 37 | getArmorTypeFilter: state => state.studentFilters.armorType, 38 | getBulletTypeFilter: state => state.studentFilters.bulletType || [], 39 | getUseMp3: state => state.settings.useMp3, 40 | getUseSuperSampling: state => { 41 | const shouldUseSuperSampling = state.settings.useSuperSampling; 42 | if (!['', '2', '4'].includes(shouldUseSuperSampling)) { 43 | return ''; 44 | } 45 | return shouldUseSuperSampling; 46 | }, 47 | }, 48 | actions: { 49 | setLang(lang: 'cn' | 'tw' | 'jp' | 'en' | 'kr' | 'th') { 50 | this.settings.lang = lang; 51 | }, 52 | setTheme(theme: 'light' | 'dark') { 53 | this.settings.theme = theme; 54 | }, 55 | setUsername(username: string) { 56 | this.settings.username = username; 57 | }, 58 | setStudentFilters(filters: StudentFilters) { 59 | this.studentFilters.searchString = filters.searchString; 60 | this.studentFilters.rarity = filters.rarity; 61 | this.studentFilters.club = filters.club; 62 | this.studentFilters.affiliation = filters.affiliation; 63 | this.studentFilters.type = filters.type; 64 | this.studentFilters.armorType = filters.armorType; 65 | this.studentFilters.bulletType = filters.bulletType || []; 66 | }, 67 | clearStudentFilters() { 68 | this.studentFilters.searchString = ''; 69 | this.studentFilters.rarity = []; 70 | this.studentFilters.club = []; 71 | this.studentFilters.affiliation = []; 72 | this.studentFilters.type = []; 73 | this.studentFilters.armorType = []; 74 | this.studentFilters.bulletType = []; 75 | }, 76 | clearStudentFilter(property: keyof StudentAttributeFilters) { 77 | this.studentFilters[property] = []; 78 | }, 79 | setUseMp3(useMp3: boolean) { 80 | this.settings.useMp3 = useMp3; 81 | }, 82 | setUseSuperSampling(useSuperSampling: '' | '2' | '4') { 83 | this.settings.useSuperSampling = useSuperSampling; 84 | }, 85 | }, 86 | }); 87 | -------------------------------------------------------------------------------- /src/store/students.ts: -------------------------------------------------------------------------------- 1 | import { defineStore } from 'pinia'; 2 | import { Student } from '../types/Student'; 3 | 4 | export const useStudentStore = defineStore({ 5 | id: 'ba-students-storage', 6 | state: () => { 7 | return { 8 | students: [] as Student[], 9 | }; 10 | }, 11 | persist: false, 12 | getters: { 13 | getAllStudents: state => { 14 | return state.students; 15 | }, 16 | getStudentById: state => (id: number) => 17 | state.students.find(student => student.id === id), 18 | getStudentAvatar: () => (CharacterId: number) => 19 | `/image/avatar_students/${CharacterId}.webp`, 20 | }, 21 | actions: { 22 | setStudents(students: Student[]) { 23 | this.students = students; 24 | }, 25 | }, 26 | }); 27 | -------------------------------------------------------------------------------- /src/types/AppliedFilter.d.ts: -------------------------------------------------------------------------------- 1 | export interface AppliedFilter { 2 | searchString: string; 3 | rarity: number[]; 4 | club: string[]; 5 | affiliation: string[]; 6 | type: ('Striker' | 'Special')[]; 7 | armorType: ('LightArmor' | 'HeavyArmor' | 'Unarmed')[]; 8 | bulletType?: ('Pierce' | 'Explode' | 'Mystic')[]; 9 | } 10 | -------------------------------------------------------------------------------- /src/types/Chats.d.ts: -------------------------------------------------------------------------------- 1 | /* eslint-disable sort-exports/sort-exports */ 2 | 3 | export interface Momotalks { 4 | CharacterId: number; 5 | translator?: string; 6 | title: Title[]; 7 | content: Momotalk[]; 8 | splitMomotalk: SplitMomotalk[]; 9 | } 10 | 11 | export interface Momotalk { 12 | MessageGroupId: number; 13 | Id: number; 14 | CharacterId: number; 15 | MessageCondition: 'None' | 'FavorRankUp' | 'Answer' | 'Feedback'; 16 | ConditionValue: number; 17 | PreConditionGroupId: number; 18 | FavorScheduleId: number; 19 | NextGroupId: number; 20 | FeedbackTimeMillisec: number; 21 | MessageType: 'Text' | 'Image' | 'None'; 22 | ImagePath: string | undefined; 23 | MessageKR?: string | undefined; 24 | MessageJP: string | undefined; 25 | MessageCN?: string | undefined; 26 | MessageEN?: string | undefined; 27 | MessageTH?: string | undefined; 28 | MessageTW?: string | undefined; 29 | } 30 | 31 | export interface Title { 32 | CharacterId: number; 33 | GroupId: number; 34 | FavorScheduleId: number; 35 | TextJp: string; 36 | TextCn?: string; 37 | TextKr?: string; 38 | TextEn?: string; 39 | TextTh?: string; 40 | TextTw?: string; 41 | } 42 | 43 | export interface SplitMomotalk { 44 | FavorScheduleId: number; 45 | splitMomotalkContent: Momotalk[]; 46 | } 47 | 48 | export interface CurrentMessageItem { 49 | avatar: boolean; 50 | MessageGroupId: number; 51 | Id: number; 52 | CharacterId: number; 53 | ConditionValue: number; 54 | PreConditionGroupId: number; 55 | FavorScheduleId: number; 56 | NextGroupId: number; 57 | FeedbackTimeMillisec: number; 58 | MessageCondition: 'None' | 'FavorRankUp' | 'Answer' | 'Feedback'; 59 | options?: { 60 | current: number; 61 | content: SelectionOption[]; 62 | }; 63 | MessageType: 'Text' | 'Image' | 'None'; 64 | ImagePath: string | undefined; 65 | MessageJP?: string | undefined; 66 | MessageCN?: string | undefined; 67 | MessageKR?: string | undefined; 68 | MessageEN?: string | undefined; 69 | MessageTH?: string | undefined; 70 | MessageTW?: string | undefined; 71 | } 72 | 73 | export interface SelectionOption { 74 | MessageKR?: string | undefined; 75 | MessageJP: string | undefined; 76 | MessageCN?: string | undefined; 77 | MessageEN?: string | undefined; 78 | MessageTH?: string | undefined; 79 | MessageTW?: string | undefined; 80 | NextGroupId: number; 81 | } 82 | 83 | export interface MessageText { 84 | MessageKR?: string | undefined; 85 | MessageJP: string | undefined; 86 | MessageCN?: string | undefined; 87 | MessageEN?: string | undefined; 88 | MessageTH?: string | undefined; 89 | MessageTW?: string | undefined; 90 | } 91 | -------------------------------------------------------------------------------- /src/types/Routes.ts: -------------------------------------------------------------------------------- 1 | export interface RouteMeta { 2 | shouldShowInNav: boolean; 3 | navOrder?: number; 4 | m17n?: Array<{ 5 | lang: string; 6 | title: string; 7 | }>; 8 | } 9 | -------------------------------------------------------------------------------- /src/types/Settings.ts: -------------------------------------------------------------------------------- 1 | export type Language = 'cn' | 'tw' | 'jp' | 'en' | 'kr' | 'th'; 2 | -------------------------------------------------------------------------------- /src/types/StoryJson.ts: -------------------------------------------------------------------------------- 1 | export interface CommonStoryTextObject { 2 | TextCn?: string; 3 | TextJp: string; 4 | TextKr?: string; 5 | TextTh?: string; 6 | TextEn?: string; 7 | TextTw?: string; 8 | } 9 | 10 | export interface RawStoryUnit { 11 | GroupId: number; 12 | SelectionGroup: number; 13 | BGMId: number; 14 | Sound: string; 15 | Transition: number; 16 | BGName: number; 17 | BGEffect: number; 18 | PopupFileName: string; 19 | ScriptKr: string; 20 | TextJp: string; 21 | TextCn?: string; 22 | TextTw?: string; 23 | TextEn?: string; 24 | VoiceJp: string; 25 | } 26 | 27 | export interface Section { 28 | title: { 29 | TextCn?: string; 30 | TextJp: string; 31 | TextKr?: string; 32 | TextTh?: string; 33 | TextEn?: string; 34 | TextTw?: string; 35 | }; 36 | story_id: number; 37 | summary: { 38 | TextKr?: string; 39 | TextJp: string; 40 | TextTh?: string; 41 | TextCn?: string; 42 | TextTw?: string; 43 | TextEn?: string; 44 | }; 45 | next?: number; 46 | previous?: number; 47 | } 48 | 49 | export interface StoryAbstract { 50 | groupId: number; 51 | title: CommonStoryTextObject; 52 | abstract: CommonStoryTextObject; 53 | } 54 | 55 | export interface StoryBriefing { 56 | title: { 57 | TextCn?: string; 58 | TextJp: string; 59 | TextKr?: string; 60 | TextTh?: string; 61 | TextEn?: string; 62 | TextTw?: string; 63 | }; 64 | avatar: string; 65 | sections: Section[]; 66 | } 67 | 68 | export interface StoryContent { 69 | GroupId: number; 70 | translator: string; 71 | content: RawStoryUnit[]; 72 | } 73 | 74 | export interface StoryIndex { 75 | groupId: number; 76 | abstracts: StoryAbstract[]; 77 | } 78 | -------------------------------------------------------------------------------- /src/types/Student.d.ts: -------------------------------------------------------------------------------- 1 | /* eslint-disable sort-exports/sort-exports */ 2 | 3 | export interface Student { 4 | id: number; 5 | familyName: StudentName; 6 | name: StudentName; 7 | nickname: string[] | number[]; 8 | club: string; 9 | affiliation: string; 10 | birthday?: { 11 | month: number; 12 | day: number; 13 | }; 14 | rarity: number; 15 | type: 'Striker' | 'Special'; 16 | armorType: 'LightArmor' | 'HeavyArmor' | 'Unarmed'; 17 | bulletType?: 'Pierce' | 'Explode' | 'Mystic'; 18 | weapon: 19 | | 'SG' 20 | | 'SMG' 21 | | 'AR' 22 | | 'GL' 23 | | 'HG' 24 | | 'RL' 25 | | 'SR' 26 | | 'RG' 27 | | 'MG' 28 | | 'MT' 29 | | 'FT'; 30 | } 31 | 32 | export interface StudentName { 33 | cn: string; 34 | jp: string; 35 | en: string; 36 | } 37 | 38 | export interface StudentAttributeFilters { 39 | rarity: number[]; 40 | club: string[]; 41 | affiliation: string[]; 42 | type: string[]; 43 | armorType: string[]; 44 | bulletType?: string[]; 45 | } 46 | 47 | export interface StudentAttributes { 48 | club: string; 49 | affiliation: string; 50 | rarity: number; 51 | type: 'Striker' | 'Special'; 52 | armorType: 'LightArmor' | 'HeavyArmor' | 'Unarmed'; 53 | bulletType?: 'Pierce' | 'Explode' | 'Mystic'; 54 | weapon: 55 | | 'SG' 56 | | 'SMG' 57 | | 'AR' 58 | | 'GL' 59 | | 'HG' 60 | | 'RL' 61 | | 'SR' 62 | | 'RG' 63 | | 'MG' 64 | | 'MT' 65 | | 'FT'; 66 | } 67 | 68 | export interface StudentFilters { 69 | searchString: string; 70 | rarity: number[]; 71 | club: string[]; 72 | affiliation: string[]; 73 | type: ('Striker' | 'Special')[]; 74 | armorType: ('LightArmor' | 'HeavyArmor' | 'Unarmed')[]; 75 | bulletType?: ('Pierce' | 'Explode' | 'Mystic')[]; 76 | } 77 | 78 | export interface StudentNames { 79 | id: number; 80 | allNames: (string | number)[]; 81 | } 82 | -------------------------------------------------------------------------------- /src/types/UpdateNews.ts: -------------------------------------------------------------------------------- 1 | export interface Contributor { 2 | name: string; 3 | role: string; 4 | avatar: string; 5 | link?: string; 6 | } 7 | 8 | export interface StudentObject { 9 | name: string; 10 | id: number; 11 | } 12 | 13 | export interface UpdateContent { 14 | type: 15 | | 'fix' 16 | | 'feat' 17 | | 'refact' 18 | | 'docs' 19 | | 'chore' 20 | | 'test' 21 | | 'student' 22 | | 'main'; 23 | content?: string; 24 | students?: StudentObject[]; 25 | } 26 | 27 | export interface UpdateLog { 28 | date: string; 29 | contents: UpdateContent[]; 30 | } 31 | -------------------------------------------------------------------------------- /src/util/filterStudents.ts: -------------------------------------------------------------------------------- 1 | import { distance } from 'fastest-levenshtein'; 2 | import { AppliedFilter } from '../types/AppliedFilter'; 3 | import { Student, StudentAttributes, StudentNames } from '../types/Student'; 4 | 5 | function similarity(s1: string, s2: string): number { 6 | return 1 - distance(s1, s2) / Math.max(s1.length, s2.length); 7 | } 8 | 9 | function isPossibleName( 10 | searchString: string, 11 | studentNamesList: (string | number)[] | undefined 12 | ): boolean { 13 | const filteredNameList = studentNamesList?.filter(res => { 14 | return res !== undefined; 15 | }); 16 | let found = false; 17 | const specialCharacters = new RegExp( 18 | /[,。!“”/《》?:;「」{}|\\"$&+,:;=?@#|'<>.^*()%!\-\s]/g 19 | ); 20 | const lowerCaseSearchString = searchString 21 | .toLowerCase() 22 | .replaceAll(specialCharacters, ''); 23 | const lowercaseStudentNamesList = filteredNameList?.map(name => { 24 | return name.toString().toLowerCase().replaceAll(specialCharacters, ''); 25 | }); 26 | lowercaseStudentNamesList?.forEach(studentName => { 27 | if (studentName) { 28 | if ( 29 | similarity(lowerCaseSearchString, studentName) > 0.66 || 30 | lowerCaseSearchString.includes(studentName) || 31 | studentName.includes(lowerCaseSearchString) || 32 | studentName.startsWith(lowerCaseSearchString) || 33 | studentName.endsWith(lowerCaseSearchString) || 34 | '' === lowerCaseSearchString 35 | ) { 36 | found = true; 37 | } 38 | } 39 | }); 40 | return found; 41 | } 42 | 43 | function filterStudentsByProperty( 44 | property: string, 45 | criteria: (string | number)[], 46 | initialList: Student[] 47 | ): Student[] { 48 | return initialList.filter((student: Student) => 49 | criteria.includes( 50 | student[property as keyof StudentAttributes] as string | number 51 | ) 52 | ); 53 | } 54 | 55 | function filterStudents( 56 | appliedFilters: AppliedFilter, 57 | studentsNameList: StudentNames[], 58 | studentsList: Student[] 59 | ): number[] { 60 | if ( 61 | '' === appliedFilters.searchString && 62 | 0 === appliedFilters.rarity.length && 63 | 0 === appliedFilters.club.length && 64 | 0 === appliedFilters.affiliation.length && 65 | 0 === appliedFilters.type.length && 66 | 0 === appliedFilters.armorType.length && 67 | appliedFilters.bulletType && 68 | 0 === appliedFilters.bulletType.length 69 | ) { 70 | return studentsList.map(student => student.id); 71 | } 72 | let result = studentsList; 73 | if (appliedFilters.searchString) { 74 | const listFilteredByString: Student[] = []; 75 | studentsList.forEach(student => { 76 | if ( 77 | isPossibleName( 78 | appliedFilters.searchString, 79 | studentsNameList.find(s => s.id === student.id)?.allNames 80 | ) 81 | ) { 82 | listFilteredByString.push(student); 83 | } 84 | }); 85 | result = listFilteredByString; 86 | } 87 | if (0 !== appliedFilters.rarity.length) { 88 | result = filterStudentsByProperty('rarity', appliedFilters.rarity, result); 89 | } 90 | if (0 !== appliedFilters.club.length) { 91 | result = filterStudentsByProperty('club', appliedFilters.club, result); 92 | } 93 | if (0 !== appliedFilters.affiliation.length) { 94 | result = filterStudentsByProperty( 95 | 'affiliation', 96 | appliedFilters.affiliation, 97 | result 98 | ); 99 | } 100 | if (0 !== appliedFilters.type.length) { 101 | result = filterStudentsByProperty('type', appliedFilters.type, result); 102 | } 103 | if (0 !== appliedFilters.armorType.length) { 104 | result = filterStudentsByProperty( 105 | 'armorType', 106 | appliedFilters.armorType, 107 | result 108 | ); 109 | } 110 | if (appliedFilters.bulletType && 0 !== appliedFilters.bulletType.length) { 111 | result = filterStudentsByProperty( 112 | 'bulletType', 113 | appliedFilters.bulletType, 114 | result 115 | ); 116 | } 117 | 118 | return result.map(student => student.id); 119 | } 120 | 121 | export { filterStudents }; 122 | -------------------------------------------------------------------------------- /src/util/getAllFlattenedStoryIndex.ts: -------------------------------------------------------------------------------- 1 | import { Section, StoryBriefing } from '../types/StoryJson'; 2 | 3 | export function getAllFlattenedStoryIndex( 4 | storyIndex: StoryBriefing[] | Section[] | undefined 5 | ) { 6 | const res: Section[] = []; 7 | if (!storyIndex) return res; 8 | for (const story of storyIndex) { 9 | if ((story as StoryBriefing)?.sections) { 10 | res.push(...getAllFlattenedStoryIndex((story as StoryBriefing).sections)); 11 | } else { 12 | res.push(story as Section); 13 | } 14 | } 15 | return res; 16 | } 17 | -------------------------------------------------------------------------------- /src/util/routerUtils.ts: -------------------------------------------------------------------------------- 1 | import { RouteRecordRaw } from 'vue-router'; 2 | import { RouteMeta } from '../types/Routes'; 3 | 4 | export function getRouteTranslation( 5 | route: RouteRecordRaw, 6 | lang: string 7 | ): string { 8 | const routeMeta = route.meta as RouteMeta | undefined; 9 | if (routeMeta && routeMeta.m17n) { 10 | const m17n = routeMeta.m17n; 11 | if (m17n) { 12 | return ( 13 | m17n.find(translation => lang === translation.lang)?.title || 14 | (route.name as string) 15 | ); 16 | } 17 | } 18 | return route.name as string; 19 | } 20 | -------------------------------------------------------------------------------- /src/util/userInterfaceUtils.ts: -------------------------------------------------------------------------------- 1 | export function switchTheme(theme: 'light' | 'dark') { 2 | const htmlElement = document.querySelector('html') as HTMLHtmlElement; 3 | const metaThemeColor = document.querySelector('meta[name=theme-color]'); 4 | 5 | if ('light' === theme) { 6 | htmlElement.dataset.theme = 'light'; 7 | metaThemeColor?.setAttribute('content', '#ffffffd8'); 8 | } else { 9 | htmlElement.dataset.theme = 'dark'; 10 | metaThemeColor?.setAttribute('content', '#343e50d8'); 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /src/vite-env.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | /* eslint-disable @typescript-eslint/no-explicit-any */ 3 | 4 | declare module '*.vue' { 5 | import type { DefineComponent } from 'vue'; 6 | // eslint-disable-next-line @typescript-eslint/ban-types,@typescript-eslint/no-explicit-any 7 | const component: DefineComponent<{}, {}, any>; 8 | export default component; 9 | } 10 | 11 | declare interface Window { 12 | webkitConvertPointFromNodeToPage?: (Node, WebkitPoint) => WebkitPoint; 13 | } 14 | -------------------------------------------------------------------------------- /tools/gen.bat: -------------------------------------------------------------------------------- 1 | @echo off 2 | protoc --python_out="./" "python/momotalk.proto" -------------------------------------------------------------------------------- /tools/python/compress.py: -------------------------------------------------------------------------------- 1 | import os 2 | import momotalk_pb2 3 | import json 4 | 5 | def main(): 6 | 7 | momotalkData = momotalk_pb2.MomotalkData() 8 | 9 | dict = {} 10 | with open("./test.json", "r", encoding="UTF-8") as f: 11 | dict = json.loads(f.read()) 12 | 13 | for item in dict["DataList"]: 14 | momotalkItem = momotalkData.DataList.add() 15 | momotalkItem.MessageGroupId = item["MessageGroupId"] 16 | momotalkItem.Id = item["MessageGroupId"] 17 | momotalkItem.CharacterId = item["CharacterId"] 18 | condition = item["MessageCondition"] 19 | momotalkItem.MessageCondition = momotalk_pb2.MessageCondition.NoneB 20 | if condition == "FavorRankUp": 21 | momotalkItem.MessageCondition = momotalk_pb2.MessageCondition.FavorRankUp 22 | if condition == "Answer": 23 | momotalkItem.MessageCondition = momotalk_pb2.MessageCondition.Answer 24 | if condition == "Feedback": 25 | momotalkItem.MessageCondition = momotalk_pb2.MessageCondition.Feedback 26 | momotalkItem.ConditionValue = item["ConditionValue"] 27 | momotalkItem.PreConditionGroupId = item["PreConditionGroupId"] 28 | momotalkItem.PreConditionFavorScheduleId = item["PreConditionFavorScheduleId"] 29 | momotalkItem.FavorScheduleId = item["FavorScheduleId"] 30 | momotalkItem.NextGroupId = item["NextGroupId"] 31 | momotalkItem.FeedbackTimeMillisec = item["FeedbackTimeMillisec"] 32 | messageType = item["MessageType"] 33 | momotalkItem.MessageType = momotalk_pb2.MessageType.NoneA 34 | if messageType == "FavorRankUp": 35 | momotalkItem.MessageType = momotalk_pb2.MessageType.Text 36 | if messageType == "Answer": 37 | momotalkItem.MessageType = momotalk_pb2.MessageType.Image 38 | momotalkItem.ImagePath = item["ImagePath"] 39 | momotalkItem.MessageKR = item["MessageKR"] 40 | momotalkItem.MessageJP = item["MessageJP"] 41 | str = momotalkData.SerializeToString() 42 | with open("./save", "wb", encoding="UTF-8") as f: 43 | f.write(str) 44 | 45 | if __name__ == "__main__": 46 | main() -------------------------------------------------------------------------------- /tools/python/csvcompress.py: -------------------------------------------------------------------------------- 1 | import json 2 | 3 | def main(): 4 | 5 | dict = {} 6 | list = [] 7 | with open("./test.json", "r", encoding="UTF-8") as f: 8 | dict = json.loads(f.read()) 9 | 10 | for item in dict["DataList"]: 11 | MessageGroupId = item["MessageGroupId"] 12 | Id = item["MessageGroupId"] 13 | CharacterId = item["CharacterId"] 14 | MessageCondition = item["MessageCondition"] 15 | ConditionValue = item["ConditionValue"] 16 | PreConditionGroupId = item["PreConditionGroupId"] 17 | PreConditionFavorScheduleId = item["PreConditionFavorScheduleId"] 18 | FavorScheduleId = item["FavorScheduleId"] 19 | NextGroupId = item["NextGroupId"] 20 | FeedbackTimeMillisec = item["FeedbackTimeMillisec"] 21 | MessageType = item["MessageType"] 22 | ImagePath = item["ImagePath"] 23 | MessageKR = item["MessageKR"] 24 | MessageJP = item["MessageJP"] 25 | str = "%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s" % ( 26 | MessageGroupId, Id, CharacterId, MessageCondition, ConditionValue, 27 | PreConditionGroupId, PreConditionFavorScheduleId, FavorScheduleId, 28 | NextGroupId, FeedbackTimeMillisec, MessageType, ImagePath, MessageKR, MessageJP 29 | ) 30 | list.append(str) 31 | with open("./savecsv", "w", encoding="UTF-8") as f: 32 | f.write("\n".join(list)) 33 | 34 | if __name__ == "__main__": 35 | main() -------------------------------------------------------------------------------- /tools/python/momotalk.proto: -------------------------------------------------------------------------------- 1 | // See README.txt for information and build instructions. 2 | // 3 | // Note: START and END tags are used in comments to define sections used in 4 | // tutorials. They are not part of the syntax for Protocol Buffers. 5 | // 6 | // To get an in-depth walkthrough of this file and the related examples, see: 7 | // https://developers.google.com/protocol-buffers/docs/tutorials 8 | 9 | // [START declaration] 10 | syntax = "proto3"; 11 | package tutorial; 12 | 13 | enum MessageCondition { 14 | NoneB = 0; 15 | FavorRankUp = 1; 16 | Answer = 2; 17 | Feedback = 3; 18 | } 19 | 20 | enum MessageType { 21 | NoneA = 0; 22 | Text = 1; 23 | Image = 2; 24 | } 25 | 26 | // [START messages] 27 | message MomotalkItem { 28 | uint32 MessageGroupId = 1; 29 | uint32 Id = 2; 30 | uint32 CharacterId = 3; 31 | MessageCondition MessageCondition = 4; 32 | uint32 ConditionValue = 5; 33 | uint32 PreConditionGroupId = 6; 34 | uint32 PreConditionFavorScheduleId = 7; 35 | uint32 FavorScheduleId = 8; 36 | uint32 NextGroupId = 9; 37 | uint32 FeedbackTimeMillisec = 10; 38 | MessageType MessageType = 11; 39 | string ImagePath = 12; 40 | string MessageKR = 13; 41 | string MessageJP = 14; 42 | } 43 | 44 | // Our address book file is just one of these. 45 | message MomotalkData { 46 | repeated MomotalkItem DataList = 1; 47 | } 48 | // [END messages] 49 | -------------------------------------------------------------------------------- /tools/python/momotalk_pb2.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # Generated by the protocol buffer compiler. DO NOT EDIT! 3 | # source: python/momotalk.proto 4 | """Generated protocol buffer code.""" 5 | from google.protobuf.internal import builder as _builder 6 | from google.protobuf import descriptor as _descriptor 7 | from google.protobuf import descriptor_pool as _descriptor_pool 8 | from google.protobuf import symbol_database as _symbol_database 9 | # @@protoc_insertion_point(imports) 10 | 11 | _sym_db = _symbol_database.Default() 12 | 13 | 14 | 15 | 16 | DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x15python/momotalk.proto\x12\x08tutorial\"\x88\x03\n\x0cMomotalkItem\x12\x16\n\x0eMessageGroupId\x18\x01 \x01(\r\x12\n\n\x02Id\x18\x02 \x01(\r\x12\x13\n\x0b\x43haracterId\x18\x03 \x01(\r\x12\x34\n\x10MessageCondition\x18\x04 \x01(\x0e\x32\x1a.tutorial.MessageCondition\x12\x16\n\x0e\x43onditionValue\x18\x05 \x01(\r\x12\x1b\n\x13PreConditionGroupId\x18\x06 \x01(\r\x12#\n\x1bPreConditionFavorScheduleId\x18\x07 \x01(\r\x12\x17\n\x0f\x46\x61vorScheduleId\x18\x08 \x01(\r\x12\x13\n\x0bNextGroupId\x18\t \x01(\r\x12\x1c\n\x14\x46\x65\x65\x64\x62\x61\x63kTimeMillisec\x18\n \x01(\r\x12*\n\x0bMessageType\x18\x0b \x01(\x0e\x32\x15.tutorial.MessageType\x12\x11\n\tImagePath\x18\x0c \x01(\t\x12\x11\n\tMessageKR\x18\r \x01(\t\x12\x11\n\tMessageJP\x18\x0e \x01(\t\"8\n\x0cMomotalkData\x12(\n\x08\x44\x61taList\x18\x01 \x03(\x0b\x32\x16.tutorial.MomotalkItem*H\n\x10MessageCondition\x12\t\n\x05NoneB\x10\x00\x12\x0f\n\x0b\x46\x61vorRankUp\x10\x01\x12\n\n\x06\x41nswer\x10\x02\x12\x0c\n\x08\x46\x65\x65\x64\x62\x61\x63k\x10\x03*-\n\x0bMessageType\x12\t\n\x05NoneA\x10\x00\x12\x08\n\x04Text\x10\x01\x12\t\n\x05Image\x10\x02\x62\x06proto3') 17 | 18 | _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, globals()) 19 | _builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'python.momotalk_pb2', globals()) 20 | if _descriptor._USE_C_DESCRIPTORS == False: 21 | 22 | DESCRIPTOR._options = None 23 | _MESSAGECONDITION._serialized_start=488 24 | _MESSAGECONDITION._serialized_end=560 25 | _MESSAGETYPE._serialized_start=562 26 | _MESSAGETYPE._serialized_end=607 27 | _MOMOTALKITEM._serialized_start=36 28 | _MOMOTALKITEM._serialized_end=428 29 | _MOMOTALKDATA._serialized_start=430 30 | _MOMOTALKDATA._serialized_end=486 31 | # @@protoc_insertion_point(module_scope) 32 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "ESNext", 4 | "useDefineForClassFields": true, 5 | "module": "ESNext", 6 | "moduleResolution": "Node", 7 | "strict": true, 8 | "jsx": "preserve", 9 | "resolveJsonModule": true, 10 | "isolatedModules": true, 11 | "esModuleInterop": true, 12 | "lib": ["ESNext", "DOM"], 13 | "skipLibCheck": true, 14 | "noEmit": true 15 | }, 16 | "include": ["src/**/*.ts", "src/**/*.d.ts", "src/**/*.tsx", "src/**/*.vue"], 17 | "references": [{ "path": "./tsconfig.node.json" }] 18 | } 19 | -------------------------------------------------------------------------------- /tsconfig.node.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "composite": true, 4 | "module": "ESNext", 5 | "moduleResolution": "Node", 6 | "allowSyntheticDefaultImports": true 7 | }, 8 | "include": ["vite.config.ts"] 9 | } 10 | -------------------------------------------------------------------------------- /vite.config.ts: -------------------------------------------------------------------------------- 1 | /* eslint-disable no-unused-vars,@typescript-eslint/no-unused-vars,@typescript-eslint/ban-ts-comment */ 2 | import px2rem from 'postcss-plugin-px2rem'; 3 | import postcssPresetEnv from 'postcss-preset-env'; 4 | import { visualizer } from 'rollup-plugin-visualizer'; 5 | import { defineConfig } from 'vite'; 6 | import clearConsole from 'vite-plugin-clear-console'; 7 | import viteCompression from 'vite-plugin-compression'; 8 | import { VitePWA } from 'vite-plugin-pwa'; 9 | import legacy from '@vitejs/plugin-legacy'; 10 | import vue from '@vitejs/plugin-vue'; 11 | 12 | const currentTime = new Date().toISOString(); 13 | 14 | // https://vitejs.dev/config/ 15 | export default defineConfig({ 16 | define: { 17 | 'import.meta.env.__BUILD_TIME__': JSON.stringify(currentTime), 18 | }, 19 | server: { 20 | cors: true, 21 | }, 22 | css: { 23 | postcss: { 24 | plugins: [ 25 | postcssPresetEnv(), 26 | px2rem({ 27 | rootValue: 16, 28 | propBlackList: ['font-size', 'border', 'border-width'], 29 | exclude: /(node_module)/, 30 | }), 31 | ], 32 | }, 33 | }, 34 | plugins: [ 35 | vue(), 36 | legacy({ 37 | targets: [ 38 | 'Android >= 39', 39 | 'Chrome >= 50', 40 | 'Safari >= 10.1', 41 | 'iOS >= 10.3', 42 | '> 1%', 43 | ], 44 | }), 45 | VitePWA({ 46 | injectRegister: 'auto', 47 | includeManifestIcons: true, 48 | registerType: 'prompt', 49 | includeAssets: ['favicon/*.png'], 50 | manifest: { 51 | name: '碧蓝档案剧情站', 52 | short_name: 'BA剧情站', 53 | description: 'Yet another Blue Archive story viewer', 54 | lang: 'zh-CN', 55 | theme_color: '#3f88f2', 56 | icons: [ 57 | { 58 | src: '/favicon/apple-touch-icon.png', 59 | sizes: '180x180', 60 | type: 'image/png', 61 | }, 62 | { 63 | src: '/favicon/maskable-192x192.png', 64 | sizes: '192x192', 65 | type: 'image/png', 66 | purpose: 'maskable', 67 | }, 68 | { 69 | src: '/favicon/android-chrome-192x192.png', 70 | sizes: '192x192', 71 | type: 'image/png', 72 | }, 73 | { 74 | src: '/favicon/android-chrome-512x512.png', 75 | sizes: '512x512', 76 | type: 'image/png', 77 | }, 78 | ], 79 | }, 80 | workbox: { 81 | runtimeCaching: [ 82 | { 83 | urlPattern: /(.*?)\.(mp4|mp3|wav|ogg)$/i, 84 | handler: 'CacheFirst', 85 | options: { 86 | cacheName: 'multimedia-cache', 87 | }, 88 | }, 89 | { 90 | urlPattern: /(.*?)\.(woff2?)$/i, 91 | handler: 'CacheFirst', 92 | options: { 93 | cacheName: 'font-cache', 94 | }, 95 | }, 96 | ], 97 | }, 98 | // uncomment to unregister service worker 99 | selfDestroying: true, 100 | }), 101 | { 102 | ...clearConsole(), 103 | apply: 'build', 104 | }, 105 | // viteCompression(), 106 | //@ts-ignore 107 | visualizer(), 108 | ], 109 | build: { 110 | emptyOutDir: true, 111 | minify: 'terser', 112 | terserOptions: { 113 | toplevel: true, 114 | safari10: true, 115 | }, 116 | }, 117 | }); 118 | --------------------------------------------------------------------------------