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> { /** * 横坐标 */