ba-archive / blue-archive-story-viewer Goto Github PK
View Code? Open in Web Editor NEW碧蓝档案的档案。仓库已经迁移到 monorepo,详情请看 readme。
Home Page: https://github.com/ba-archive/blue-archive
License: GNU General Public License v3.0
碧蓝档案的档案。仓库已经迁移到 monorepo,详情请看 readme。
Home Page: https://github.com/ba-archive/blue-archive
License: GNU General Public License v3.0
—
—
No response
FavorScheduleId
和 CharacterId
区分不同学生在不同好感度条件下的聊天内容-webkit-
前缀的尽可能覆盖到这个前缀,不然 Safari 会出奇奇怪怪的布局问题DataList
: array
MessageGroupId
: number
暂时没想明白,不过是有规律的
五位数学生 ID
+ 00
+ 2-3位数字
例:
{
"MessageGroupId": 100040020,
"Id": 3,
"CharacterId": 10004,
}
同一个 GroupId
可能代表者同一个回复组
{
"MessageGroupId": 100040020,
"Id": 3,
"CharacterId": 10004,
"MessageCondition": "Answer",
}
{
"MessageGroupId": 100040020,
"Id": 4,
"CharacterId": 10004,
"MessageCondition": "Answer",
}
Id
: number
应该是 Message ID,目前可以认为是两个 list 里面的唯一标识符
CharacterId
: number
角色的 ID,参考 SchaleDB 的数据,这个项目里面也有:https://github.com/ba-archive/blue-archive-story-viewer/blob/master/public/config/yaml/students.yaml
MessageCondition
: 'None' | 'FavorRankUp' | 'Answer' | 'Feedback'
目前发现有四种: None
, FavorRankUp
, Answer
, Feedback
FavorRankUp
: 好感度提升后,学生给老师发的第一条消息(在这一条消息上方显示“已读”横幅)
Answer
: 老师给学生的回复
Feedback
: 老师回复完成后,学生对老师发送的消息作出的反应
None
: 应该是一般信息,接在 FavorRankUp
第一条信息后面,或者 Feedback
后面的学生发来的信息
ConditionValue
: number
我觉得是角色好感度等级到了这个等级之后解锁的意思
PreConditionGroupId
: number
需要完成前置MessageGroup 才能显示?
PreConditionFavorScheduleId
: number
代表好感剧情结束后紧接着的对话,可以用来标记“已读信息”
FavorScheduleId
: number
该值如果不为 0
,则代表当前消息事件完成之后会立即接上一个好感事件入口。
该值的组成结构为 五位数学生 ID
+ 学生好感度等级
。
例:
"FavorScheduleId": 100146,
则代表进入泉奈(学生 ID 10014)第六级好感度时的剧情。
NextGroupId
: number
这一组信息完成之后显示下一组信息
FeedbackTimeMillisec
: number
学生回复的时候会有一个“对方正在打字”的那个动画,这个字段控制了打字动画的时长
MessageType
: 'Text' | 'Image' | 'None'
有三种取值:Text
, Image
, None
ImagePath
: string
如果 MessageType
是 Image
的话,此字段启用,记录图像文件位置。
MessageKR
, MessageJP
: string
如果 MessageType
是 Text
的话,这两个字段启用。记录聊天文字的信息。
--
No response
--
--
No response
--
No response
--
No response
通常格式: "3;호시노(星野, 立绘名);03(表情编号);剧情语句(可选)\n#3;效果或动作(可选)"
3
指立绘初始位置(共有五个, 可能因为动作移动).
当为不是编号而是#na
时, 有角色名则为人物说话但没有立绘, 无角色名表示旁白.
一般剧情语句或效果后面会加\n
作为分隔, 如果在字符串的末尾则不加.
"#Title;XXX"
: 剧情标题
"#Place;XXX"
: 左上提示切换地点, 可用于背景加载, 但注意有时没有提示, 所以应该有其他加载背景的方法.
#
后接一个实体或操作, 指对实体进行的操作或者给操作设置的值. 具体格式为#实体或操作;动作或值\n
#wait;1000\n
: 播放线程睡眠(等待) 1000ms
.
#fontsize;80
修改字体大小到 80dp
++ #zmc;
: 画面拉近
#move;0,-222;2528;200\n
: 画面移动
-- #zmc;move;0,-222;2528;200\n#3
: 画面拉近
++ #serial;
: 逐个字显示当前对话文字,通常和 [wa: Number]
配合,控制文字间的暂停,单位为 ms
++ #instant;
: 立刻显示完当前对话文字
-- #zmc;instant;0,-222;2528\n
: 画面拉近后保持
#all;hide
隐藏画面上的所有内容(包括控制按钮),只显示播放器底部的黑色背景(也可以认为是在播放器最上层加上一个黑色不透明遮罩),用于大转场
#bgshake\n
: 背景左右摇动
#hidemenu
: 消除菜单
#3;动作\n
指人物动作, 目前知道的有:
符号 | 动作 | 示例位置 | 备注 |
---|---|---|---|
a | 人物出现(从背影到立绘) | 可以通过 filter: brightness 控制?https://www.bilibili.com/video/av756548781/?p=8&t=308 这里的 a 的作用是显示生气图标,再讨论 |
|
d | 人物离开 | disappear | |
dl |
向左平移出屏幕 | https://www.bilibili.com/video/av756548781/?p=8&t=314 | |
ar ? |
https://www.bilibili.com/video/av756548781/?p=11&t=130 | ||
hophop | 跳动两下 | ||
greeting | 屈膝礼(向下平移,暂停,归位) | https://www.bilibili.com/video/av756548781/?p=11&t=119 | |
shake | 左右摇动 | https://www.bilibili.com/video/av756548781/?p=11&t=105 | 左右晃动? |
m2 | 移动到指定立绘位置, 可更改数字 | 位置取值为 1 , 2 , 3 , 4 , 5 |
|
stiff | 小幅度左右移动 | ||
closeup | 人物靠近(如果已经近处则不动) | “靠近”指靠近玩家位置 | |
jump | 跳动一次 | ||
falldownR |
以脚底为变换中心左右摆动,然后倒下 | https://www.bilibili.com/video/av756548781/?p=8&t=385 |
#3;em;[반응]\n
: [반응]
为效果, 它的前面还使用了em提示该人物作为重点(多人物时她相比其他人亮),目前知道的如下:
[ruby=xxx]yyy[/ruby]
"[s1] \"分支1\"\n[s2] \"分支2\""
: 选择分支, 对应后面SelectionGroup
的, 无对话框时s改为ns
.
1, 2.档为s
时只有一个选项.
live2d语句或无对话框剧情语句大概如下:
#st;[-1200,-530];serial;60;[wa:900]― 모처럼이니 [wa:2450]선생님도 어떠신가요?
#st
放置文字(有时也用于消除对话框), [wa:number]
为放置时中间的停顿, serial
指缓慢显示文字, instant
是立即显示.60
应该是指字体大小.
#clearST
为取消放置文字
``
BGMId
,: 不为0时播放bgm.
BGName
: 背景图片id(也可以是cg), 通过ScenarioBGNameExcelTable.json匹配
BGEffect
: 背景效果(如粉尘), 通过ScenarioBGEffectExcelTable.json匹配
Transition
: 变换(如画面渐变), 通过ScenarioTransitionExcelTable.json匹配
Sound
:不为null时播放效果音或语音
迁移至【腾讯文档】剧情播放器特效
注意,判断一个特效是对话特效还是人物特效的规则是看该特效关键词前面有没有 em;
特效是否有中括号不重要
符号 | 效果 | 示例 | 对应单词 | 实现人 |
---|---|---|---|---|
em;[하트] ; em;h |
Heart | |||
em;[반응] |
https://www.bilibili.com/video/av756548781/?p=11&t=191 | Respond | ||
em;[음표] ; em;m |
https://www.bilibili.com/video/av756548781/?p=11&t=216 | Music | ourandream(已完成) | |
[반짝] ;em;k |
https://www.bilibili.com/video/av756548781/?p=11&t=165 | Twinkle | ||
em;[속상함] ; em;u |
https://www.bilibili.com/video/av756548781/?p=8&t=373 | Upset | ||
[땀] ;em;w |
https://www.bilibili.com/video/av756548781/?p=11&t=126 | Sweat | ||
em;[...] ;em;… |
https://www.bilibili.com/video/av756548781/?p=11&t=171 | ... | ||
em;c |
https://www.bilibili.com/video/av756548781/?p=11&t=130 | Chat | ||
em;[!] |
https://www.bilibili.com/video/av756548781/?p=8&t=276 | ! | ||
em;[빠직] ; em;a |
https://www.bilibili.com/video/av756548781/?p=8&t=281 | Angry | ||
em;[?!] em;?! |
https://www.bilibili.com/video/av756548781/?p=8&t=364 | ?! | ||
em;[?] |
https://www.bilibili.com/video/av756548781/?p=8&t=393 | ? | ||
em;[///] |
Shy | |||
[ruby=注音小字]正常文字[/ruby] |
符号 | 动作 | 示例位置 | 备注 | 实现人 |
---|---|---|---|---|
a |
人物出现(从背影到立绘) | 可以通过 filter: brightness 控制?https://www.bilibili.com/video/av756548781/?p=8&t=308 |
第一个mt | |
d |
人物离开 | disappear | ||
dl |
向左平移出屏幕 | https://www.bilibili.com/video/av756548781/?p=8&t=314 | ||
dr |
向右平移出屏幕 | |||
ar |
从屏幕左边进入 | https://www.bilibili.com/video/av756548781/?p=11&t=130 | ||
al |
从屏幕右边进入 | |||
hophop |
跳动两下 | |||
greeting |
屈膝礼(向下平移,暂停,归位) | https://www.bilibili.com/video/av756548781/?p=11&t=119 | ||
shake |
左右摇动 | https://www.bilibili.com/video/av756548781/?p=11&t=105 | 左右晃动? | |
m2 |
平移到指定立绘位置, 可更改数字 | 位置取值为 1 , 2 , 3 , 4 , 5 |
||
stiff |
小幅度左右移动 | |||
closeup |
人物靠近(如果已经近处则不动) | “靠近”指靠近玩家位置 | ||
jump |
跳动一次 | |||
falldownR |
以脚底为变换中心左右摆动,然后倒下 | https://www.bilibili.com/video/av756548781/?p=8&t=385 | ||
hide |
隐藏人物 | https://www.bilibili.com/video/av756548781/?p=11&t=205 |
effect | 特效 |
---|---|
{shot} | 人物被击中 |
全息特效
Chrome/Firefox 浏览器 学生好感剧情页面 下滑可复现
ar
(appear right?) {
"GroupId": 11080,
"SelectionGroup": 0,
"BGMId": 0,
"Sound": "",
"Transition": 0,
"BGName": 0,
"BGEffect": 0,
"PopupFileName": "",
"ScriptKr": "1;호시노;03;나! 나!\n#1;em;c\n#1;hophop\n#1;ar\n#3;m5",
"TextJp": "はい!はい!",
"VoiceJp": ""
},
https://www.bilibili.com/video/av756548781/?p=11&t=130
{
"GroupId": 11050,
"SelectionGroup": 0,
"BGMId": 0,
"Sound": "",
"Transition": 0,
"BGName": 0,
"BGEffect": 0,
"PopupFileName": "",
"ScriptKr": "2;헬멧단 B;00\n4;헬멧단 A;00;……\n#2;ar\n#4;al",
"TextJp": "……。",
"VoiceJp": ""
},
https://www.bilibili.com/video/av756548781/?p=8&t=320
al
(appear left?) {
"GroupId": 11050,
"SelectionGroup": 0,
"BGMId": 9,
"Sound": "SE_FootStep_03a",
"Transition": 0,
"BGName": 0,
"BGEffect": 0,
"PopupFileName": "",
"ScriptKr": "5;세리카;02;하아…… 겨우 끝났네. 정신없는 하루였어.\n#5;al",
"TextJp": "はあ……やっと終わった。目まぐるしい一日だったわ。",
"VoiceJp": ""
},
https://www.bilibili.com/video/av756548781/?p=8&t=302
如果单独使用的话,人物是从画面右边缘出来的,这一点需要再确认一下
ar
代表从左边,al
代表从右边出来。。。
dl
; dr
(disappear left / right?) {
"GroupId": 11050,
"SelectionGroup": 0,
"BGMId": 0,
"Sound": "",
"Transition": 0,
"BGName": 0,
"BGEffect": 0,
"PopupFileName": "",
"ScriptKr": "4;헬멧단 A;00;준비해. 다음 블럭에서 포획한다.",
"TextJp": "準備はいいか?次のブロックで捕獲するぞ。",
"VoiceJp": ""
},
{
"GroupId": 11050,
"SelectionGroup": 0,
"BGMId": 0,
"Sound": "",
"Transition": 0,
"BGName": 0,
"BGEffect": 0,
"PopupFileName": "",
"ScriptKr": "#2;dl\n#4;dr\n#wait;1000",
"TextJp": "",
"VoiceJp": ""
},
https://www.bilibili.com/video/av756548781/?p=8&t=325
h
{
"GroupId": 11050,
"SelectionGroup": 0,
"BGMId": 0,
"Sound": "",
"Transition": 0,
"BGName": 0,
"BGEffect": 0,
"PopupFileName": "",
"ScriptKr": "1;헬멧단 A;00\n5;헬멧단 B;00\n#1;m2\n#5;m4\n#1;h\n#5;h\n#wait;1000",
"TextJp": "",
"VoiceJp": ""
},
{
"GroupId": 11050,
"SelectionGroup": 0,
"BGMId": 0,
"Sound": "",
"Transition": 0,
"BGName": 0,
"BGEffect": 0,
"PopupFileName": "",
"ScriptKr": "1;헬멧단 A;00\n5;헬멧단 B;00\n#1;h\n#5;h\n#1;dl\n#5;dl\n#wait;1000",
"TextJp": "",
"VoiceJp": ""
},
robots.txt
这个 issue 用来汇总剧情和 momotalk 里缺失的(裂掉的)图片。
Issue 会永久开启,不会关闭。
如果下表中有未收集到的裂掉的图片,欢迎留言提出。
PWA 后台使用 StaleWhileRevalidate 获取新的 js 脚本并重载后,当前 router 会失效,给用户应用无响应的感觉
后续应该加入弹窗提示用户重载页面已应用更新
【涉及UI个人隐私,不做公开处理】
—
—
No response
需要打开菜单才可以,把判断逻辑提前
--
No response
此信息已过时,参考 #24 .
我想了一下,本来是想解包出来之后直接用韩国人的数据结构的,但是想起来件重要的事就是他们只有日语,不用做翻译,所以还是得自己实现
聊天大体上可以分成羁绊剧情前和羁绊剧情后,使用 before
和 after
进行区分。
before
: Array
放置进入羁绊剧情前的 momotalk 内容。
after
: Array
放置完成羁绊剧情后的 momotalk 内容。
chats:
before: [...chat_before]
after: [...chat_after]
type
: String<chat>
标记聊天组件的样式。纯文本信息当中,type
的值为 chat
。(是否应该使用 string
作为值?)
content
: Object<content.zh, content.jp>
标记聊天组件的内容。纯文本信息中,content
的值为 Object
。
content.zh
: String
简体中文聊天内容。
content.ja
: String
日语聊天内容。
sender
: String
标记聊天信息是由谁发出的。一般只有 student
和 teacher
两个取值。
chats:
before:
- type: chat
content:
zh: 一直以来承蒙照顾。
ja: いつもお世話になっております。
sender: student
- type: chat
content:
zh: ……
ja: ……
sender: student
type
: String<image>
标记聊天组件样式为图片。
url
: String<link>
标记图片的 url。
sender
: String
同“普通文本信息”。
- type: image
url: "~.webp"
sender: student
type
: String<option>
标记组件样式为选择肢。
options
: Array<option>
存放选择肢内容。
option.content
: Object
因为老师的回复只出现过字符串,因此应该可以认为只需要记录文字内容(中文、日语)。
option.content.zh
: String
老师的回复(中文)
option.content.ja
: String
老师的回复(日语)
selection
: Number
标明这个选项会触发学生哪一段学生回复。
sender
: String
同“普通文本信息”
- type: option
options:
- content:
zh: ……现在?大晚上的……?
ja: ……今?まだ夜中なのに……?
selection: 1
- content:
zh: 我在做梦……?
ja: 夢……?
selection: 2
sender: teacher
type
: String<diversion>
标记这是一段根据选择不同触发不同内容的类型。
variations
: Array<selections>
存放不同触发结果。
selections.selection
: Number
对应老师选项的 selection
,触发不同的内容。
selection.replies
: Array<普通聊天信息>
见“普通文本信息”的定义。
数据结构:
- type: diversion
variations:
- selection: 1
replies:
- type: chat
content:
zh: 回复(第 1 条,共 2 条)
ja: 大丈夫、大したことじゃない
sender: student
- type: chat
content:
zh: 回复(第 2 条,共 2 条)
ja: じゃあ、またね。先生
sender: student
- selection: 2
replies: [...chats]
type
: String<link>
标记这是一个 router-link
,点击将会跳转到对应的羁绊内容。
content
: Object
content.zh
, content.ja
:定义按钮显示的文字。
link
: String
标记 router-link to="…"
的跳转目标。
数据结构:
- type: link
content:
zh: 前往xx的羁绊剧情
ja: xxの絆ストーリーへ
link: 10024_story_01
希望能够自定义学生回复时打字速度,目前的没看出是一个随机数还是一个固定值,但是比较久
如果选择跳过打字这部分or加速这部分时间,可能可以让sensei的体验更好(不是为了仿的更真)
想法:
个人目前就是直接用脚本加速了,因为学生的打字时间加起来真的很长
抽出统一的进度条组件
No response
translated by 太长了,改成中文看看,两天前想到了但老是忘掉
This issue lists Renovate updates and detected dependencies. Read the Dependency Dashboard docs to learn more.
These updates have all been created already. Click a checkbox below to force a retry/rebase of any.
@babel/preset-env
, @csstools/css-parser-algorithms
, @csstools/css-tokenizer
, @rushstack/eslint-patch
, @types/node
, @typescript-eslint/eslint-plugin
, @typescript-eslint/parser
, @vue/compiler-sfc
, @vueuse/core
, gsap
, prettier-plugin-css-order
, sass
, typed.js
, vue-tsc
).github/workflows/codeql.yml
actions/checkout v3
github/codeql-action v2
github/codeql-action v2
github/codeql-action v2
.github/workflows/format-and-lint.yml
actions/checkout v3
peter-evans/commit-comment v2
.github/workflows/issue-checker.yml
zzyyyl/issue-checker v1.7
actions/add-to-project v0.5.0
.github/workflows/publish.yml
actions/checkout v3
pnpm/action-setup v2
package.json
@pixi/loaders >=6.1.0 <7.0.0
@pixi/particle-emitter ^5.0.8
@vue/compiler-sfc 3.x
@vueuse/core ^10.0.0
axios 1.4.0
axios-retry 3.5.0
fastest-levenshtein 1.0.16
gsap ^3.11.3
husky ^8.0.3
ismobilejs ^1.1.1
mitt ^3.0.0
pinia 2.1.3
pinia-plugin-persistedstate 3.1.0
toastify-js 1.12.0
typed.js ^2.0.12
vue 3.3.4
vue-router 4.2.2
xxhashjs ^0.2.2
@babel/preset-env ^7.20.2
@csstools/css-parser-algorithms ^2.1.0
@csstools/css-tokenizer ^2.1.0
@rushstack/eslint-patch 1.3.0
@trivago/prettier-plugin-sort-imports 4.1.1
@types/node ^18.11.9
@types/toastify-js 1.11.1
@types/xxhashjs ^0.2.2
@typescript-eslint/eslint-plugin 5.59.8
@typescript-eslint/parser 5.59.8
@vitejs/plugin-legacy 4.0.4
@vitejs/plugin-vue 4.2.3
@vue/eslint-config-typescript 11.0.3
chalk 5.2.0
eslint 8.42.0
eslint-config-prettier 8.8.0
eslint-plugin-import 2.27.5
eslint-plugin-sort-exports 0.8.0
eslint-plugin-vue 9.14.1
eslint-plugin-yaml 0.5.0
js-yaml 4.1.0
postcss 8.4.24
postcss-plugin-px2rem 0.8.1
postcss-preset-env 8.4.2
prettier 2.8.8
prettier-plugin-css-order 1.3.0
rollup-plugin-visualizer 5.9.0
sass 1.62.1
terser 5.17.7
typescript 5.1.3
vite 4.3.9
vite-plugin-clear-console ^0.2.2
vite-plugin-compression 0.5.1
vite-plugin-pwa 0.16.3
vue-tsc 1.6.5
workbox-window 7.0.0
Sound
播放特效音BGMId
播放 BGM (BGMId 不变时进行循环播放)VoiceJp
播放人物语音Sound
播放特效音BGMId
播放 BGM (BGMId 不变时进行循环播放)当初为什么会想用装甲做filter的……
No response
好强好强 强而有力
rt,先选第二个选项之后切换到第一个选项,
sensei出现一个空回复(其实应该是静子的),并且静子的回复没有头像,是给顶掉了?
正常应该这样↓
并且刚刚在测试的时候出现这种情况↓
rt,先选选项1再切换选项2会造成无返回文本
https://blue-archive.io/archive/26008/momotalk
先选第二个选项之后切换到第一个选项和先选第一个再切第二个都会出错
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.