diff --git a/public/project/floors/MT12.js b/public/project/floors/MT12.js
index 4bf82a1..77bfb17 100644
--- a/public/project/floors/MT12.js
+++ b/public/project/floors/MT12.js
@@ -18,32 +18,23 @@ main.floors.MT12=
"parallelDo": "",
"events": {
"7,1": [
- "\t[原始人]\b[down,hero]欸,杰克兄弟,你怎么在这啊",
- "\t[杰克,thief]\b[down,7,1]啊,是你呀",
- "\t[杰克,thief]\b[down,7,1]我刚刚被一群怪物追杀,就逃到这里了",
- "\t[杰克,thief]\b[down,7,1]很奇怪,为什么这几天有这么多凶猛的怪物啊",
- "\t[原始人]\b[down,hero]不知道,我记得上一次这样,还是在老虎们在山间找不到食物,下山觅食的时候吧",
- "\t[原始人]\b[down,hero]难道说山上发生了什么灾害吗",
- "\t[杰克,thief]\b[down,7,1]好像有吧",
- "\t[杰克,thief]\b[down,7,1]我前几天还看见一道雷准准地劈在了山顶上",
- "\t[原始人]\b[down,hero]难道是山火吗",
- "\t[原始人]\b[down,hero]不对呀,山火的话我怎么没看见烟啊",
- "\t[杰克,thief]\b[down,7,1]不清楚,反正上面发生了我们不知道的事",
- "\t[原始人]\b[down,hero](这山上肯定发生了什么不得了的好事,我去了说不定还能找到不少好东西呢)",
- "\t[原始人]\b[down,hero]我要去山上走一遭",
- "\t[杰克,thief]\b[down,7,1]哈?",
- "\t[杰克,thief]\b[down,7,1]兄弟,你不是在骗我吧",
- "\t[杰克,thief]\b[down,7,1]山上这么危险,去了难道不是死路一条?",
- "\t[原始人]\b[down,hero]我最近力量提升很快,所以你不用担心我",
- "\t[杰克,thief]\b[down,7,1]但山上的怪物的强大你也知道,我们十来个人一起去打一个都被打得落荒而逃",
- "\t[原始人]\b[down,hero](我要不要把绿宝石的事告诉他呢?这一路上有很多绿宝石,他却没有提到,难道他看不见吗?)",
- "\t[原始人]\b[down,hero](感觉事情很奇怪,还是别告诉他了吧)",
- "\t[原始人]\b[down,hero]我有特殊的方法保命,你不需要操心太多",
- "\t[杰克,thief]\b[down,7,1]那看来我也拦不住你了",
- "\t[杰克,thief]\b[down,7,1]山地那边有一个地方被突然凸起来的高地挡着",
- "\t[杰克,thief]\b[down,7,1]我就把我新学的技能教给你吧",
+ "\t[原始人]\b[down,hero]杰克?你怎么在这?",
+ "\t[杰克,thief]\b[down,7,1]我刚刚出山洞,就发现了一堆怪物。",
+ "\t[杰克,thief]\b[down,7,1]那些怪物冲着我就跑过来,我根本打不过他们。",
+ "\t[杰克,thief]\b[down,7,1]我就跑到了这里。",
+ "\t[杰克,thief]\b[down,7,1]多谢你救了我。",
+ "\t[原始人]\b[down,hero]不用多谢了,咱都是兄弟的。",
+ "\t[杰克,thief]\b[down,7,1]你来这里是要干什么?",
+ "\t[原始人]\b[down,hero](他好像没有注意到绿色结晶,就不要提这件事了吧)",
+ "\t[原始人]\b[down,hero]我要上山砍一些柴火。",
+ "\t[原始人]\b[down,hero]但是上山的路被强大的怪物堵死了,我根本上不去。",
+ "\t[杰克,thief]\b[down,7,1]这样啊。",
+ "\t[杰克,thief]\b[down,7,1]正好,我最近学会了一招,能让你避开那些怪物,我来教给你吧!",
"获得技能:跳跃\n快捷键2,消耗200点生命值,困难消耗400点,一个地图只能使用3次\n如果前方为可通行的地面,则不能使用该技能\n如果前方为怪物,则将怪物移至勇士视线上第一个不能通行的方块后\n如果前方为障碍物,则直接跳到该障碍物的后方",
- "\t[原始人]\b[down,hero]多谢兄弟了!",
+ "\t[原始人]\b[down,hero]多谢杰克兄弟了啊。",
+ "\t[杰克,thief]\b[down,7,1]不过还是要小心山上的那些怪物,那些怪物都很强。",
+ "\t[原始人]\b[down,hero]我明白,但是我必须上山,不然都要饿死冻死了。",
+ "\t[杰克,thief]\b[down,7,1]那我就不打扰你了,咱们之后再见。",
"去南方那个之前过不去的地方推进游戏剧情",
"手机端可以点击右下角的难度来切换下方工具栏至数字键",
{
diff --git a/src/data/desc.json b/src/data/desc.json
index 117f46f..b7fb3ea 100644
--- a/src/data/desc.json
+++ b/src/data/desc.json
@@ -1,4 +1,30 @@
{
+ "tip": {
+ "text": "注意事项",
+ "condition": "true",
+ "desc": [
+ "这里显示本塔中需要注意的事项。",
+ "
",
+ "
",
+ "1. 本塔中几乎所有 ui 都可以纵向滚动,如果发现显示不全,",
+ "可以尝试上下拖动,就像浏览网页一样。电脑端还可以使用滚轮上下滚动。",
+ "大部分可以纵向滚动的 ui 都会在右方有一个滚动条,也可以拖动它进行滚动,例如本百科全书的条目列表和",
+ "条目说明都是可以通过上述方式滚动的。",
+ "
",
+ "
",
+ "2. 本百科全书的内容会随着游戏的推进而增加新内容,",
+ "同时每次增加新内容时都会有提示。",
+ "
",
+ "
",
+ "3. 本塔主要面向电脑端设计,",
+ "建议使用电脑游玩以获得更好的游戏体验。但是手机依然可以游玩本塔,",
+ "但部分操作可能不是很方便,ui 也可能不是很美观,不过依然可以完整体验本游戏。",
+ "
",
+ "
",
+ "4. 对于手机端,可以点击右下角的难度文字来切换工具栏至数字键。",
+ "这样,你可以更加方便地进行使用技能等操作。"
+ ]
+ },
"statusBar": {
"text": "状态栏",
"condition": "true",
@@ -60,8 +86,8 @@
"
",
"1. 打开怪物手册,选中怪物,进入怪物更多信息栏,点击标记怪物。",
"
",
- "2. 将鼠标移动到你想要标记的怪物上面,按下",
- "M键,即可标记怪物,注意浏览地图中不能用该方式标记。",
+ "2. 将鼠标移动到你想要标记的怪物上面,",
+ "按下M键,即可标记怪物,注意浏览地图中不能用该方式标记。",
"手机端暂时没有快速标记怪物的方式。",
"
",
"
",
@@ -99,20 +125,27 @@
"
",
"
",
"点击一个怪物或者按下回车空格后,将进入怪物详细信息界面。这个界面分为多个栏,分别是特殊属性栏,详细临界栏,更多信息栏。",
- "进入怪物详细信息后默认在特殊属性栏,该栏可以查看怪物的特殊属性。注意特殊属性依然可以纵向滚动。在特殊属性下方,",
+ "进入怪物详细信息后默认在特殊属性栏,该栏可以查看怪物的特殊属性。",
+ "同时也是唯一一个会在点击后返回到怪物手册界面的栏,更多信息请查看本条目的最后一段。",
+ "注意特殊属性依然可以纵向滚动。在特殊属性下方,",
"是怪物的临界表,可以粗略地查看怪物的临界信息。在下方,你可以点击详细临界信息进入详细临界栏。",
"
",
"
",
"在详细临界栏中,怪物的伤害会以可视化折线图的方式显示出来,从而你可以更为清晰地看出怪物减伤趋势。",
"除了查看怪物伤害曲线,你还可以规划宝石。每个折线图下方都有一个滑动条,你可以拖动来模拟吃宝石。",
- "注意,拖动时,滑动条左边会显示当前的加攻或加防次数,这个数值指的是在勇士所在地图中需要吃的宝石数量。",
- "例如,当前勇士所在地图中一个宝石最低加2点攻击,加攻次数为3,那么勇士的攻击增加量就为6。",
+ "注意,拖动时,滑动条左边会显示当前的加攻或加防次数,这个数值指的是在勇士所在地图中需要吃的最弱的宝石数量。",
+ "例如,当前勇士所在地图中最弱的宝石加2点攻击,加攻次数为3,那么勇士的攻击增加量就为6。",
"勇士增加的攻击数值也会在下方显示。当加攻次数和加防次数改变时,折线图也会变化。",
"当前状态下怪物的伤害以及减伤总量也会在下方显示。",
"
",
"
",
"在特殊属性栏,点击下方的怪物更多信息可以进入更多信息栏。此栏中,你可以查看怪物描述。但这不是这一栏的核心功能。",
- "这一栏的核心功能是标记怪物。被标记的怪物会有一些非常方便的行为,这些行为可以在“标记怪物”说明中查看。"
+ "这一栏的核心功能是标记怪物。被标记的怪物会有一些非常方便的行为,这些行为可以在“标记怪物”条目中查看。",
+ "
",
+ "
",
+ "注意,在怪物详细信息中,只有特殊属性栏可以通过点击返回到怪物手册界面,详细临界与更多信息栏均不行。",
+ "如果你是电脑端,在任意栏目中按下X键会退出怪物手册,返回游戏,",
+ "按下回车(Enter)键会回到怪物手册界面。"
]
},
"tools": {
@@ -153,13 +186,14 @@
"2. 生命回复:",
"生命回复指的是勇士每回合回复的生命值。当与怪物战斗时,勇士每回合都会回复对应量的生命值。因此,当吃攻击时,",
"与怪物战斗的回合数可能会减少,导致生命回复的总回复量减少。不过大部分情况下不需要在意这一点,",
- "减少一回合并不会对吸的血造成很大的影响。该项会显示在状态栏的生命值右方偏下的位置",
+ "减少一回合并不会对吸的血造成很大的影响,除了一些特殊情况。",
+ "该项会显示在状态栏的生命值右方偏下的位置。",
"
",
"
",
"3. 额外攻击:",
"额外攻击指的是勇士每回合的额外造成的伤害。一般情况下,当勇士破了怪物的防御时,该项便会起作用。",
"额外攻击相当于魔攻,无法通过一般方式减免。当勇士攻击怪物时,每回合都会附加对应量的伤害,对坚固怪同样有效。",
- "额外攻击会显示在状态栏的攻击右方偏下的位置"
+ "额外攻击会显示在状态栏的攻击右方偏下的位置。"
]
},
"skillTree": {
@@ -176,7 +210,7 @@
"
",
"
",
"打开技能树页面后,你可以在上方看到技能的名称与描述,下方会显示技能树,以及升级要求等。点击一个技能可以选中技能,",
- "再次点击可以升级技能。",
+ "再次点击可以升级技能。注意,前置技能栏可以上下滚动,因此如果发现显示不全,可以尝试上下滚动前置技能栏",
"
",
"
",
"注意,技能在点开之后是无法取消的,因此,加点时请慎重加点。注意,部分技能是必点技能,这些技能会在技能说明中明确指出,",
diff --git a/src/plugin/ui/fly.ts b/src/plugin/ui/fly.ts
index dc93956..dd20e5b 100644
--- a/src/plugin/ui/fly.ts
+++ b/src/plugin/ui/fly.ts
@@ -1,17 +1,26 @@
+import { has } from '../utils';
+
export default function init() {
return { splitArea };
}
+type BFSFromString = `${FloorIds},${number},${number},${Dir}`;
+type BFSToString = `${FloorIds},${number},${number}`;
+
interface MapBFSResult {
maps: FloorIds[];
- link: Record<
- `${FloorIds}_${number}_${number}_${Dir}`,
- `${FloorIds}_${number}_${number}`
- >;
+ link: Record;
}
const bfsCache: Partial> = {};
+const arrow: Partial> = {
+ leftPortal: 'left',
+ rightPortal: 'right',
+ upPortal: 'up',
+ downPortal: 'down'
+};
+
export function splitArea() {}
export function getMapData(floorId: FloorIds) {}
@@ -23,13 +32,42 @@ export function getMapDrawData(floorId: FloorIds) {}
* @param floorId 中心楼层id
* @param noCache 是否不使用缓存
*/
-function bfs(floorId: FloorIds, noCache: boolean = false) {
- if (bfsCache[floorId] && !noCache) return bfsCache[floorId];
+function bfs(floorId: FloorIds, noCache: boolean = false): MapBFSResult {
+ if (has(bfsCache[floorId]) && !noCache) return bfsCache[floorId]!;
const queue = [floorId];
- const used: Partial> = {};
+ const used: Partial> = {
+ [floorId]: true
+ };
+ const floors = [floorId];
+ const link: Record = {};
while (queue.length > 0) {
const now = queue.shift()!;
+ const change = core.floors[now].changeFloor;
+ const blocks = core.getMapBlocksObj(now);
+ for (const [loc, ev] of Object.entries(change)) {
+ const target = ev.floorId as FloorIds;
+ if (target.startsWith(':')) continue;
+ const block = blocks[loc as LocString];
+ const id = block.event.id;
+ if (id in arrow) {
+ const from = `${now},${loc},${arrow[id]}` as BFSFromString;
+ const to = `${target},${ev.loc![0]},${
+ ev.loc![1]
+ }` as BFSToString;
+ link[from] = to;
+ if (!used[target]) {
+ queue.push(target);
+ floors.push(target);
+ }
+ }
+ }
+ used[now] = true;
}
+
+ return {
+ maps: floors,
+ link
+ };
}
diff --git a/src/types/map.d.ts b/src/types/map.d.ts
index 42a05aa..7e3a0e5 100644
--- a/src/types/map.d.ts
+++ b/src/types/map.d.ts
@@ -23,7 +23,7 @@ type CompressedMap = Omit<
NotCopyPropertyInCompressedMap
>;
-interface Block {
+interface Block = Exclude> {
/**
* 横坐标
*/