From 274fe93483d1d523d346001943b114561be21c69 Mon Sep 17 00:00:00 2001 From: egamerainy1022 Date: Fri, 31 Jan 2025 22:33:26 +0800 Subject: [PATCH 1/5] =?UTF-8?q?=E5=B0=9D=E8=AF=95=E9=87=8D=E6=96=B0?= =?UTF-8?q?=E5=AF=B9=E8=BD=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- project/events.js | 4 - project/plugins.js | 1140 ++++++++++++++++++++++---------------------- 2 files changed, 570 insertions(+), 574 deletions(-) diff --git a/project/events.js b/project/events.js index 5c6c1a0..ce6dc94 100644 --- a/project/events.js +++ b/project/events.js @@ -5858,10 +5858,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "memory2": false, "time": 30, "style": "引出" - }, - { - "type": "comment", - "text": "下一场景是追捕羽化病少年...做个标记" } ], "chapter03": [ diff --git a/project/plugins.js b/project/plugins.js index bd0456e..a532873 100644 --- a/project/plugins.js +++ b/project/plugins.js @@ -18823,574 +18823,574 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 = }; }, "剧情内容": function () { - // 在此增加新插件 - // 每项为一个数组,第一项是名字,第二项是对话内容 - // 回放只会在同一个this下回放,进入剧情前请以事件块声明进入哪个剧情数组 - // 可以自由添加,但不能与已有插件及函数名相同,可以使用中文。 - this.chapter0 = [ - ["", "这些天,街道不曾下雨。"], - ["", "所以,那浸湿地面的,定是那些女孩们流落的鲜血无疑。"], - ["", "我蹲在充斥着铁锈味般恶臭的小巷中,悠闲地如是想着。"], - ["", "扑哧。"], - ["", "耳旁再次响起象征着某个女孩子死去的声音。"], - ["", "再一次——"], - ["", "再一次。"], - ["", "女子们被肢解成单纯的肉块。"], - ["", "我任由流下的血浸满全身,屏住自己的呼吸。"], - ["", "祈求自己能拥有从猎人手中逃脱的幸运。"], - ["", "扑哧。"], - ["", "直到刚才,我们还坐在去往娼馆的马车的路上。"], - ["", "而在这之中的某些人,已经不在这个世上了。"], - ["", "不,应该把“某些”换成“几乎所有”才更为恰当吧。"], - ["", "恐怕,不久之后我也会变成小巷中血腥的装饰品。"], - ["", "我是为了得到这种死法,才辛苦苟活至今的吗?"], - ["", "来个人告诉我啊——"], - ["", "谁都好。"], - ["", "来人啊!!"], - ["少女", "「呃······!?」"], - ["", "漆黑的物体充斥了我的整个视野"], - ["", "我很快意识到,那是只很大的脚。"], - ["", "必须要出声求救。"], - ["", "可是,耳中却只能听到自己的牙关不停交战的声音。"], - ["", "我是如此的无助。"], - ["", "逃跑也好,道歉也罢。"], - ["", "就连抬头看一眼将要杀掉我的人的面孔都做不到。"], - ["少女", "「······被杀」"], - ["", "会被杀。"], - ["", "会被杀!!"], - ["", "来自内心深处的冰冷预感,渐渐地在体内蔓延开来。"], - ["少女", "「不,不要······」"], - ["", "浮游都市,《诺瓦斯·艾蒂尔》。"], - ["", "《特别受灾地区》——"], - ["", "通称,《牢狱》"], - ["", "是被险峻的峭壁环绕,与世隔绝的,都市的最底部。"], - ["年轻人", "「放开我!」"], - ["年轻人", "「我只是在帮那个女人而已!」"], - ["年轻人", "「你们没听到吗!?」"], - ["年轻人", "「她是被受骗才会被卖到娼馆来的」"], - ["年轻人", "「用肮脏的手段把钱借给她父母的,就是你们这些家伙吧!?」"], - ["年轻人", "「给我说些什么啊」"], - ["凯伊姆", "「这些话等到了娼馆再说吧」"], - ["凯伊姆", "「我来抓你,只是受雇于人而已」"], - ["", "我走进娼馆《莉莉乌姆》的接待室。"], - ["", "正在桌旁整理账簿的奥兹停下手头的工作,抬起头向我看来。"], - ["奥兹", "「这不是凯伊姆先生吗,辛苦了」"], - ["奥兹", "「委托已经完成了吗?」"], - ["凯伊姆", "「啊啊,是这家伙没错吧」"], - ["", "奥兹用只要接触到就能杀人般的眼神在男人脸上搜过。"], - ["奥兹", "「没错,就是这个人」"], - ["凯伊姆", "「是么」"], - ["年轻人", "「你,你们要对我做什么」"], - ["奥兹", "「······」"], - ["", "奥兹用一个眼神,就让男人闭上了嘴。"], - ["", "然后,向我这边转过身来。"], - ["奥兹", "「抱歉啊,总是麻烦你去做这些无聊的事」"], - ["奥兹", "「都怪我们这边的年轻人太没用」"], - ["凯伊姆", "「客套话就免了」"], - ["奥兹", "「这还真是失礼了」"], - ["奥兹", "「喂,来个人」"], - ["光头男人", "「是」"], - ["奥兹", "「凯伊姆先生做完工作回来了」"], - ["光头男人", "「是,是,那个······」"], - ["奥兹", "「我是要你拿些酒来,这个蠢材!」"], - ["", "喀!"], - ["", "奥兹扔出的烟灰缸砸中了手下的额头。"], - ["", "鲜血四溅。"], - ["凯伊姆", "「不用这么麻烦」"], - ["凯伊姆", "「我接下来要去《菲诺列塔》」"], - ["奥兹", "「喔唷」"], - ["奥兹", "「既然如此,我就不留您在这里喝难饮的劣质酒了」"], - ["", "奥兹斜眼看着正捂住额头呻吟的手下,轻描淡写地说道。"], - ["凯伊姆", "「用这些钱去买药」"], - ["", "我将几枚铜钱仍在那个手下的身前。"], - ["奥兹", "「凯伊姆先生,不用对他们这么好」"], - ["凯伊姆", "「无妨」"], - ["凯伊姆", "「话说回来,那个要落跑的女人呢?」"], - ["奥兹", "「我把她交给那些年轻人了,现在应该正在体会人生的严苛吧」"], - ["奥兹", "「正好,趁此机会凯伊姆先生也来享受一番如何?」"], - ["年轻人", "「你,你们这些家伙,要对她做什么!?」"], - ["", "咣!"], - ["", "奥兹给了他一拳。"], - ["", "一击即倒。"], - ["", "喀,咚,咯!"], - ["", "奥兹毫不留情地向男人的脸上踩去。"], - ["年轻人", "「咕······呃咳······」"], - ["", "折断的牙齿伴着血泡被吐出。"], - ["", "这份白色在鲜红色的液体中格外显眼。"], - ["年轻人", "「你们以为做出这种事······卫兵会坐视不理吗······」"], - ["奥兹", "「啊啊,不会坐视不理的」"], - ["奥兹", "「应该会拿出你的钱包,和我们商量如何瓜分吧」"], - ["年轻人", "「那,那种事······」"], - ["", "这在牢狱是理所当然的事。"], - ["奥兹", "「怎么,头一回来牢狱么?」"], - ["", "男人点了点头。"], - ["奥兹", "「为了被骗的女人而来到牢狱,真是个规矩人啊」"], - ["奥兹", "「······前提是,被骗的人不是你」"], - ["年轻人", "「你说······我被骗了?」"], - ["年轻人", "「那,那是怎么回事!?」"], - ["奥兹", "「不用急,今天晚上会好好告诉你的」"], - ["", "奥兹抓起男人的脸。"], - ["", "为引诱客人的怜悯之心而装纯,是娼妇的惯用手段。"], - ["", "双亲被骗而借钱,结果作为抵押而将自己卖到这里,这是典型的说法。"], - [ - "", - "如果只是头脑发热而成为常客也就罢了,这次的男人热血过头,居然想出了要带女人私奔的计划。", - ], - [ - "", - "虽然女人半开玩笑地予以拒绝,但不知天高地厚的这家伙还是拉着她逃跑了。", - ], - ["", "不过,想要逃脱追击本来就是不可能的任务。"], - ["", "但即便如此,这种事情还是会一再的出现。"], - ["", "说谎的女人和被骗的男人。"], - ["", "在娼馆街,这是令人看到生厌的日常的风景。"], - ["凯伊姆", "「我要走了」"], - ["奥兹", "「好的,下次再麻烦您」"], - ["奥兹", "「之后吉克先生会将谢礼交给您的」"], - ["凯伊姆", "「啊啊」"], - ["", "我背向奥兹走出娼馆。"], - ["凯伊姆", "「······?」"], - ["", "从远方传来微弱的歌声。"], - ["", "是关卡广场的方向。"], - ["", "对了。"], - ["", "今天有觐见圣女的仪式。"], - ["", "当代的圣女伊莲——"], - ["", "俗称《盲眼之圣女》,据说即使在历代的圣女中,人气也是数一数二的。"], - ["", "广场上的人估计相当多吧。"], - ["", "虽然我也想去看看她长什么样,不过要在人潮中挤来挤去就免了。"], - ["", "还是老老实实去菲诺列塔喝烧酒吧。"], - ["", "正当我这样想着的时候,一个身影自小巷的那头走来。"], - ["凯伊姆", "「艾莉斯」"], - ]; - this.chapter01 = [ - ["艾莉斯", "「啊,凯伊姆」"], - ["艾莉斯", "「正好,我还想要去找你呢」"], - ["艾莉斯", "「没想到凯伊姆会主动出现······这是命运吗?」"], - ["凯伊姆", "「显然不是吧」"], - ["艾莉斯", "「啊,是么」"], - ["", "艾莉斯挑了挑整齐的双眉,微微地哼了一声。"], - [ - "", - "虽然是个相当引人注目的美人,但她这个将亲切儿子丢入无底深渊的性格,为自己扣了不少的分", - ], - ["", "给人印象最深的,就是那潭水般的双瞳。"], - ["", "在漆黑的瞳孔中,完全看不出感情的波动。"], - ["艾莉斯", "「喜欢我的眼睛吗?」"], - ["艾莉斯", "「如果想要的话就给你吧?」"], - ["凯伊姆", "「用不着」"], - ["艾莉斯", "「阿拉,可惜」"], - ["凯伊姆", "「那么,找我有什么事」"], - ["艾莉斯", "「梅尔特的钱好像被偷了」"], - ["凯伊姆", "「钱被偷了?都几岁了还这么没用」"], - ["艾莉斯", "「不要对我说啊」"], - ["凯伊姆", "「那家伙,该不会说要让我去抓那个小偷吧?」"], - ["艾莉斯", "「就是这样」"], - ["凯伊姆", "「笨蛋吗」"], - ["凯伊姆", "「如果是小钱的话,就当做是买个教训吧」"], - ["艾莉斯", "「说起来,被盗的是这个月的上纳金」"], - ["凯伊姆", "「你说什么?」"], - ["艾莉斯", "「用这些钱买教训,也太过奢侈了呢」"], - ["凯伊姆", "「知道了,我去找」"], - ["凯伊姆", "「小偷的特征呢」"], - ["艾莉斯", "「男孩子」"], - ["艾莉斯", "「······而且,背后有翅膀」"], - ["艾莉斯", "「虽然姑且是藏在身后,但是仔细观察的话是很明显的」"], - ["凯伊姆", "「羽化病吗」"], - [ - "艾莉斯", - "「那些人可是毫不留情的,所以即使是为了那个孩子,也要赶快抓到他」", - ], - ["凯伊姆", "「注意到他逃窜的方向了吗?」"], - ["艾莉斯", "「广场那边」"], - ["艾莉斯", "「虽然刚才《不蚀金锁》的人去追了,不过多半是······」"], - ["凯伊姆", "「偏偏还是广场吗」"], - ["艾莉斯", "「今天是觐见圣女大人的日子」"], - ["凯伊姆", "「我知道」"], - ["凯伊姆", "「尽量找找看就好」"], - ]; - this.chapter02 = [ - ["不蚀金锁成员", "「凯伊姆先生,凯伊姆先生」"], - ["不蚀金锁成员", "「您已经和艾莉斯大夫见过面了吗?」"], - ["凯伊姆", "「啊啊,所以才会追过来的」"], - ["凯伊姆", "「看到小偷了吗?」"], - [ - "不蚀金锁成员", - "「没有,他向广场那边逃了过去,今天这么拥挤,我们也只能放弃了」", - ], - [ - "不蚀金锁成员", - "「不过,我也只是刚好在店里所以才追了过去,并不是受人所托」", - ], - ["不蚀金锁成员", "「我已经准备撤退了」"], - ["不蚀金锁成员", "「凯伊姆先生还要继续追吗?」"], - ["凯伊姆", "「啊啊」"], - ["", "做完情报交换之后,我跟男人道别。"], - ["凯伊姆", "「和我想的一样啊······」"], - ["", "在牢狱中最大的广场上,聚集着看不到尽头的人群。"], - ["", "就算是来参见圣女祈祷,这人数也太多了点吧。"], - ["", "自然,我也找不到逃跑的孩子。"], - ["", "是混杂到人群中了吧。"], - ["", "如果已经从广场上脱身了的话,就更难发现了。"], - ["", "只好赌他还在这里了。"], - ["", "我先移动到了一个视野良好的地方。"], - ["", "从这里,一眼就可以看到人群的变化。"], - ["", "广场还是沸腾起来。"], - ["", "抬头望去,原来是在天台之上出现了一个人影"], - ["", "但是,与周围的期待不同,现身的是一名中年的神官。"], - ["", "骂声四溢。"], - ["", "神官则是笑着摆正衣领"], - ["神官", "「从现在开始,举行谒见的仪式」"], - [ - "神官", - "「在参见那位大人之前,我希望牢狱的诸位再次思考这个《诺瓦斯·艾蒂尔》存在的意义······」", - ], - [ - "神官", - "「初代圣女伊莲大人,便是也难怪这崇高的祈祷之力,令《诺瓦斯·艾蒂尔》浮在空中,拯救了我们的祖先」", - ], - [ - "神官", - "「这之后的几百年来,传承了初代大人力量的历代圣女伊莲大人,让这里留在了空中」", - ], - [ - "神官", - "「这座都市是被圣女大人守护的人类最后的圣域,而我们则是被选召的虔诚的信徒」", - ], - ["神官", "「怀着对圣女的感激祈祷吧,感谢圣女伊莲吧!并献上祈祷!」"], - ["圣女", "「不忘感谢与祈祷,神才会拯救我们」"], - ["圣女", "「与我一起,向神虔诚地祈祷吧」"], - ["", "广场上欢声雷动。"], - ["", "圣女没有回应喧嚣的人声,而是静静地合上双眼面向广场。"], - ["", "虽然感觉有些冷淡,但总比像个傻瓜似的笑着向这群人挥手要强。"], - ["", "她掌握着这条街道,还有在这条街上生活的人的命运。"], - ["", "比起揽得人气,她更想要为了街道的继续存在而献出全力。"], - ["", "也是为了不让《大崩落》的惨剧再度发生。"], - ["", "十几年前的那场悲剧。"], - [ - "", - "虽然在我脑海中的记忆已经相当模糊,但哪怕只是稍有触及,不快的感觉都会在胸口蔓延开。", - ], - ["凯伊姆", "「······」"], - ["", "这时我才想起,现在不是我在这里看圣女的时候。"], - ["女声", "「——っ!?」"], - ["围观的女人", "「羽,羽化病人!?」"], - ["围观的中年人", "「喂,谁去叫下羽狩」"], - ["惊慌的观众", "「你这家伙不要靠近我,要是传染了可怎么办」"], - ["粗鲁的观众", "「你这小鬼赶快滚开」"], - ["凯伊姆", "「接下来」"], - ["圣女", "「发生什么事了?看上去似乎很嘈杂」"], - ["随从", "「似乎是某个人逃跑了······具体的我也不是很清楚」"], - ["神官", "「圣女大人,继续待在天台上可能会出事,请您先回到室内吧」"], - ["圣女", "「不用在意我,比起那个,我更关心究竟发生了什么事」"], - ["神官", "「对不起,我真的不知道」"], - ["圣女", "「······是吗」"], - ["男", "「恕我僭越,请准许我说明情况」"], - ["男", "「在来觐见的人群中出现了《羽化病》的患者」"], - ["男", "「围观的人群因而产生了骚动」"], - [ - "男", - "「现在,《防疫局》已经派遣了部队。我想不久之后,他们就会安静下来了」", - ], - ["圣女", "「羽化病······」"], - ["男", "「怎么了?」"], - ["圣女", "「没什么」"], - ["圣女", "「辛苦了,你的名字是?」"], - ["男", "「属下是在防疫局任职的,鲁基乌斯· 迪斯·米利尤」"], - ["神官", "「噢噢,阁下就是鲁基乌斯卿吗,我听说过你的传闻」"], - ["神官", "「阁下是在工作上相当出色的人呢」"], - ["鲁基乌斯", "「不敢当」"], - [ - "鲁基乌斯", - "「话说回来,这次是属下警备工作的失职。让圣女大人见到这不成体统的一面,请您见谅」", - ], - [ - "圣女", - "「即使是目不见物的我,也能感受到聚集于此的民众数量之多。警备工作难以展开也在情理之中」", - ], - ["鲁基乌斯", "「属下不胜惶恐」"], - ["鲁基乌斯", "「接下来属下还要回到工作岗位上,在这里就先告退了」"], - ["圣女", "「鲁基乌斯先生」"], - ["鲁基乌斯", "「属下在」"], - ["圣女", "「你是怎样看待羽狩的工作的呢?」"], - ["神官", "「圣,圣女大人」"], - [ - "鲁基乌斯", - "「防疫局的工作是国王陛下赐予的重要职务。属下非常荣幸能够为这个都市的繁荣尽一份微薄之力」", - ], - ["神官", "「不,不亏是鲁基乌斯卿,相当优秀的想法」"], - ["圣女", "「是吗。辛苦你了」"], - ["随从", "「圣女大人······」"], - ["鲁基乌斯", "「······」"], - ["鲁基乌斯", "「那么,属下就回岗位去了」"], - ]; - this.chapter03 = [ - ["", "从羽化病的少年纷乱的足音中,可以听得出相当的疲劳。"], - ["", "显然,他并没有想到我会捷足先登吧。"], - ["", "少年惶恐地回头看了一眼后,微微露出安心的表情,双手拄在膝盖上。。"], - ["凯伊姆", "「辛苦你了」"], - ["羽化病患少年", "「稀!?」"], - ["凯伊姆", "「逃到贫民区是个不错的想法」"], - ["羽化病患少年", "「你,你是,羽狩吗?」"], - ["凯伊姆", "「不是」"], - ["羽化病患少年", "「什,什么啊······混蛋,不要吓我啊」"], - ["凯伊姆", "「我对令你受惊这件事致以歉意」"], - ["凯伊姆", "「作为回报,麻烦你把从店里偷的钱交出来吧」"], - ["羽化病患少年", "「钱?你在说什么」"], - ["凯伊姆", "「你要找的腰上的东西,掉在你身后了」"], - ["羽化病患少年", "「哎?」"], - ["羽化病患少年", "「呃呀」"], - ["羽化病患少年", "「你······你这混蛋」"], - ["凯伊姆", "「······」"], - ["凯伊姆", "「把偷的钱交出来」"], - ["羽化病患少年", "「我不知道你在······咕」"], - ["羽化病患少年", "「你,你说是我偷的······有什么证据吗」"], - ["凯伊姆", "「你还挺倔的啊」"], - ["凯伊姆", "「不过,给我听好了」"], - ["凯伊姆", "「你偷的那些钱,是要上缴给《不蚀金锁》的上纳金」"], - ["凯伊姆", "「而且,钱的主人是从前和吉克颇有渊源的女人」"], - ["羽化病患少年", "「吉克?」"], - ["凯伊姆", "「他是《不蚀金锁》的主人,这么说你就明白了吧」"], - ["羽化病患少年", "「哎?哎?怎么会······」"], - ["凯伊姆", "「再问你一遍,钱在哪里?」"], - ["羽化病患少年", "「是,是,是,在我的怀里」"], - ["凯伊姆", "「你没有擅自拿掉一部分吧」"], - ["羽化病患少年", "「是,是的」"], - ["羽化病患少年", "「那,那个,您是《不蚀金锁》的人吗?」"], - ["凯伊姆", "「算是吧」"], - ["羽化病患少年", "「我什么都可以做,请您一定要帮帮我」"], - ["凯伊姆", "「抱歉,我并没有兴趣去帮助他人」"], - ["羽化病患少年", "「我什么······什么,都会做的······」"], - ["羽化病患少年", "「我一直都是生活在下层的」"], - [ - "羽化病患少年", - "「可是,不知何时染上了羽化病······背后长出了翅膀······」", - ], - ["羽化病患少年", "「被寄宿工作的店赶了出来,只得流落到牢狱这里」"], - ["羽化病患少年", "「因为独自实在是饿的不行了,所以才会偷这些钱的」"], - [ - "羽化病患少年", - "「我明明没有做任何坏事······为什么······会遇到这种事······」", - ], - ["凯伊姆", "「谁知道」"], - ["羽化病患少年", "「呜······呜呜······接下来,要对我做什么?」"], - ["凯伊姆", "「我要把你带到组织那里」"], - ["羽化病患少年", "「怎,怎么这样」"], - ["凯伊姆", "「不过,那样做的前提是你不是羽化病人」"], - ["凯伊姆", "「组织也没有笨到把羽化病人招待到家里的程度」"], - ["羽化病患少年", "「那么,是要放我逃走吗?」"], - ["凯伊姆", "「我要让你学到教训」"], - ["凯伊姆", "「如果换做是组织的制裁,至少要有断条胳膊的觉悟」"], - ["凯伊姆", "「你的运气不错」"], - ["羽化病患少年", "「唔······啊,是的······」"], - ["凯伊姆", "「滚」"], - ["羽化病患少年", "「非常感谢」"], - ["羽化病患少年", "「唔啊!?」"], - ["男", "「到这里就结束了,羽化病人」"], - ["男", "「确认他的翅膀」"], - ["", "趁还没有被卷入麻烦的事情之前,赶快离开这里吧"], - ["羽狩的队长", "「那边的那个人」"], - ["凯伊姆", "「······有什么事?」"], - ["羽狩的队长", "「可以稍微让我问几句话吗」"], - ["凯伊姆", "「······」"], - ["凯伊姆", "「啊啊,无妨」"], - ["羽狩的队长", "「感谢您的合作」"], - ["", "队长殷勤地致以谢礼。"], - ["", "而在他的眼前,少年的衣服已经被他的补下们扯破。"], - ["", "在瘦骨嶙峋的裸露后背上,长有纯白的羽翼。"], - ["红发的羽狩", "「副队长,确认翅膀的持有了」"], - ["羽狩的副队长", "「保护他」"], - ["羽化病患少年", "「不要······请原谅,我······」"], - [ - "羽狩的副队长", - "「我们只是要带你去治愈院治疗羽化病,不是什么应该感到害怕的事情」", - ], - ["羽化病患少年", "「可是,可是」"], - ["羽狩的副队长", "「没关系的」"], - ["羽化病患少年", "「······哥,哥哥」"], - ["羽狩的副队长", "「你是羽化病人的亲属吗?」"], - ["凯伊姆", "「只是路人而已」"], - ["凯伊姆", "「顺带一提,我也没有打算找你们的麻烦」"], - [ - "羽狩的副队长", - "「前几天,有个和你说了同样的话的人,在我们背向他的瞬间对我们发动了袭击」", - ], - ["羽狩的副队长", "「我的一个部下就此永久失去了半截胳膊」"], - ["凯伊姆", "「我表示同情」"], - ["凯伊姆", "「我马上就会消失的,这样就没问题了吧?」"], - ["羽狩的副队长", "「嘛,不要这么慌张」"], - ["", "副队长看着羽化的少年。"], - ["羽狩的副队长", "「你与这个人是什么关系?没有被他殴打吗?」"], - ["羽化病患少年", "「没,没有」"], - [ - "羽狩的副队长", - "「如何对我们保持合作,你就可以在治愈院得到优先的治疗」", - ], - ["羽化病患少年", "「······」"], - ["羽化病患少年", "「那个人,是《不蚀金锁》的组织成员······」"], - ["羽化病患少年", "「突然说让我拿出钱来,我刚一拒绝他就打我」"], - ["羽狩的副队长", "「原来如此······」"], - [ - "羽狩的副队长", - "「那位少年说你是《不蚀金锁》的一员,不知此事是否属实?」", - ], - ["凯伊姆", "「当然不是」"], - ["凯伊姆", "「我只是从那里接受工作而已,并不是他们的成员」"], - ["羽狩的副队长", "「你的意思是说,少年在说谎吗?」"], - ["凯伊姆", "「啊啊」"], - [ - "凯伊姆", - "「如果你们和组织有关系的话,只要问问我是不是那里的成员就能明白事实了吧」", - ], - ["羽狩的副队长", "「就算我去询问,也无法从他们那里得到事实」"], - [ - "羽狩的副队长", - "「《不蚀金锁》的那些人一向都不对我们合作,我对此深感困扰」", - ], - ["凯伊姆", "「真是辛苦啊」"], - ["羽狩的副队长", "「说的是啊」"], - ["羽狩的副队长", "「其实,砍下我部下胳膊的似乎也是组织的成员呢」"], - [ - "羽狩的副队长", - "「无需如此警戒,我只是想在看守所向你咨询一些事情而已」", - ], - [ - "羽狩的副队长", - "「如果能够知晓牢狱与组织的事情,我们也可以尽可能地对更多的羽化病人进行保护」", - ], - ["羽狩的副队长", "「那和整条街道的和平也是紧密相关的吧?」"], - ["凯伊姆", "「我知道,你们有逮捕干扰狩猎羽化病人的权力」"], - [ - "凯伊姆", - "「但是,我没有对你们做出任何干扰,为什么要对我如此纠缠不休呢」", - ], - ["羽狩的副队长", "「那些话,我们会在看守所对你详细说明的」"], - ["凯伊姆", "「······」"], - ["", "在这里起争执的话,就会被羽狩加害。"], - ["", "就算能从这里脱身,今后只要碰面就会产生纠纷也是摆明的事情。"], - ["", "就算逃跑,也没有好的结果。"], - ["", "正当我想要打圆场的时候,刚才的气氛一瞬间产生了转变。"], - ["", "发生了什么事······"], - ["???", "「我认为,那位先生是正确的」"], - ["", "羽狩们一起回头。"], - ["", "而在他们视线的焦点处,"], - ["", "伫立着一位女性。"], - ["", "在端正的容颜下,代表着强烈意志的双眉十分显眼。"], - ["", "身体的柔软与紧紧包裹在其身上的羽狩制服,两者显得十分的不搭配。"], - ["", "我还是第一次看到女性的羽狩。"], - ["羽狩的副队长", "「队长,这是获得《不蚀金锁》情报的好机会」"], - [ - "羽狩的队长", - "「兰格副队长,就算是为了获得情报,也不能做出恫吓的发言啊」", - ], - ["兰格副队长", "「我并没有打算去恫吓他······」"], - ["羽狩的队长", "「告诉我那个被砍掉胳膊的队员的名字」"], - ["羽狩的队长", "「我会去探望他的」"], - ["兰格副队长", "「那个是······」"], - ["羽狩的队长", "「我知道,你一直在为有所收获而努力工作」"], - ["羽狩的队长", "「但是,正因为我们的工作是为民众提供帮助」"], - ["羽狩的队长", "「所以就更不能损害人与人之间的信赖」"], - ["兰格副队长", "「我会铭记在心」"], - ["羽狩的队长", "「这位先生,我的部下失礼了」"], - ["凯伊姆", "「只要不对我再来一次就好」"], - ["羽狩的队长", "「请稍等」"], - ["凯伊姆", "「有什么事?」"], - ["羽狩的队长", "「我想确认一件事」"], - ["羽狩的队长", "「你真的不是《不蚀金锁》的成员吗?」"], - ["凯伊姆", "「真的」"], - ["凯伊姆", "「如果我说是的话,你有什么打算?」"], - ["羽狩的队长", "「我听过传闻,说他们是用依靠暴力而得的钱在生活」"], - ["凯伊姆", "「······这样啊」"], - ["凯伊姆", "「如果能有收获就好了啊」"], - ]; - this.chapter04 = [ - ["梅尔特", "「欢迎光临」"], - ["梅尔特", "「辛苦了」"], - ["梅尔特", "「抱歉,又拜托给你了个这么麻烦的工作」"], - ["凯伊姆", "「没什么,比想象中完成的更容易」"], - ["梅尔特", "「那就好」"], - ["梅尔特", "「这是我的一点谢意」"], - ["凯伊姆", "「味道有些变化啊」"], - ["梅尔特", "「啊,被发现了?」"], - ["梅尔特", "「最近,没能到手什么好的原料呢」"], - ["凯伊姆", "「去拜托吉克如何?」"], - [ - "梅尔特", - "「话是这么说,但是总不能用店里采购的这种小事去麻烦他吧······」", - ], - ["凯伊姆", "「那希望你也不要来麻烦我」"], - ["梅尔特", "「那 是 两 码 事」"], - ["梅尔特", "「再说,凯伊姆是靠着工作来生活的吧」"], - [ - "梅尔特", - "「而且,自己的钱被偷了这么害羞的事,向凯伊姆意外的其他人都说不出口」", - ], - ["凯伊姆", "「反正,也已经传到吉克的耳朵里了」"], - ["梅尔特", "「这是面子问题啊,面子问题」"], - ["凯伊姆", "「嘛,算了」"], - ["凯伊姆", "「这样就好了吧?」"], - ["梅尔特", "「这是钱包呢」"], - ["梅尔特", "「嗯,东西没少」"], - ["梅尔特", "「太好啦—这个月的上纳金,我可全部都放在里面了呢」"], - ["梅尔特", "「如果没有找到的话,说不定就又会被送到娼馆里了呢」"], - ["凯伊姆", "「在那边不是来钱更快吗?」"], - ["梅尔特", "「阿拉,你是在说我还能有魅力吗?」"], - ["凯伊姆", "「这是客套话而已」"], - ["梅尔特", "「欺负人」"], - ["梅尔特", "「总而言之,今天帮大忙了」"], - ["梅尔特", "「谢礼嘛······」"], - ["凯伊姆", "「就记在账单上吧」"], - ["梅尔特", "「了解—盛谢惠顾了哦?」"], - ["", "喀啷喀啷"], - ["", "门铃响起"], - ["", "喧哗瞬间安静下来。"], - ["", "进来的人是吉克。"], - ["", "是掌控着牢狱的组织之一,《不蚀金锁》的头目。"], - ["", "不仅组织的成员,就连店内一般的客人也对他以注目礼表示敬意。"], - ["吉克", "「各位继续吧」"], - ["", "仿佛停滞的时钟重新转动了一般,店内恢复了热闹的气氛。"], - ["吉克", "「抱歉,今天拜托你去做了无聊的工作」。"], - ["凯伊姆", "「不用介意」"], - ["", "吉克轻轻点了点头,在我右边坐了下来"], - ["凯伊姆", "「逃跑的男人怎么样了?」"], - ["吉克", "「嗯?已经不在这个世上了」。"], - ["吉克", "「有什么想要知道的事吗?」"], - ["凯伊姆", "「不,没什么」"], - ["吉克", "「那个无聊的家伙,完全没有趣味呢」"], - ["吉克", "「真希望他也替我负责清扫的部下也考虑考虑」"], - ["凯伊姆", "「真是灾难啊」"], - ["吉克", "「比起那个,我听说了哦。你去追羽化病人了啊」"], - ["凯伊姆", "「消息真灵通」"], - ["吉克", "「梅尔特也注意点」"], - ["吉克", "「你丢钱已经不是一回两回了」"], - ["梅尔特", "「好的—我会注意的。」"], - ["梅尔特", "「吉克还是平常的点单吧」"], - ["梅尔特", "「凯伊姆要再来一杯吗?」"], - ["", "我们用眼神点头示意后,梅尔特开始准备起酒来。"], - ["", "悠然地吐出眼圈后,吉克取出一个纸包放在柜台上。"], - ["吉克", "「这是抓捕逃跑男人的报酬」"], - ["凯伊姆", "「下次有什么事再告诉我」"], - ["梅尔特", "「来,久等了」"], - ["凯伊姆", "「话说回来梅尔特,为什么会被那种孩子偷到钱?」"], - ["吉克", "「让我猜猜看」"], - ["吉克", "「是那个吧,看某个特立独行的男人入迷了,所以就有了空隙?」"], - ["梅尔特", "「可惜—」"], - ["梅尔特", "「事实恰恰相反,是那家伙一直在纠缠我」"], - ["凯伊姆", "「完全把你当成新进的女佣了么」"], - ["梅尔特", "「我从前可是很有名的,不会被当成这种下人吧」"], - ["梅尔特", "「······而且,我没法对对我这么钟情的人发火啊」"], - ["凯伊姆&吉克", "「你傻啊」"], - ["梅尔特", "「异口同声呢,不亏是兄弟」"], - ["凯伊姆", "「别用这种称呼,怪恶心的」"], - ["吉克", "「说得没错」"], - ["吉克", "「······说起来······」"], - ["梅尔特", "「怎么了?」"], - ["吉克", "「有件事我一直很在意,我和凯伊姆,哪个是哥哥啊?」"], - ["凯伊姆", "「你也说这么无聊的话题」"], - ["吉克", "「不,这是很重要的事情」"], - ["吉克", "「梅尔特,事实是怎么样的?」"], - ["梅尔特", "「啊~是怎么样的呢~」"], - ["梅尔特", "「我忘记了」"], - ["吉克", "「骗人」"], - ]; - } + // 在此增加新插件 + // 每项为一个数组,第一项是名字,第二项是对话内容 + // 回放只会在同一个this下回放,进入剧情前请以事件块声明进入哪个剧情数组 + // 可以自由添加,但不能与已有插件及函数名相同,可以使用中文。 + this.chapter0 = [ + ["", "这些天,街道不曾下雨。"], + ["", "所以,那浸湿地面的,定是那些女孩们流落的鲜血无疑。"], + ["", "我蹲在充斥着铁锈味般恶臭的小巷中,悠闲地如是想着。"], + ["", "扑哧。"], + ["", "耳旁再次响起象征着某个女孩子死去的声音。"], + ["", "再一次——"], + ["", "再一次。"], + ["", "女子们被肢解成单纯的肉块。"], + ["", "我任由流下的血浸满全身,屏住自己的呼吸。"], + ["", "祈求自己能拥有从猎人手中逃脱的幸运。"], + ["", "扑哧。"], + ["", "直到刚才,我们还坐在去往娼馆的马车的路上。"], + ["", "而在这之中的某些人,已经不在这个世上了。"], + ["", "不,应该把“某些”换成“几乎所有”才更为恰当吧。"], + ["", "恐怕,不久之后我也会变成小巷中血腥的装饰品。"], + ["", "我是为了得到这种死法,才辛苦苟活至今的吗?"], + ["", "来个人告诉我啊——"], + ["", "谁都好。"], + ["", "来人啊!!"], + ["少女", "「呃······!?」"], //小动物01 + ["", "漆黑的物体充斥了我的整个视野"], + ["", "我很快意识到,那是只很大的脚。"], + ["", "必须要出声求救。"], + ["", "可是,耳中却只能听到自己的牙关不停交战的声音。"], + ["", "我是如此的无助。"], + ["", "逃跑也好,道歉也罢。"], + ["", "就连抬头看一眼将要杀掉我的人的面孔都做不到。"], + ["少女", "「······被杀」"], //小动物02 + ["", "会被杀。"], + ["", "会被杀!!"], + ["", "来自内心深处的冰冷预感,渐渐地在体内蔓延开来。"], + ["少女", "「不,不要······」"], //小动物03 + ["", "浮游都市,《诺瓦斯·艾蒂尔》。"], + ["", "《特别受灾地区》——"], + ["", "通称,《牢狱》"], + ["", "是被险峻的峭壁环绕,与世隔绝的,都市的最底部。"], + ["年轻人", "「放开我!」"], //龙套1-01 + ["年轻人", "「我只是在帮那个女人而已!」"], //龙套1-02 + ["年轻人", "「你们没听到吗!?」"], //龙套1-03 + ["年轻人", "「她是被受骗才会被卖到娼馆来的」"], //龙套1-04 + ["年轻人", "「用肮脏的手段把钱借给她父母的,就是你们这些家伙吧!?」"], //龙套1-05 + ["年轻人", "「给我说些什么啊」"], //龙套1-06 + ["凯伊姆", "「这些话等到了娼馆再说吧」"], //男主01 + ["凯伊姆", "「我来抓你,只是受雇于人而已」"], //男主02 + ["", "我走进娼馆《莉莉乌姆》的接待室。"], + ["", "正在桌旁整理账簿的奥兹停下手头的工作,抬起头向我看来。"], + ["奥兹", "「这不是凯伊姆先生吗,辛苦了」"], //金锁高官01 + ["奥兹", "「委托已经完成了吗?」"], //金锁高官02 + ["凯伊姆", "「啊啊,是这家伙没错吧」"], //男主03 + ["", "奥兹用只要接触到就能杀人般的眼神在男人脸上搜过。"], + ["奥兹", "「没错,就是这个人」"], //金锁高官03 + ["凯伊姆", "「是么」"], //男主04 + ["年轻人", "「你,你们要对我做什么」"], //龙套1-07 + ["奥兹", "「······」"], //金锁高官04 + ["", "奥兹用一个眼神,就让男人闭上了嘴。"], + ["", "然后,向我这边转过身来。"], + ["奥兹", "「抱歉啊,总是麻烦你去做这些无聊的事」"], //金锁高官05 + ["奥兹", "「都怪我们这边的年轻人太没用」"], //金锁高官06 + ["凯伊姆", "「客套话就免了」"], //男主05 + ["奥兹", "「这还真是失礼了」"], //金锁高官07 + ["奥兹", "「喂,来个人」"], //金锁高官08 + ["光头男人", "「是」"], //龙套2-01 + ["奥兹", "「凯伊姆先生做完工作回来了」"], //金锁高官09 + ["光头男人", "「是,是,那个······」"], //龙套2-02 + ["奥兹", "「我是要你拿些酒来,这个蠢材!」"], //金锁高官10 + ["", "喀!"], + ["", "奥兹扔出的烟灰缸砸中了手下的额头。"], + ["", "鲜血四溅。"], + ["凯伊姆", "「不用这么麻烦」"], //男主06 + ["凯伊姆", "「我接下来要去《菲诺列塔》」"], //男主07 + ["奥兹", "「喔唷」"], //金锁高官11 + ["奥兹", "「既然如此,我就不留您在这里喝难饮的劣质酒了」"], //金锁高官12 + ["", "奥兹斜眼看着正捂住额头呻吟的手下,轻描淡写地说道。"], + ["凯伊姆", "「用这些钱去买药」"], //男主08 + ["", "我将几枚铜钱仍在那个手下的身前。"], + ["奥兹", "「凯伊姆先生,不用对他们这么好」"], //金锁高官13 + ["凯伊姆", "「无妨」"], //男主09 + ["凯伊姆", "「话说回来,那个要落跑的女人呢?」"], //男主10 + ["奥兹", "「我把她交给那些年轻人了,现在应该正在体会人生的严苛吧」"], //金锁高官14 + ["奥兹", "「正好,趁此机会凯伊姆先生也来享受一番如何?」"], //金锁高官15 + ["年轻人", "「你,你们这些家伙,要对她做什么!?」"], //龙套1-08 + ["", "咣!"], + ["", "奥兹给了他一拳。"], + ["", "一击即倒。"], + ["", "喀,咚,咯!"], + ["", "奥兹毫不留情地向男人的脸上踩去。"], + ["年轻人", "「咕······呃咳······」"], //龙套1-09 + ["", "折断的牙齿伴着血泡被吐出。"], + ["", "这份白色在鲜红色的液体中格外显眼。"], + ["年轻人", "「你们以为做出这种事······卫兵会坐视不理吗······」"], //龙套1-10 + ["奥兹", "「啊啊,不会坐视不理的」"], //金锁高官16 + ["奥兹", "「应该会拿出你的钱包,和我们商量如何瓜分吧」"], //金锁高官17 + ["年轻人", "「那,那种事······」"], //龙套1-11 + ["", "这在牢狱是理所当然的事。"], + ["奥兹", "「怎么,头一回来牢狱么?」"], //金锁高官18 + ["", "男人点了点头。"], + ["奥兹", "「为了被骗的女人而来到牢狱,真是个规矩人啊」"], //金锁高官19 + ["奥兹", "「······前提是,被骗的人不是你」"], //金锁高官20 + ["年轻人", "「你说······我被骗了?」"], //龙套1-12 + ["年轻人", "「那,那是怎么回事!?」"], //龙套1-13 + ["奥兹", "「不用急,今天晚上会好好告诉你的」"], //金锁高官21 + ["", "奥兹抓起男人的脸。"], + ["", "为引诱客人的怜悯之心而装纯,是娼妇的惯用手段。"], + ["", "双亲被骗而借钱,结果作为抵押而将自己卖到这里,这是典型的说法。"], + [ + "", + "如果只是头脑发热而成为常客也就罢了,这次的男人热血过头,居然想出了要带女人私奔的计划。", + ], + [ + "", + "虽然女人半开玩笑地予以拒绝,但不知天高地厚的这家伙还是拉着她逃跑了。", + ], + ["", "不过,想要逃脱追击本来就是不可能的任务。"], + ["", "但即便如此,这种事情还是会一再的出现。"], + ["", "说谎的女人和被骗的男人。"], + ["", "在娼馆街,这是令人看到生厌的日常的风景。"], + ["凯伊姆", "「我要走了」"], //男主11 + ["奥兹", "「好的,下次再麻烦您」"], //金锁高官22 + ["奥兹", "「之后吉克先生会将谢礼交给您的」"], //金锁高官23 + ["凯伊姆", "「啊啊」"], //男主12 + ["", "我背向奥兹走出娼馆。"], + ["凯伊姆", "「······?」"], //男主13 + ["", "从远方传来微弱的歌声。"], + ["", "是关卡广场的方向。"], + ["", "对了。"], + ["", "今天有觐见圣女的仪式。"], + ["", "当代的圣女伊莲——"], + ["", "俗称《盲眼之圣女》,据说即使在历代的圣女中,人气也是数一数二的。"], + ["", "广场上的人估计相当多吧。"], + ["", "虽然我也想去看看她长什么样,不过要在人潮中挤来挤去就免了。"], + ["", "还是老老实实去菲诺列塔喝烧酒吧。"], + ["", "正当我这样想着的时候,一个身影自小巷的那头走来。"], + ["凯伊姆", "「艾莉斯」"], //男主14 + ]; + this.chapter01 = [ + ["艾莉斯", "「啊,凯伊姆」"], //医生00.5 + ["艾莉斯", "「正好,我还想要去找你呢」"], //医生01 + ["艾莉斯", "「没想到凯伊姆会主动出现······这是命运吗?」"], //医生02 + ["凯伊姆", "「显然不是吧」"], //男主15 + ["艾莉斯", "「啊,是么」"], //医生03 + ["", "艾莉斯挑了挑整齐的双眉,微微地哼了一声。"], + [ + "", + "虽然是个相当引人注目的美人,但她这个将亲切儿子丢入无底深渊的性格,为自己扣了不少的分", + ], + ["", "给人印象最深的,就是那潭水般的双瞳。"], + ["", "在漆黑的瞳孔中,完全看不出感情的波动。"], + ["艾莉斯", "「喜欢我的眼睛吗?」"], //医生04 + ["艾莉斯", "「如果想要的话就给你吧?」"], //医生05 + ["凯伊姆", "「用不着」"], //男主16 + ["艾莉斯", "「阿拉,可惜」"], //医生06 + ["凯伊姆", "「那么,找我有什么事」"], //男主17 + ["艾莉斯", "「梅尔特的钱好像被偷了」"], //医生07 + ["凯伊姆", "「钱被偷了?都几岁了还这么没用」"], //男主18 + ["艾莉斯", "「不要对我说啊」"], //医生08 + ["凯伊姆", "「那家伙,该不会说要让我去抓那个小偷吧?」"], //男主19 + ["艾莉斯", "「就是这样」"], //医生09 + ["凯伊姆", "「笨蛋吗」"], //男主20 + ["凯伊姆", "「如果是小钱的话,就当做是买个教训吧」"], //男主21 + ["艾莉斯", "「说起来,被盗的是这个月的上纳金」"], //医生10 + ["凯伊姆", "「你说什么?」"], //男主22 + ["艾莉斯", "「用这些钱买教训,也太过奢侈了呢」"], //医生11 + ["凯伊姆", "「知道了,我去找」"], //男主23 + ["凯伊姆", "「小偷的特征呢」"], //男主24 + ["艾莉斯", "「男孩子」"], //医生12 + ["艾莉斯", "「······而且,背后有翅膀」"], //医生13 + ["艾莉斯", "「虽然姑且是藏在身后,但是仔细观察的话是很明显的」"], //医生14 + ["凯伊姆", "「羽化病吗」"], //男主25 + [ + "艾莉斯", + "「那些人可是毫不留情的,所以即使是为了那个孩子,也要赶快抓到他」", + ], //医生15 + ["凯伊姆", "「注意到他逃窜的方向了吗?」"], //男主26 + ["艾莉斯", "「广场那边」"], //医生16 + ["艾莉斯", "「虽然刚才《不蚀金锁》的人去追了,不过多半是······」"], //医生17 + ["凯伊姆", "「偏偏还是广场吗」"], //男主28 + ["艾莉斯", "「今天是觐见圣女大人的日子」"], //医生18 + ["凯伊姆", "「我知道」"], //男主29 + ["凯伊姆", "「尽量找找看就好」"], //男主30 + ]; + this.chapter02 = [ + ["不蚀金锁成员", "「凯伊姆先生,凯伊姆先生」"], + ["不蚀金锁成员", "「您已经和艾莉斯大夫见过面了吗?」"], + ["凯伊姆", "「啊啊,所以才会追过来的」"], //男主31 + ["凯伊姆", "「看到小偷了吗?」"], //男主32 + [ + "不蚀金锁成员", + "「没有,他向广场那边逃了过去,今天这么拥挤,我们也只能放弃了」", + ], + [ + "不蚀金锁成员", + "「不过,我也只是刚好在店里所以才追了过去,并不是受人所托」", + ], + ["不蚀金锁成员", "「我已经准备撤退了」"], + ["不蚀金锁成员", "「凯伊姆先生还要继续追吗?」"], + ["凯伊姆", "「啊啊」"], //男主33 + ["", "做完情报交换之后,我跟男人道别。"], + ["凯伊姆", "「和我想的一样啊······」"], //男主34 + ["", "在牢狱中最大的广场上,聚集着看不到尽头的人群。"], + ["", "就算是来参见圣女祈祷,这人数也太多了点吧。"], + ["", "自然,我也找不到逃跑的孩子。"], + ["", "是混杂到人群中了吧。"], + ["", "如果已经从广场上脱身了的话,就更难发现了。"], + ["", "只好赌他还在这里了。"], + ["", "我先移动到了一个视野良好的地方。"], + ["", "从这里,一眼就可以看到人群的变化。"], + ["", "广场还是沸腾起来。"], + ["", "抬头望去,原来是在天台之上出现了一个人影"], + ["", "但是,与周围的期待不同,现身的是一名中年的神官。"], + ["", "骂声四溢。"], + ["", "神官则是笑着摆正衣领"], + ["神官", "「从现在开始,举行谒见的仪式」"], + [ + "神官", + "「在参见那位大人之前,我希望牢狱的诸位再次思考这个《诺瓦斯·艾蒂尔》存在的意义······」", + ], + [ + "神官", + "「初代圣女伊莲大人,便是也难怪这崇高的祈祷之力,令《诺瓦斯·艾蒂尔》浮在空中,拯救了我们的祖先」", + ], + [ + "神官", + "「这之后的几百年来,传承了初代大人力量的历代圣女伊莲大人,让这里留在了空中」", + ], + [ + "神官", + "「这座都市是被圣女大人守护的人类最后的圣域,而我们则是被选召的虔诚的信徒」", + ], + ["神官", "「怀着对圣女的感激祈祷吧,感谢圣女伊莲吧!并献上祈祷!」"], + ["圣女", "「不忘感谢与祈祷,神才会拯救我们」"], + ["圣女", "「与我一起,向神虔诚地祈祷吧」"], + ["", "广场上欢声雷动。"], + ["", "圣女没有回应喧嚣的人声,而是静静地合上双眼面向广场。"], + ["", "虽然感觉有些冷淡,但总比像个傻瓜似的笑着向这群人挥手要强。"], + ["", "她掌握着这条街道,还有在这条街上生活的人的命运。"], + ["", "比起揽得人气,她更想要为了街道的继续存在而献出全力。"], + ["", "也是为了不让《大崩落》的惨剧再度发生。"], + ["", "十几年前的那场悲剧。"], + [ + "", + "虽然在我脑海中的记忆已经相当模糊,但哪怕只是稍有触及,不快的感觉都会在胸口蔓延开。", + ], + ["凯伊姆", "「······」"], //男主35 + ["", "这时我才想起,现在不是我在这里看圣女的时候。"], + ["女声", "「——っ!?」"], + ["围观的女人", "「羽,羽化病人!?」"], + ["围观的中年人", "「喂,谁去叫下羽狩」"], + ["惊慌的观众", "「你这家伙不要靠近我,要是传染了可怎么办」"], + ["粗鲁的观众", "「你这小鬼赶快滚开」"], + ["凯伊姆", "「接下来」"], + ["圣女", "「发生什么事了?看上去似乎很嘈杂」"], + ["随从", "「似乎是某个人逃跑了······具体的我也不是很清楚」"], + ["神官", "「圣女大人,继续待在天台上可能会出事,请您先回到室内吧」"], + ["圣女", "「不用在意我,比起那个,我更关心究竟发生了什么事」"], + ["神官", "「对不起,我真的不知道」"], + ["圣女", "「······是吗」"], + ["男", "「恕我僭越,请准许我说明情况」"], + ["男", "「在来觐见的人群中出现了《羽化病》的患者」"], + ["男", "「围观的人群因而产生了骚动」"], + [ + "男", + "「现在,《防疫局》已经派遣了部队。我想不久之后,他们就会安静下来了」", + ], + ["圣女", "「羽化病······」"], + ["男", "「怎么了?」"], + ["圣女", "「没什么」"], + ["圣女", "「辛苦了,你的名字是?」"], + ["男", "「属下是在防疫局任职的,鲁基乌斯· 迪斯·米利尤」"], + ["神官", "「噢噢,阁下就是鲁基乌斯卿吗,我听说过你的传闻」"], + ["神官", "「阁下是在工作上相当出色的人呢」"], + ["鲁基乌斯", "「不敢当」"], + [ + "鲁基乌斯", + "「话说回来,这次是属下警备工作的失职。让圣女大人见到这不成体统的一面,请您见谅」", + ], + [ + "圣女", + "「即使是目不见物的我,也能感受到聚集于此的民众数量之多。警备工作难以展开也在情理之中」", + ], + ["鲁基乌斯", "「属下不胜惶恐」"], + ["鲁基乌斯", "「接下来属下还要回到工作岗位上,在这里就先告退了」"], + ["圣女", "「鲁基乌斯先生」"], + ["鲁基乌斯", "「属下在」"], + ["圣女", "「你是怎样看待羽狩的工作的呢?」"], + ["神官", "「圣,圣女大人」"], + [ + "鲁基乌斯", + "「防疫局的工作是国王陛下赐予的重要职务。属下非常荣幸能够为这个都市的繁荣尽一份微薄之力」", + ], + ["神官", "「不,不亏是鲁基乌斯卿,相当优秀的想法」"], + ["圣女", "「是吗。辛苦你了」"], + ["随从", "「圣女大人······」"], + ["鲁基乌斯", "「······」"], + ["鲁基乌斯", "「那么,属下就回岗位去了」"], + ]; + this.chapter03 = [ + ["", "从羽化病的少年纷乱的足音中,可以听得出相当的疲劳。"], + ["", "显然,他并没有想到我会捷足先登吧。"], + ["", "少年惶恐地回头看了一眼后,微微露出安心的表情,双手拄在膝盖上。。"], + ["凯伊姆", "「辛苦你了」"], //男主37 + ["羽化病患少年", "「稀!?」"], + ["凯伊姆", "「逃到贫民区是个不错的想法」"], //男主38 + ["羽化病患少年", "「你,你是,羽狩吗?」"], + ["凯伊姆", "「不是」"], //男主39 + ["羽化病患少年", "「什,什么啊······混蛋,不要吓我啊」"], + ["凯伊姆", "「我对令你受惊这件事致以歉意」"], //男主40 + ["凯伊姆", "「作为回报,麻烦你把从店里偷的钱交出来吧」"], //男主41 + ["羽化病患少年", "「钱?你在说什么」"], + ["凯伊姆", "「你要找的腰上的东西,掉在你身后了」"], //男主42 + ["羽化病患少年", "「哎?」"], + ["羽化病患少年", "「呃呀」"], + ["羽化病患少年", "「你······你这混蛋」"], + ["凯伊姆", "「······」"], //男主43 + ["凯伊姆", "「把偷的钱交出来」"], //男主44 + ["羽化病患少年", "「我不知道你在······咕」"], + ["羽化病患少年", "「你,你说是我偷的······有什么证据吗」"], + ["凯伊姆", "「你还挺倔的啊」"], //男主45 + ["凯伊姆", "「不过,给我听好了」"], //男主46 + ["凯伊姆", "「你偷的那些钱,是要上缴给《不蚀金锁》的上纳金」"], //男主47 + ["凯伊姆", "「而且,钱的主人是从前和吉克颇有渊源的女人」"], //男主48 + ["羽化病患少年", "「吉克?」"], + ["凯伊姆", "「他是《不蚀金锁》的主人,这么说你就明白了吧」"], //男主49 + ["羽化病患少年", "「哎?哎?怎么会······」"], + ["凯伊姆", "「再问你一遍,钱在哪里?」"], //男主50 + ["羽化病患少年", "「是,是,是,在我的怀里」"], + ["凯伊姆", "「你没有擅自拿掉一部分吧」"], //男主51 + ["羽化病患少年", "「是,是的」"], + ["羽化病患少年", "「那,那个,您是《不蚀金锁》的人吗?」"], + ["凯伊姆", "「算是吧」"], //男主52 + ["羽化病患少年", "「我什么都可以做,请您一定要帮帮我」"], + ["凯伊姆", "「抱歉,我并没有兴趣去帮助他人」"], //男主53+54 + ["羽化病患少年", "「我什么······什么,都会做的······」"], + ["羽化病患少年", "「我一直都是生活在下层的」"], + [ + "羽化病患少年", + "「可是,不知何时染上了羽化病······背后长出了翅膀······」", + ], + ["羽化病患少年", "「被寄宿工作的店赶了出来,只得流落到牢狱这里」"], + ["羽化病患少年", "「因为独自实在是饿的不行了,所以才会偷这些钱的」"], + [ + "羽化病患少年", + "「我明明没有做任何坏事······为什么······会遇到这种事······」", + ], + ["凯伊姆", "「谁知道」"], //男主55 + ["羽化病患少年", "「呜······呜呜······接下来,要对我做什么?」"], + ["凯伊姆", "「我要把你带到组织那里」"], //男主56 + ["羽化病患少年", "「怎,怎么这样」"], + ["凯伊姆", "「不过,那样做的前提是你不是羽化病人」"], + ["凯伊姆", "「组织也没有笨到把羽化病人招待到家里的程度」"], + ["羽化病患少年", "「那么,是要放我逃走吗?」"], + ["凯伊姆", "「我要让你学到教训」"], + ["凯伊姆", "「如果换做是组织的制裁,至少要有断条胳膊的觉悟」"], + ["凯伊姆", "「你的运气不错」"], + ["羽化病患少年", "「唔······啊,是的······」"], + ["凯伊姆", "「滚」"], + ["羽化病患少年", "「非常感谢」"], + ["羽化病患少年", "「唔啊!?」"], + ["男", "「到这里就结束了,羽化病人」"], + ["男", "「确认他的翅膀」"], + ["", "趁还没有被卷入麻烦的事情之前,赶快离开这里吧"], + ["羽狩的队长", "「那边的那个人」"], + ["凯伊姆", "「······有什么事?」"], + ["羽狩的队长", "「可以稍微让我问几句话吗」"], + ["凯伊姆", "「······」"], + ["凯伊姆", "「啊啊,无妨」"], + ["羽狩的队长", "「感谢您的合作」"], + ["", "队长殷勤地致以谢礼。"], + ["", "而在他的眼前,少年的衣服已经被他的补下们扯破。"], + ["", "在瘦骨嶙峋的裸露后背上,长有纯白的羽翼。"], + ["红发的羽狩", "「副队长,确认翅膀的持有了」"], + ["羽狩的副队长", "「保护他」"], + ["羽化病患少年", "「不要······请原谅,我······」"], + [ + "羽狩的副队长", + "「我们只是要带你去治愈院治疗羽化病,不是什么应该感到害怕的事情」", + ], + ["羽化病患少年", "「可是,可是」"], + ["羽狩的副队长", "「没关系的」"], + ["羽化病患少年", "「······哥,哥哥」"], + ["羽狩的副队长", "「你是羽化病人的亲属吗?」"], + ["凯伊姆", "「只是路人而已」"], + ["凯伊姆", "「顺带一提,我也没有打算找你们的麻烦」"], + [ + "羽狩的副队长", + "「前几天,有个和你说了同样的话的人,在我们背向他的瞬间对我们发动了袭击」", + ], + ["羽狩的副队长", "「我的一个部下就此永久失去了半截胳膊」"], + ["凯伊姆", "「我表示同情」"], + ["凯伊姆", "「我马上就会消失的,这样就没问题了吧?」"], + ["羽狩的副队长", "「嘛,不要这么慌张」"], + ["", "副队长看着羽化的少年。"], + ["羽狩的副队长", "「你与这个人是什么关系?没有被他殴打吗?」"], + ["羽化病患少年", "「没,没有」"], + [ + "羽狩的副队长", + "「如何对我们保持合作,你就可以在治愈院得到优先的治疗」", + ], + ["羽化病患少年", "「······」"], + ["羽化病患少年", "「那个人,是《不蚀金锁》的组织成员······」"], + ["羽化病患少年", "「突然说让我拿出钱来,我刚一拒绝他就打我」"], + ["羽狩的副队长", "「原来如此······」"], + [ + "羽狩的副队长", + "「那位少年说你是《不蚀金锁》的一员,不知此事是否属实?」", + ], + ["凯伊姆", "「当然不是」"], + ["凯伊姆", "「我只是从那里接受工作而已,并不是他们的成员」"], + ["羽狩的副队长", "「你的意思是说,少年在说谎吗?」"], + ["凯伊姆", "「啊啊」"], + [ + "凯伊姆", + "「如果你们和组织有关系的话,只要问问我是不是那里的成员就能明白事实了吧」", + ], + ["羽狩的副队长", "「就算我去询问,也无法从他们那里得到事实」"], + [ + "羽狩的副队长", + "「《不蚀金锁》的那些人一向都不对我们合作,我对此深感困扰」", + ], + ["凯伊姆", "「真是辛苦啊」"], + ["羽狩的副队长", "「说的是啊」"], + ["羽狩的副队长", "「其实,砍下我部下胳膊的似乎也是组织的成员呢」"], + [ + "羽狩的副队长", + "「无需如此警戒,我只是想在看守所向你咨询一些事情而已」", + ], + [ + "羽狩的副队长", + "「如果能够知晓牢狱与组织的事情,我们也可以尽可能地对更多的羽化病人进行保护」", + ], + ["羽狩的副队长", "「那和整条街道的和平也是紧密相关的吧?」"], + ["凯伊姆", "「我知道,你们有逮捕干扰狩猎羽化病人的权力」"], + [ + "凯伊姆", + "「但是,我没有对你们做出任何干扰,为什么要对我如此纠缠不休呢」", + ], + ["羽狩的副队长", "「那些话,我们会在看守所对你详细说明的」"], + ["凯伊姆", "「······」"], + ["", "在这里起争执的话,就会被羽狩加害。"], + ["", "就算能从这里脱身,今后只要碰面就会产生纠纷也是摆明的事情。"], + ["", "就算逃跑,也没有好的结果。"], + ["", "正当我想要打圆场的时候,刚才的气氛一瞬间产生了转变。"], + ["", "发生了什么事······"], + ["???", "「我认为,那位先生是正确的」"], + ["", "羽狩们一起回头。"], + ["", "而在他们视线的焦点处,"], + ["", "伫立着一位女性。"], + ["", "在端正的容颜下,代表着强烈意志的双眉十分显眼。"], + ["", "身体的柔软与紧紧包裹在其身上的羽狩制服,两者显得十分的不搭配。"], + ["", "我还是第一次看到女性的羽狩。"], + ["羽狩的副队长", "「队长,这是获得《不蚀金锁》情报的好机会」"], + [ + "羽狩的队长", + "「兰格副队长,就算是为了获得情报,也不能做出恫吓的发言啊」", + ], + ["兰格副队长", "「我并没有打算去恫吓他······」"], + ["羽狩的队长", "「告诉我那个被砍掉胳膊的队员的名字」"], + ["羽狩的队长", "「我会去探望他的」"], + ["兰格副队长", "「那个是······」"], + ["羽狩的队长", "「我知道,你一直在为有所收获而努力工作」"], + ["羽狩的队长", "「但是,正因为我们的工作是为民众提供帮助」"], + ["羽狩的队长", "「所以就更不能损害人与人之间的信赖」"], + ["兰格副队长", "「我会铭记在心」"], + ["羽狩的队长", "「这位先生,我的部下失礼了」"], + ["凯伊姆", "「只要不对我再来一次就好」"], + ["羽狩的队长", "「请稍等」"], + ["凯伊姆", "「有什么事?」"], + ["羽狩的队长", "「我想确认一件事」"], + ["羽狩的队长", "「你真的不是《不蚀金锁》的成员吗?」"], + ["凯伊姆", "「真的」"], + ["凯伊姆", "「如果我说是的话,你有什么打算?」"], + ["羽狩的队长", "「我听过传闻,说他们是用依靠暴力而得的钱在生活」"], + ["凯伊姆", "「······这样啊」"], + ["凯伊姆", "「如果能有收获就好了啊」"], + ]; + this.chapter04 = [ + ["梅尔特", "「欢迎光临」"], + ["梅尔特", "「辛苦了」"], + ["梅尔特", "「抱歉,又拜托给你了个这么麻烦的工作」"], + ["凯伊姆", "「没什么,比想象中完成的更容易」"], + ["梅尔特", "「那就好」"], + ["梅尔特", "「这是我的一点谢意」"], + ["凯伊姆", "「味道有些变化啊」"], + ["梅尔特", "「啊,被发现了?」"], + ["梅尔特", "「最近,没能到手什么好的原料呢」"], + ["凯伊姆", "「去拜托吉克如何?」"], + [ + "梅尔特", + "「话是这么说,但是总不能用店里采购的这种小事去麻烦他吧······」", + ], + ["凯伊姆", "「那希望你也不要来麻烦我」"], + ["梅尔特", "「那 是 两 码 事」"], + ["梅尔特", "「再说,凯伊姆是靠着工作来生活的吧」"], + [ + "梅尔特", + "「而且,自己的钱被偷了这么害羞的事,向凯伊姆意外的其他人都说不出口」", + ], + ["凯伊姆", "「反正,也已经传到吉克的耳朵里了」"], + ["梅尔特", "「这是面子问题啊,面子问题」"], + ["凯伊姆", "「嘛,算了」"], + ["凯伊姆", "「这样就好了吧?」"], + ["梅尔特", "「这是钱包呢」"], + ["梅尔特", "「嗯,东西没少」"], + ["梅尔特", "「太好啦—这个月的上纳金,我可全部都放在里面了呢」"], + ["梅尔特", "「如果没有找到的话,说不定就又会被送到娼馆里了呢」"], + ["凯伊姆", "「在那边不是来钱更快吗?」"], + ["梅尔特", "「阿拉,你是在说我还能有魅力吗?」"], + ["凯伊姆", "「这是客套话而已」"], + ["梅尔特", "「欺负人」"], + ["梅尔特", "「总而言之,今天帮大忙了」"], + ["梅尔特", "「谢礼嘛······」"], + ["凯伊姆", "「就记在账单上吧」"], + ["梅尔特", "「了解—盛谢惠顾了哦?」"], + ["", "喀啷喀啷"], + ["", "门铃响起"], + ["", "喧哗瞬间安静下来。"], + ["", "进来的人是吉克。"], + ["", "是掌控着牢狱的组织之一,《不蚀金锁》的头目。"], + ["", "不仅组织的成员,就连店内一般的客人也对他以注目礼表示敬意。"], + ["吉克", "「各位继续吧」"], + ["", "仿佛停滞的时钟重新转动了一般,店内恢复了热闹的气氛。"], + ["吉克", "「抱歉,今天拜托你去做了无聊的工作」。"], + ["凯伊姆", "「不用介意」"], + ["", "吉克轻轻点了点头,在我右边坐了下来"], + ["凯伊姆", "「逃跑的男人怎么样了?」"], + ["吉克", "「嗯?已经不在这个世上了」。"], + ["吉克", "「有什么想要知道的事吗?」"], + ["凯伊姆", "「不,没什么」"], + ["吉克", "「那个无聊的家伙,完全没有趣味呢」"], + ["吉克", "「真希望他也替我负责清扫的部下也考虑考虑」"], + ["凯伊姆", "「真是灾难啊」"], + ["吉克", "「比起那个,我听说了哦。你去追羽化病人了啊」"], + ["凯伊姆", "「消息真灵通」"], + ["吉克", "「梅尔特也注意点」"], + ["吉克", "「你丢钱已经不是一回两回了」"], + ["梅尔特", "「好的—我会注意的。」"], + ["梅尔特", "「吉克还是平常的点单吧」"], + ["梅尔特", "「凯伊姆要再来一杯吗?」"], + ["", "我们用眼神点头示意后,梅尔特开始准备起酒来。"], + ["", "悠然地吐出眼圈后,吉克取出一个纸包放在柜台上。"], + ["吉克", "「这是抓捕逃跑男人的报酬」"], + ["凯伊姆", "「下次有什么事再告诉我」"], + ["梅尔特", "「来,久等了」"], + ["凯伊姆", "「话说回来梅尔特,为什么会被那种孩子偷到钱?」"], + ["吉克", "「让我猜猜看」"], + ["吉克", "「是那个吧,看某个特立独行的男人入迷了,所以就有了空隙?」"], + ["梅尔特", "「可惜—」"], + ["梅尔特", "「事实恰恰相反,是那家伙一直在纠缠我」"], + ["凯伊姆", "「完全把你当成新进的女佣了么」"], + ["梅尔特", "「我从前可是很有名的,不会被当成这种下人吧」"], + ["梅尔特", "「······而且,我没法对对我这么钟情的人发火啊」"], + ["凯伊姆&吉克", "「你傻啊」"], + ["梅尔特", "「异口同声呢,不亏是兄弟」"], + ["凯伊姆", "「别用这种称呼,怪恶心的」"], + ["吉克", "「说得没错」"], + ["吉克", "「······说起来······」"], + ["梅尔特", "「怎么了?」"], + ["吉克", "「有件事我一直很在意,我和凯伊姆,哪个是哥哥啊?」"], + ["凯伊姆", "「你也说这么无聊的话题」"], + ["吉克", "「不,这是很重要的事情」"], + ["吉克", "「梅尔特,事实是怎么样的?」"], + ["梅尔特", "「啊~是怎么样的呢~」"], + ["梅尔特", "「我忘记了」"], + ["吉克", "「骗人」"], + ]; +} } \ No newline at end of file From 396abfe2224cae9c7d4f2b7bc8017bbff5fcae8e Mon Sep 17 00:00:00 2001 From: strawberry42271 <2806566736@qq.com> Date: Sat, 1 Feb 2025 00:23:21 +0800 Subject: [PATCH 2/5] =?UTF-8?q?=E6=88=98=E6=96=97=E5=8A=A8=E7=94=BB?= =?UTF-8?q?=EF=BC=8C=E5=B1=9E=E6=80=A7=E6=9B=B4=E5=90=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- _server/table/data.comment.js | 4 +- project/data.js | 14 +- project/enemys.js | 2 +- project/events.js | 130 + project/functions.js | 345 +- project/images/jianji.webp | Bin 0 -> 378474 bytes project/images/miwu.webp | Bin 0 -> 21916 bytes project/plugins.js | 11373 ++++++++++++++++---------------- styles.css | 4 +- 9 files changed, 5965 insertions(+), 5907 deletions(-) create mode 100644 project/images/jianji.webp create mode 100644 project/images/miwu.webp diff --git a/_server/table/data.comment.js b/_server/table/data.comment.js index 6698265..358881b 100644 --- a/_server/table/data.comment.js +++ b/_server/table/data.comment.js @@ -269,7 +269,7 @@ var data_comment_c456ea59_6018_45ef_8bcc_211a24c627dc = { "_type": "textarea", "_data": "法强", }, - "spelldef": { + "mdef": { "_leaf": true, "_type": "textarea", "_data": "法抗百分比", @@ -280,7 +280,7 @@ var data_comment_c456ea59_6018_45ef_8bcc_211a24c627dc = { "_data": "100为法强转化为等值魔攻", "_docs": "魔攻比例" }, - "mdef": { + "mhp": { "_leaf": true, "_type": "textarea", "_data": "100为法强转化为等值护盾", diff --git a/project/data.js b/project/data.js index 0920725..0674e05 100644 --- a/project/data.js +++ b/project/data.js @@ -437,12 +437,14 @@ var data_a1e2fb4a_e986_4524_b0da_9b7ba7c0874d = "face_440110.webp", "green.webp", "hero.webp", + "jianji.webp", "l.webp", "lane1.webp", "light.webp", "lock.webp", "lr.webp", "maba.webp", + "miwu.webp", "null.webp", "other_0001.webp", "other_0002.webp", @@ -1116,7 +1118,7 @@ var data_a1e2fb4a_e986_4524_b0da_9b7ba7c0874d = "atk": 100, "def": 100, "mdef": 0, - "speed": 0, + "speed": 10, "money": 0, "exp": 0, "equipment": [], @@ -1494,14 +1496,12 @@ var data_a1e2fb4a_e986_4524_b0da_9b7ba7c0874d = ], "startText": [ { - "type": "setValue", - "name": "item:book", - "value": "1" + "type": "function", + "function": "function(){\ncore.getItem('book',1);core.getItem('fly',1)\n}" }, { - "type": "setValue", - "name": "item:fly", - "value": "1" + "type": "insert", + "name": "战斗动画特效注册" }, { "type": "insert", diff --git a/project/enemys.js b/project/enemys.js index f4da758..8c80082 100644 --- a/project/enemys.js +++ b/project/enemys.js @@ -4,7 +4,7 @@ var enemys_fcae963b_31c9_42b4_b48c_bb48d09f3f80 = "redSlime": {"name":"红头怪","hp":0,"atk":0,"def":0,"money":0,"exp":0,"point":0,"special":[],"value":10,"magic":false}, "blackSlime": {"name":"青头怪","hp":0,"atk":0,"def":0,"money":0,"exp":0,"point":0,"special":0}, "slimelord": {"name":"怪王","hp":100,"atk":120,"def":0,"money":10,"exp":0,"point":0,"special":[1,9]}, - "bat": {"name":"小蝙蝠","hp":100,"atk":120,"def":0,"money":2,"exp":0,"point":0,"special":[1],"mdef":0,"speed":10}, + "bat": {"name":"小蝙蝠","hp":100,"atk":120,"def":0,"money":2,"exp":0,"point":0,"special":[1],"mdef":0,"speed":15}, "bigBat": {"name":"大蝙蝠","hp":0,"atk":0,"def":0,"money":0,"exp":0,"point":0,"special":0}, "redBat": {"name":"红蝙蝠","hp":0,"atk":0,"def":0,"money":0,"exp":0,"point":0,"special":[]}, "vampire": {"name":"冥灵魔王","hp":888,"atk":888,"def":888,"money":888,"exp":888,"point":0,"special":[6],"n":8}, diff --git a/project/events.js b/project/events.js index 5c6c1a0..20f75d5 100644 --- a/project/events.js +++ b/project/events.js @@ -10883,6 +10883,136 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = } ] } + ], + "战斗动画特效注册": [ + { + "type": "setanimate", + "name": "sword", + "px": 48, + "py": 48, + "width": 192, + "height": 192, + "allFarme": 15, + "imageList": [ + { + "image": "jianji.webp", + "beforefarme": 0, + "globalAlpha": 100, + "cx": 192, + "cy": 2112, + "cw": 192, + "ch": 192, + "x": 0, + "y": 0, + "w": 96, + "h": 96, + "afterfarme": 3, + "acx": 192, + "acy": 2112, + "acw": 192, + "ach": 192, + "ax": 0, + "ay": 0, + "aw": 96, + "ah": 96 + }, + { + "image": "jianji.webp", + "beforefarme": 4, + "globalAlpha": 100, + "cx": 384, + "cy": 2112, + "cw": 192, + "ch": 192, + "x": 0, + "y": 0, + "w": 96, + "h": 96, + "afterfarme": 6, + "acx": 384, + "acy": 2112, + "acw": 192, + "ach": 192, + "ax": 0, + "ay": 0, + "aw": 96, + "ah": 96 + }, + { + "image": "jianji.webp", + "beforefarme": 7, + "globalAlpha": 100, + "cx": 576, + "cy": 2112, + "cw": 192, + "ch": 192, + "x": 0, + "y": 0, + "w": 96, + "h": 96, + "afterfarme": 9, + "acx": 576, + "acy": 2112, + "acw": 192, + "ach": 192, + "ax": 0, + "ay": 0, + "aw": 96, + "ah": 96 + }, + { + "image": "jianji.webp", + "beforefarme": 10, + "globalAlpha": 100, + "cx": 768, + "cy": 2112, + "cw": 192, + "ch": 192, + "x": 0, + "y": 0, + "w": 96, + "h": 96, + "afterfarme": 12, + "acx": 768, + "acy": 2112, + "acw": 192, + "ach": 192, + "ax": 0, + "ay": 0, + "aw": 96, + "ah": 96 + }, + { + "image": "jianji.webp", + "beforefarme": 13, + "globalAlpha": 100, + "cx": 0, + "cy": 2304, + "cw": 192, + "ch": 192, + "x": 0, + "y": 0, + "w": 96, + "h": 96, + "afterfarme": 15, + "acx": 0, + "acy": 2304, + "acw": 192, + "ach": 192, + "ax": 0, + "ay": 0, + "aw": 96, + "ah": 96 + } + ], + "soundList": [ + { + "sound": "", + "startfarme": 0, + "stopbefore": false + } + ] + } ] }, "CommonEventTemplate": { diff --git a/project/functions.js b/project/functions.js index ea0a448..d202ca9 100644 --- a/project/functions.js +++ b/project/functions.js @@ -892,171 +892,170 @@ var functions_d6ad677b_427a_4623_b50f_a445a3b0ef8a = }; }, "getDamageInfo": function (enemy, hero, x, y, floorId) { - // 获得战斗伤害信息(实际伤害计算函数) - // - // 参数说明: - // enemy:该怪物信息 - // hero:勇士的当前数据;如果对应项不存在则会从core.status.hero中取。 - // x,y:该怪物的坐标(查看手册和强制战斗时为undefined) - // floorId:该怪物所在的楼层 - // 后面三个参数主要是可以在光环等效果上可以适用 - floorId = floorId || core.status.floorId; + // 获得战斗伤害信息(实际伤害计算函数) + // + // 参数说明: + // enemy:该怪物信息 + // hero:勇士的当前数据;如果对应项不存在则会从core.status.hero中取。 + // x,y:该怪物的坐标(查看手册和强制战斗时为undefined) + // floorId:该怪物所在的楼层 + // 后面三个参数主要是可以在光环等效果上可以适用 + floorId = floorId || core.status.floorId; - var hero_hp = core.getRealStatusOrDefault(hero, "hp"), - hero_atk = core.getRealStatusOrDefault(hero, "atk"), - hero_def = core.getRealStatusOrDefault(hero, "def"), - hero_mdef = core.getRealStatusOrDefault(hero, "mdef"), - hero_speed = core.getRealStatusOrDefault(hero, "speed"), - hero_magic = core.getRealStatusOrDefault(hero, "magic"), - origin_hero_hp = core.getStatusOrDefault(hero, "hp"), - origin_hero_atk = core.getStatusOrDefault(hero, "atk"), - origin_hero_def = core.getStatusOrDefault(hero, "def"); + var hero_hp = core.getRealStatusOrDefault(hero, "hp"), + hero_atk = core.getRealStatusOrDefault(hero, "atk"), + hero_def = core.getRealStatusOrDefault(hero, "def"), + hero_mdef = core.getRealStatusOrDefault(hero, "mdef"), + hero_speed = core.getRealStatusOrDefault(hero, "speed"), + hero_magic = core.getRealStatusOrDefault(hero, "magic"), + origin_hero_hp = core.getStatusOrDefault(hero, "hp"), + origin_hero_atk = core.getStatusOrDefault(hero, "atk"), + origin_hero_def = core.getStatusOrDefault(hero, "def"); - // 怪物的各项数据 - // 对坚固模仿等处理扔到了脚本编辑-getEnemyInfo之中 - var enemyInfo = core.enemys.getEnemyInfo(enemy, hero, x, y, floorId); - var mon_hp = enemyInfo.hp, - mon_atk = enemyInfo.atk, - mon_def = enemyInfo.def, - mon_mdef = enemyInfo.mdef, - mon_speed = enemyInfo.speed, - mon_special = enemyInfo.special, - mon_absorb_damage = enemyInfo.absorb, - mon_barrier = enemyInfo.barrier; + // 怪物的各项数据 + // 对坚固模仿等处理扔到了脚本编辑-getEnemyInfo之中 + var enemyInfo = core.enemys.getEnemyInfo(enemy, hero, x, y, floorId); + var mon_hp = enemyInfo.hp, + mon_atk = enemyInfo.atk, + mon_def = enemyInfo.def, + mon_mdef = enemyInfo.mdef, + mon_speed = enemyInfo.speed, + mon_special = enemyInfo.special, + mon_absorb_damage = enemyInfo.absorb, + mon_barrier = enemyInfo.barrier; - //---第一部分:静态属性修正--- - //此处写入静态影响勇士属性的勇士或怪物技能(静态影响怪物属性的技能于getEnemyInfo中写入) - // 技能的处理 - if (core.getFlag("skill", 0) == 1) { - // 开启了技能1:二倍斩 - hero_atk *= 2; // 计算时攻击力翻倍 - } - //勇士属性取整 - hero_atk = Math.max(0, Math.floor(hero_atk)); - hero_def = Math.max(0, Math.floor(hero_def)); - hero_mdef = Math.max(0, Math.floor(hero_mdef)); - hero_speed = Math.max(0, Math.floor(hero_speed)); + //---第一部分:静态属性修正--- + //此处写入静态影响勇士属性的勇士或怪物技能(静态影响怪物属性的技能于getEnemyInfo中写入) + // 技能的处理 + if (core.getFlag("skill", 0) == 1) { + // 开启了技能1:二倍斩 + hero_atk *= 2; // 计算时攻击力翻倍 + } + //勇士属性取整 + hero_atk = Math.max(0, Math.floor(hero_atk)); + hero_def = Math.max(0, Math.floor(hero_def)); + hero_mdef = Math.max(0, Math.floor(hero_mdef)); + hero_speed = Math.max(0, Math.floor(hero_speed)); - // 如果是无敌属性,且勇士未持有十字架 - if (core.hasSpecial(mon_special, 20) && !core.hasItem("cross")) - return null; // 不可战斗 + // 如果是无敌属性,且勇士未持有十字架 + if (core.hasSpecial(mon_special, 20) && !core.hasItem("cross")) + return null; // 不可战斗 - // 战前造成的额外伤害(可被护盾抵消) - let init_damage = 0; + // 战前造成的额外伤害(可被护盾抵消) + let init_damage = 0; - // 吸血 - if (core.hasSpecial(mon_special, 11)) { - let vampire_damage = hero_hp * enemy.vampire; + // 吸血 + if (core.hasSpecial(mon_special, 11)) { + let vampire_damage = hero_hp * enemy.vampire; - // 如果有神圣盾免疫吸血等可以在这里写 - // 也可以用hasItem和hasEquip来判定装备 - // if (core.hasFlag('shield5')) vampire_damage = 0; + // 如果有神圣盾免疫吸血等可以在这里写 + // 也可以用hasItem和hasEquip来判定装备 + // if (core.hasFlag('shield5')) vampire_damage = 0; - vampire_damage = Math.floor(vampire_damage) || 0; - // 加到自身 - if (enemy.add) - // 如果加到自身 - mon_hp += vampire_damage; + vampire_damage = Math.floor(vampire_damage) || 0; + // 加到自身 + if (enemy.add) + // 如果加到自身 + mon_hp += vampire_damage; - init_damage += vampire_damage; - } + init_damage += vampire_damage; + } - //——第二部分:变量定义和初始赋值—— - // 每回合怪物对勇士造成的战斗伤害 - let per_damage = Math.max(mon_atk - hero_def, 0); - if (enemyInfo.magic) per_damage = Math.max(mon_atk - hero_mdef, 0); + //——第二部分:变量定义和初始赋值—— + // 每回合怪物对勇士造成的战斗伤害 + let per_damage = Math.max(mon_atk - hero_def, 0); + if (enemyInfo.magic) per_damage = Math.max(mon_atk - hero_mdef, 0); - // - let hero_per_damage = Math.max(hero_atk - mon_def, 0); - if (hero_magic) hero_per_damage = Math.max(hero_atk - mon_mdef, 0); + // + let hero_per_damage = Math.max(hero_atk - mon_def, 0); + if (hero_magic) hero_per_damage = Math.max(hero_atk - mon_mdef, 0); - let damage = 0, - hero_turn = 0, - mon_turn = 0; - //---第三部分:递归开始--- - let length = hero_speed * mon_speed; + let damage = 0, + hero_turn = 0, + mon_turn = 0; + //---第三部分:递归开始--- + let length = hero_speed * mon_speed; - for ( - let now_mon_hp = mon_hp, - last_mon_hp = mon_hp, - mon_length = length, - hero_length = length, - mon_time = 0, - hero_time = 0; - now_mon_hp > 0; + for ( + let now_mon_hp = mon_hp, + last_mon_hp = mon_hp, + mon_length = length, + hero_length = length, + mon_time = 0, + hero_time = 0; now_mon_hp > 0; - ) { - //勇士和怪物的长度 - mon_time = mon_length / mon_speed; - hero_time = hero_length / hero_speed; - if ( - mon_time < hero_time || - ((mon_time = hero_time) && mon_speed > hero_speed) - ) { - //怪物攻击的回合 - //这里计算怪物攻击时发生的各种变化 + ) { + //勇士和怪物的长度 + mon_time = mon_length / mon_speed; + hero_time = hero_length / hero_speed; + if ( + mon_time < hero_time || + ((mon_time = hero_time) && mon_speed > hero_speed) + ) { + //怪物攻击的回合 + //这里计算怪物攻击时发生的各种变化 - //伤害与回合增加 - damage += per_damage; - if (core.hasSpecial(mon_special, 6)) { - mon_turn += enemy.n; - } else { - mon_turn += 1; - } - //重新为长度赋值 - mon_length = length; - hero_length = hero_length - mon_time * hero_speed; - } else { - //勇士攻击的回合 - // 这里计算勇士攻击时发生的各种变化 + //伤害与回合增加 + damage += per_damage; + if (core.hasSpecial(mon_special, 6)) { + mon_turn += enemy.n; + } else { + mon_turn += 1; + } + //重新为长度赋值 + mon_length = length; + hero_length = hero_length - mon_time * hero_speed; + } else { + //勇士攻击的回合 + // 这里计算勇士攻击时发生的各种变化 - // 伤害与回合数增加 - now_mon_hp -= hero_per_damage; - hero_turn += 1; //勇士回合+1,如果有勇士每回合多次攻击的情况,在这里写判断 - // 无法战斗计算 - if (hero_turn % 50 == 0) { - if (now_mon_hp >= last_mon_hp) return null; - last_mon_hp = now_mon_hp; - } - //重新为长度赋值 - hero_length = length; - mon_length = mon_length - hero_time * mon_speed; - } - } + // 伤害与回合数增加 + now_mon_hp -= hero_per_damage; + hero_turn += 1; //勇士回合+1,如果有勇士每回合多次攻击的情况,在这里写判断 + // 无法战斗计算 + if (hero_turn % 50 == 0) { + if (now_mon_hp >= last_mon_hp) return null; + last_mon_hp = now_mon_hp; + } + //重新为长度赋值 + hero_length = length; + mon_length = mon_length - hero_time * mon_speed; + } + } - //下面这些还没修改 - // 连击 - if (core.hasSpecial(mon_special, 6)) per_damage *= enemy.n || 2; + //下面这些还没修改 + // 连击 + if (core.hasSpecial(mon_special, 6)) per_damage *= enemy.n || 2; - // 每回合的反击伤害;反击是按照勇士的攻击次数来计算回合 - let counterDamage = 0; - if (core.hasSpecial(mon_special, 8)) - counterDamage += Math.floor( - (enemy.counterAttack || core.values.counterAttack) * hero_atk - ); + // 每回合的反击伤害;反击是按照勇士的攻击次数来计算回合 + let counterDamage = 0; + if (core.hasSpecial(mon_special, 8)) + counterDamage += Math.floor( + (enemy.counterAttack || core.values.counterAttack) * hero_atk + ); - // 先攻 - if (core.hasSpecial(mon_special, 1)) init_damage += per_damage; + // 先攻 + if (core.hasSpecial(mon_special, 1)) init_damage += per_damage; - // 破甲 - if (core.hasSpecial(mon_special, 7)) - init_damage += Math.floor( - (enemy.breakArmor || core.values.breakArmor) * hero_def - ); + // 破甲 + if (core.hasSpecial(mon_special, 7)) + init_damage += Math.floor( + (enemy.breakArmor || core.values.breakArmor) * hero_def + ); - // 净化 - if (core.hasSpecial(mon_special, 9)) - init_damage += Math.floor( - (enemy.purify || core.values.purify) * hero_mdef - ); - //上面这些还没修改 - //勇士护盾计算 - let barrier = hero_mdef; - if (enemyInfo.magic) barrier = hero_def; + // 净化 + if (core.hasSpecial(mon_special, 9)) + init_damage += Math.floor( + (enemy.purify || core.values.purify) * hero_mdef + ); + //上面这些还没修改 + //勇士护盾计算 + let barrier = hero_mdef; + if (enemyInfo.magic) barrier = hero_def; - // ------ 支援 ----- // - // 这个递归最好想明白为什么,flag:__extraTurn__是怎么用的 - /*var guards = core.getFlag("__guards__" + x + "_" + y, enemyInfo.guards); + // ------ 支援 ----- // + // 这个递归最好想明白为什么,flag:__extraTurn__是怎么用的 + /*var guards = core.getFlag("__guards__" + x + "_" + y, enemyInfo.guards); var guard_before_current_enemy = false; // ------ 支援怪是先打(true)还是后打(false)? turn += core.getFlag("__extraTurn__", 0); if (guards.length > 0) { @@ -1084,43 +1083,43 @@ var functions_d6ad677b_427a_4623_b50f_a445a3b0ef8a = } } core.removeFlag("__extraTurn__");*/ - // ------ 支援END ------ // + // ------ 支援END ------ // - // 最终伤害:初始伤害 + 怪物对勇士造成的伤害 + 反击伤害 - damage += init_damage + hero_turn * counterDamage; - // 再扣去护盾 - damage -= barrier; + // 最终伤害:初始伤害 + 怪物对勇士造成的伤害 + 反击伤害 + damage += init_damage + hero_turn * counterDamage; + // 再扣去护盾 + damage -= barrier; - // 检查是否允许负伤 - if (!core.flags.enableNegativeDamage) damage = Math.max(0, damage); + // 检查是否允许负伤 + if (!core.flags.enableNegativeDamage) damage = Math.max(0, damage); - // 最后处理仇恨和固伤(因为这两个不能被护盾减伤) - if (core.hasSpecial(mon_special, 17)) { - // 仇恨 - damage += core.getFlag("hatred", 0); - } - if (core.hasSpecial(mon_special, 22)) { - // 固伤 - damage += enemy.damage || 0; - } + // 最后处理仇恨和固伤(因为这两个不能被护盾减伤) + if (core.hasSpecial(mon_special, 17)) { + // 仇恨 + damage += core.getFlag("hatred", 0); + } + if (core.hasSpecial(mon_special, 22)) { + // 固伤 + damage += enemy.damage || 0; + } - return { - mon_hp: Math.floor(mon_hp), - mon_atk: Math.floor(mon_atk), - mon_def: Math.floor(mon_def), - mon_mdef: Math.floor(mon_mdef), - init_damage: Math.floor(init_damage), - per_damage: Math.floor(per_damage), - hero_per_damage: Math.floor(hero_per_damage), - turn: Math.floor(hero_turn), - mon_turn: Math.floor(mon_turn), - damage: Math.floor(damage), - }; - /*TODO:怪物手册的修改(需要修改这里return的内容以及一些战后判断) + return { + mon_hp: Math.floor(mon_hp), + mon_atk: Math.floor(mon_atk), + mon_def: Math.floor(mon_def), + mon_mdef: Math.floor(mon_mdef), + init_damage: Math.floor(init_damage), + per_damage: Math.floor(per_damage), + hero_per_damage: Math.floor(hero_per_damage), + turn: Math.floor(hero_turn), + mon_turn: Math.floor(mon_turn), + damage: Math.floor(damage), + }; + /*TODO:怪物手册的修改(需要修改这里return的内容以及一些战后判断) 1. 显示怪物是魔攻还是物攻(在怪物名字上做颜色变化,物攻是黄色,魔攻是蓝色) 2. 一防减伤是物防还是魔防(由怪物是物攻还是魔攻来转换) 3. 特殊战斗的怪物,在怪物手册里“伤害”写为“特殊战”*/ - } +} }, "actions": { "onKeyUp": function (keyCode, altKey) { diff --git a/project/images/jianji.webp b/project/images/jianji.webp new file mode 100644 index 0000000000000000000000000000000000000000..40504a47d58df1f30f628be1f20251ddea8671ec GIT binary patch literal 378474 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�NQre1JPIq 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�+}N0hlWlkg(Q@3P2u4)BlE)J<~#r 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 core.doAction(), 3100); - } else { - core.doAction(); - } - }); + setTimeout(() => core.doAction(), 3100); + } else { + core.doAction(); + } + }); - core.registerEvent("over", function (data) { - let image = data.image ?? ""; - let time = data.time ?? 3000; - let sound = data.sound ?? ""; - let textColor = data.textColor ?? "#FFFFFF"; - let boldColor = data.boldColor ?? "#000000"; - let font = data.font ?? "bold 48px Verdana"; - let text = data.text ?? ""; - let hidetime = data.hidetime ?? 100; - if (!main.replayChecking && !core.isReplaying()) { - core.over( - image, - data.memory, - time, - hidetime, - sound, - textColor, - boldColor, - font, - text - ); - } else { - core.doAction(); - } - }); - core.registerEvent("changebg", function (data) { - if (!main.replayChecking && !core.isReplaying()) { - core.changebg( - data.img1, - data.memory1, - data.img2, - data.memory2, - data.time, - data.style - ); - } else { - core.doAction(); - } - }); - core.registerEvent("overlist", function (data) { - if (!main.replayChecking && !core.isReplaying()) { - core.overlist( - data.image, - data.memory, - data.hidetime || 30, - data.list || [{ - text: "", - sound: "", - time: 50, - textColor: "#FFFFFF", - boldColor: "#000000", - font: "bold 48px Verdana", - frame: 0, - }, ] - ); - } else { - core.doAction(); - } - }); - core.registerEvent("op", function (data) { - if (!main.replayChecking && !core.isReplaying()) { - core.openvideo(); - } else { - core.doAction(); - } - }); - core.registerEvent("animationDrawable", function (data) { - if (!main.replayChecking && !core.isReplaying()) { - core.animationDrawable( - data.allFarme, - data.color, - data.globalAlpha, - data.imageList, - data.soundList - ); - } else { - core.doAction(); - } - }); - core.registerEvent("setanimate", function (data) { - data.px = data.px ?? 0; - data.py = data.py ?? 0; - core.setanimate( - data.name, - data.px, - data.py, - data.width, - data.height, - data.allFarme, - data.imageList, - data.soundList - ); - core.doAction(); - }); - core.registerEvent("clearanimate", function (data) { - core.plugin.playing.clear(); + core.registerEvent("over", function (data) { + let image = data.image ?? ""; + let time = data.time ?? 3000; + let sound = data.sound ?? ""; + let textColor = data.textColor ?? "#FFFFFF"; + let boldColor = data.boldColor ?? "#000000"; + let font = data.font ?? "bold 48px Verdana"; + let text = data.text ?? ""; + let hidetime = data.hidetime ?? 100; + if (!main.replayChecking && !core.isReplaying()) { + core.over( + image, + data.memory, + time, + hidetime, + sound, + textColor, + boldColor, + font, + text + ); + } else { + core.doAction(); + } + }); + core.registerEvent("changebg", function (data) { + if (!main.replayChecking && !core.isReplaying()) { + core.changebg( + data.img1, + data.memory1, + data.img2, + data.memory2, + data.time, + data.style + ); + } else { + core.doAction(); + } + }); + core.registerEvent("overlist", function (data) { + if (!main.replayChecking && !core.isReplaying()) { + core.overlist( + data.image, + data.memory, + data.hidetime || 30, + data.list || [ + { + text: "", + sound: "", + time: 50, + textColor: "#FFFFFF", + boldColor: "#000000", + font: "bold 48px Verdana", + frame: 0, + }, + ] + ); + } else { + core.doAction(); + } + }); + core.registerEvent("op", function (data) { + if (!main.replayChecking && !core.isReplaying()) { + core.openvideo(); + } else { + core.doAction(); + } + }); + core.registerEvent("animationDrawable", function (data) { + if (!main.replayChecking && !core.isReplaying()) { + core.animationDrawable( + data.allFarme, + data.color, + data.globalAlpha, + data.imageList, + data.soundList + ); + } else { + core.doAction(); + } + }); + core.registerEvent("setanimate", function (data) { + data.px = data.px ?? 0; + data.py = data.py ?? 0; + core.setanimate( + data.name, + data.px, + data.py, + data.width, + data.height, + data.allFarme, + data.imageList, + data.soundList + ); + core.doAction(); + }); + core.registerEvent("clearanimate", function (data) { + core.plugin.playing.clear(); - core.doAction(); - }); - core.registerEvent("deleteanimate", function (data) { - core.deleteanimate(data.name); - core.doAction(); - }); - core.registerEvent("playanimate", function (data) { - if (!main.replayChecking && !core.isReplaying()) { - data.x = data.x ?? 0; - data.y = data.y ?? 0; - data.scalex = data.scalex ?? 1; - data.scaley = data.scaley ?? 1; - core.playanimate( - data.name, - data.x, - data.y, - data.hero, - data.scalex, - data.scaley - ); - core.doAction(); - } else { - core.doAction(); - } - }); - core.registerEvent("cgtextList", function (data) { - core.ui.cgText.textList = core.plugin[data.textList]; - core.doAction(); - }); - core.registerEvent("cgtext", function (data) { - if (!main.replayChecking && !core.isReplaying()) { - core.ui.cgText.image = data.bg; - core.ui.cgText.memory = data.memory; - core.ui.cgText.head = core.clone(data.head); - core.ui.cgText.index = data.index; - core.ui.cgText.name = core.ui.cgText.textList[data.index][0]; - core.ui.cgText.text = data.text ? - data.text : - core.ui.cgText.textList[data.index][1]; - core.ui.cgText.time = data.time; - core.ui.cgText.wait = data.wait; - core.ui.cgText.WindowSkin = data.WindowSkin; - core.ui.cgText.sound = data.sound || ""; - core.ui.cgText.bodyList = core.clone(data.bodyList); - main.dom.cgText.style.display = "block"; - core.ui.cgText.update(); - } else { - core.doAction(); - } - }); - core.registerEvent("introAndLoop", function (data) { - if (!main.replayChecking && !core.isReplaying()) { - core.plugin.introAndLoop(data.intro, data.time, data.loop); - core.doAction(); - } else { - core.doAction(); - } - }); - core.registerEvent("setq", function (data) { - core.setFlag("任务地点", data.id); + core.doAction(); + }); + core.registerEvent("deleteanimate", function (data) { + core.deleteanimate(data.name); + core.doAction(); + }); + core.registerEvent("playanimate", function (data) { + if (!main.replayChecking && !core.isReplaying()) { + data.x = data.x ?? 0; + data.y = data.y ?? 0; + data.scalex = data.scalex ?? 1; + data.scaley = data.scaley ?? 1; + core.playanimate( + data.name, + data.x, + data.y, + data.hero, + data.scalex, + data.scaley + ); + core.doAction(); + } else { + core.doAction(); + } + }); + core.registerEvent("cgtextList", function (data) { + core.ui.cgText.textList = core.plugin[data.textList]; + core.doAction(); + }); + core.registerEvent("cgtext", function (data) { + if (!main.replayChecking && !core.isReplaying()) { + core.ui.cgText.image = data.bg; + core.ui.cgText.memory = data.memory; + core.ui.cgText.head = core.clone(data.head); + core.ui.cgText.index = data.index; + core.ui.cgText.name = core.ui.cgText.textList[data.index][0]; + core.ui.cgText.text = data.text + ? data.text + : core.ui.cgText.textList[data.index][1]; + core.ui.cgText.time = data.time; + core.ui.cgText.wait = data.wait; + core.ui.cgText.WindowSkin = data.WindowSkin; + core.ui.cgText.sound = data.sound || ""; + core.ui.cgText.bodyList = core.clone(data.bodyList); + main.dom.cgText.style.display = "block"; + core.ui.cgText.update(); + } else { + core.doAction(); + } + }); + core.registerEvent("introAndLoop", function (data) { + if (!main.replayChecking && !core.isReplaying()) { + core.plugin.introAndLoop(data.intro, data.time, data.loop); + core.doAction(); + } else { + core.doAction(); + } + }); + core.registerEvent("setq", function (data) { + core.setFlag("任务地点", data.id); - core.doAction(); - }); + core.doAction(); + }); - core.registerEvent("setmusics", function (data) { - if ( - (core.getLocalStorage("musics") && - core.getLocalStorage("musics").length === 0) || - !core.getLocalStorage("musics") - ) - core.setLocalStorage("musics", ["theme.mp3"]); - let a = core.getLocalStorage("musics"); - if (!data.bgm) { - core.setLocalStorage("musics", ["theme.mp3"]); - } else { - if (!a.includes(data.bgm)) a.push(data.bgm); - core.setLocalStorage("musics", a); - } - core.doAction(); - }); - core.registerEvent("setcgs", function (data) { - if (!data.img) { - core.setLocalStorage("cgs", []); - } else { - let a = core.getLocalStorage("cgs") ?? []; - if (!a.includes(data.img)) a.push(data.img); - core.setLocalStorage("cgs", a); - } - core.doAction(); - }); - }; -}, + core.registerEvent("setmusics", function (data) { + if ( + (core.getLocalStorage("musics") && + core.getLocalStorage("musics").length === 0) || + !core.getLocalStorage("musics") + ) + core.setLocalStorage("musics", ["theme.mp3"]); + let a = core.getLocalStorage("musics"); + if (!data.bgm) { + core.setLocalStorage("musics", ["theme.mp3"]); + } else { + if (!a.includes(data.bgm)) a.push(data.bgm); + core.setLocalStorage("musics", a); + } + core.doAction(); + }); + core.registerEvent("setcgs", function (data) { + if (!data.img) { + core.setLocalStorage("cgs", []); + } else { + let a = core.getLocalStorage("cgs") ?? []; + if (!a.includes(data.img)) a.push(data.img); + core.setLocalStorage("cgs", a); + } + core.doAction(); + }); + }; + }, "drawLight": function () { // 绘制灯光/漆黑层效果。调用方式 core.plugin.drawLight(...) // 【参数说明】 @@ -2845,10 +2847,12 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 = const totalWidthScaled = totalWidth * core.domStyle.scale, totalHeightScaled = totalHeight * core.domStyle.scale; - const gameDrawBox = isVertical ? { - left: BORDER_WIDTH / 3, - top: BAR_HEIGHT_VERTICAL / 3 + BORDER_HEIGHT / 3, - } : { left: BAR_WIDTH / 3 + BORDER_WIDTH / 3, top: BORDER_HEIGHT / 3 }; + const gameDrawBox = isVertical ? + { + left: BORDER_WIDTH / 3, + top: BAR_HEIGHT_VERTICAL / 3 + BORDER_HEIGHT / 3, + } : + { left: BAR_WIDTH / 3 + BORDER_WIDTH / 3, top: BORDER_HEIGHT / 3 }; const obj = { clientWidth: clientWidth, @@ -3485,13 +3489,15 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 = this._update_infoWindow(); } _update_toolBox() { - const tools = core.isReplaying() ? [ - [core.status.replay.pausing ? "play" : "pause", "stop", "rewind"], - ["speedDown", "speedUp", "save"], - ] : [ - ["keyboard", "shop", "pack", "T332"], - ["settings", "save", "load", "T331"], - ]; + const tools = core.isReplaying() ? + [ + [core.status.replay.pausing ? "play" : "pause", "stop", "rewind"], + ["speedDown", "speedUp", "save"], + ] : + [ + ["keyboard", "shop", "pack", "T332"], + ["settings", "save", "load", "T331"], + ]; if (core.domStyle.isVertical) { core.clearMap( "outerUI", @@ -3731,588 +3737,591 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 = // init() called in `afterLoadResources`. }, "override": function () { - core.statusBar.icons = { - floor: 0, - name: null, - lv: 1, - hpmax: 2, - hp: 3, - atk: 4, - def: 5, - mdef: 6, - money: 7, - exp: 8, - up: 9, - book: 10, - fly: 11, - toolbox: 12, - keyboard: 13, - shop: 14, - save: 15, - load: 16, - settings: 17, - play: 18, - pause: 19, - stop: 20, - speedDown: 21, - speedUp: 22, - rewind: 23, - equipbox: 24, - mana: 25, - skill: 26, - exit: 27, - btn1: 28, - btn2: 29, - btn3: 30, - btn4: 31, - btn5: 32, - btn6: 33, - btn7: 34, - alt: 35, - keys: 36, - help: 37, - battle: 38, - }; - core.actions._getClickLoc = function (x, y) { - var size = 32 * core.domStyle.scale; - var left = main.dom.gameDraw.offsetLeft + main.dom.gameGroup.offsetLeft; - var top = main.dom.gameDraw.offsetTop + main.dom.gameGroup.offsetTop; - var loc = { - x: Math.max(x - left, 0), - y: Math.max(y - top, 0), - size: size, - }; - return loc; - }; - core.ui._drawWindowSelector = function (background, x, y, w, h) { - w = Math.round(w) + 48; - h = Math.round(h); - var ctx = core.ui.createCanvas("_selector", x - 24, y, w, h, 165); - ctx.canvas.id = ""; - this._drawSelector(ctx, background, w, h); - }; + core.statusBar.icons = { + floor: 0, + name: null, + lv: 1, + hpmax: 2, + hp: 3, + atk: 4, + def: 5, + mdef: 6, + money: 7, + exp: 8, + up: 9, + book: 10, + fly: 11, + toolbox: 12, + keyboard: 13, + shop: 14, + save: 15, + load: 16, + settings: 17, + play: 18, + pause: 19, + stop: 20, + speedDown: 21, + speedUp: 22, + rewind: 23, + equipbox: 24, + mana: 25, + skill: 26, + exit: 27, + btn1: 28, + btn2: 29, + btn3: 30, + btn4: 31, + btn5: 32, + btn6: 33, + btn7: 34, + alt: 35, + keys: 36, + help: 37, + battle: 38, + }; + core.actions._getClickLoc = function (x, y) { + var size = 32 * core.domStyle.scale; + var left = main.dom.gameDraw.offsetLeft + main.dom.gameGroup.offsetLeft; + var top = main.dom.gameDraw.offsetTop + main.dom.gameGroup.offsetTop; + var loc = { + x: Math.max(x - left, 0), + y: Math.max(y - top, 0), + size: size, + }; + return loc; + }; + core.ui._drawWindowSelector = function (background, x, y, w, h) { + w = Math.round(w) + 48; + h = Math.round(h); + var ctx = core.ui.createCanvas("_selector", x - 24, y, w, h, 165); + ctx.canvas.id = ""; + this._drawSelector(ctx, background, w, h); + }; - core.ui._drawSelector = function (ctx, background, w, h, left, top) { - left = left || 0; - top = top || 0; - ctx = this.getContextByName(ctx); - if (!ctx) return; - if (typeof background == "string") - background = core.material.images.images[background]; - if (!(background instanceof Image)) return; - // badge - ctx.drawImage(background, 132, 68, 24, 24, left + 4, top + 4, 24, 24); - ctx.drawImage( - background, - 132, - 68, - 24, - 24, - w - left - 28, - top + 4, - 24, - 24 - ); - }; + core.ui._drawSelector = function (ctx, background, w, h, left, top) { + left = left || 0; + top = top || 0; + ctx = this.getContextByName(ctx); + if (!ctx) return; + if (typeof background == "string") + background = core.material.images.images[background]; + if (!(background instanceof Image)) return; + // badge + ctx.drawImage(background, 132, 68, 24, 24, left + 4, top + 4, 24, 24); + ctx.drawImage( + background, + 132, + 68, + 24, + 24, + w - left - 28, + top + 4, + 24, + 24 + ); + }; - enemys.prototype._nextCriticals_useBinarySearch = function ( - enemy, - info, - number, - x, - y, - floorId - ) { - var mon_hp = info.mon_hp, - hero_atk = core.status.hero.atk, - mon_def = info.mon_def, - pre = info.damage; - var list = []; - var start_atk = hero_atk; - if (info.__over__) { - start_atk += info.__overAtk__; - list.push([info.__overAtk__, -info.damage]); - } - var calNext = function (currAtk, maxAtk) { - var start = Math.floor(currAtk), - end = Math.floor(maxAtk); - if (start > end) return null; + enemys.prototype._nextCriticals_useBinarySearch = function ( + enemy, + info, + number, + x, + y, + floorId + ) { + var mon_hp = info.mon_hp, + hero_atk = core.status.hero.atk, + mon_def = info.mon_def, + pre = info.damage; + var list = []; + var start_atk = hero_atk; + if (info.__over__) { + start_atk += info.__overAtk__; + list.push([info.__overAtk__, -info.damage]); + } + var calNext = function (currAtk, maxAtk) { + var start = Math.floor(currAtk), + end = Math.floor(maxAtk); + if (start > end) return null; - while (start < end) { - var mid = Math.floor((start + end) / 2); - if (mid - start > end - mid) mid--; - var nextInfo = core.enemys.getDamageInfo( - enemy, { atk: mid }, - x, - y, - floorId - ); - if (nextInfo == null || typeof nextInfo == "number") return null; - if (pre > nextInfo.damage) end = mid; - else start = mid + 1; - } - var nextInfo = core.enemys.getDamageInfo( - enemy, { atk: start }, - x, - y, - floorId - ); - return nextInfo == null || - typeof nextInfo == "number" || - nextInfo.damage >= pre ? - null : [start, nextInfo.damage]; - }; - var currAtk = start_atk; - while (true) { - var next = calNext(currAtk + 1, Number.MAX_SAFE_INTEGER, pre); - if (next == null) break; - currAtk = next[0]; - pre = next[1]; - list.push([currAtk - hero_atk, info.damage - pre]); - if (pre <= 0 && !core.flags.enableNegativeDamage) break; - if (list.length >= number) break; - } - if (list.length == 0) list.push([0, 0]); - return list; - }; - core.ui.clearMap = function (name, x, y, width, height) { - if (name == "all") { - for (var m in core.canvas) { - core.canvas[m].clearRect( - -32, - -32, - core.canvas[m].canvas.width + 32, - core.canvas[m].canvas.height + 32 - ); - } - core.clearMap("outerUI"); - core.dom.gif.innerHTML = ""; - core.removeGlobalAnimate(); - core.deleteCanvas(function (one) { - return one.startsWith("_bigImage_"); - }); - core.setWeather(null); - } else { - var ctx = this.getContextByName(name); - if (ctx) - ctx.clearRect( - x || 0, - y || 0, - width || ctx.canvas.width, - height || ctx.canvas.height - ); - } - }; - events.prototype.openBook = function (fromUserAction) { - if (core.isReplaying()) return; - // 如果能恢复事件(从callBook事件触发) - if ( - core.status.event.id == "book" && - core.events.recoverEvents(core.status.event.interval) - ) - return; - // 当前是book,且从“浏览地图”打开 - if (core.status.event.id == "book" && core.status.event.ui) { - core.status.boxAnimateObjs = []; - core.ui._drawViewMaps(core.status.event.ui); - return; - } - // 从“浏览地图”页面打开 - if (core.status.event.id == "viewMaps" || core.status.event.id == "fly") { - fromUserAction = false; - core.status.event.ui = core.status.event.data; - } - if (!this._checkStatus("book", fromUserAction, true)) return; - core.playSound("打开界面"); - core.useItem("book", true); - }; - ////// 怪物手册界面时,放开某个键的操作 ////// - core.actions._keyUpBook = function (keycode) { - if (keycode == 27 || keycode == 88) { - core.playSound("取消"); - if (core.events.recoverEvents(core.status.event.interval)) { - return; - } else if (core.status.event.ui != null) { - core.status.boxAnimateObjs = []; - if (typeof core.status.event.ui === "number") { - core.status.event.id = "fly"; - core.ui.drawFly(core.status.event.ui); - } else { - core.ui._drawViewMaps(core.status.event.ui); - } - } else core.ui.closePanel(); - return; - } - if (keycode == 13 || keycode == 32 || keycode == 67) { - var data = core.status.event.data; - if (data != null) { - core.ui._drawBookDetail(data); - } - return; - } - }; - ////// 怪物手册界面的点击操作 ////// - actions.prototype._clickBook = function (x, y) { - var pageinfo = core.ui._drawBook_pageinfo(); - // 上一页 - if ( - (x == this._HX_ - 2 || x == this._HX_ - 3) && - y === core._HEIGHT_ - 1 - ) { - core.playSound("光标移动"); - core.ui.drawBook(core.status.event.data - pageinfo.per_page); - return; - } - // 下一页 - if ( - (x == this._HX_ + 2 || x == this._HX_ + 3) && - y === core._HEIGHT_ - 1 - ) { - core.playSound("光标移动"); - core.ui.drawBook(core.status.event.data + pageinfo.per_page); - return; - } - // 返回 - if (x >= this.LAST - 2 && y === core._HEIGHT_ - 1) { - core.playSound("取消"); - if (core.events.recoverEvents(core.status.event.interval)) { - return; - } else if (core.status.event.ui != null) { - core.status.boxAnimateObjs = []; - if (typeof core.status.event.ui === "number") { - core.status.event.id = "fly"; - core.ui.drawFly(core.status.event.ui); - } else { - core.ui._drawViewMaps(core.status.event.ui); - } - } else core.ui.closePanel(); - return; - } - // 怪物信息 - var data = core.status.event.data; - if (data != null && y < core._HEIGHT_ - 1) { - var per_page = pageinfo.per_page, - page = parseInt(data / per_page); - var u = (core._HEIGHT_ - 1) / per_page; - for (var i = 0; i < per_page; ++i) { - if (y >= u * i && y < u * (i + 1)) { - var index = per_page * page + i; - core.ui.drawBook(index); - core.ui._drawBookDetail(index); - break; - } - } - return; - } - return; - }; + while (start < end) { + var mid = Math.floor((start + end) / 2); + if (mid - start > end - mid) mid--; + var nextInfo = core.enemys.getDamageInfo( + enemy, + { atk: mid }, + x, + y, + floorId + ); + if (nextInfo == null || typeof nextInfo == "number") return null; + if (pre > nextInfo.damage) end = mid; + else start = mid + 1; + } + var nextInfo = core.enemys.getDamageInfo( + enemy, + { atk: start }, + x, + y, + floorId + ); + return nextInfo == null || + typeof nextInfo == "number" || + nextInfo.damage >= pre + ? null + : [start, nextInfo.damage]; + }; + var currAtk = start_atk; + while (true) { + var next = calNext(currAtk + 1, Number.MAX_SAFE_INTEGER, pre); + if (next == null) break; + currAtk = next[0]; + pre = next[1]; + list.push([currAtk - hero_atk, info.damage - pre]); + if (pre <= 0 && !core.flags.enableNegativeDamage) break; + if (list.length >= number) break; + } + if (list.length == 0) list.push([0, 0]); + return list; + }; + core.ui.clearMap = function (name, x, y, width, height) { + if (name == "all") { + for (var m in core.canvas) { + core.canvas[m].clearRect( + -32, + -32, + core.canvas[m].canvas.width + 32, + core.canvas[m].canvas.height + 32 + ); + } + core.clearMap("outerUI"); + core.dom.gif.innerHTML = ""; + core.removeGlobalAnimate(); + core.deleteCanvas(function (one) { + return one.startsWith("_bigImage_"); + }); + core.setWeather(null); + } else { + var ctx = this.getContextByName(name); + if (ctx) + ctx.clearRect( + x || 0, + y || 0, + width || ctx.canvas.width, + height || ctx.canvas.height + ); + } + }; + events.prototype.openBook = function (fromUserAction) { + if (core.isReplaying()) return; + // 如果能恢复事件(从callBook事件触发) + if ( + core.status.event.id == "book" && + core.events.recoverEvents(core.status.event.interval) + ) + return; + // 当前是book,且从“浏览地图”打开 + if (core.status.event.id == "book" && core.status.event.ui) { + core.status.boxAnimateObjs = []; + core.ui._drawViewMaps(core.status.event.ui); + return; + } + // 从“浏览地图”页面打开 + if (core.status.event.id == "viewMaps" || core.status.event.id == "fly") { + fromUserAction = false; + core.status.event.ui = core.status.event.data; + } + if (!this._checkStatus("book", fromUserAction, true)) return; + core.playSound("打开界面"); + core.useItem("book", true); + }; + ////// 怪物手册界面时,放开某个键的操作 ////// + core.actions._keyUpBook = function (keycode) { + if (keycode == 27 || keycode == 88) { + core.playSound("取消"); + if (core.events.recoverEvents(core.status.event.interval)) { + return; + } else if (core.status.event.ui != null) { + core.status.boxAnimateObjs = []; + if (typeof core.status.event.ui === "number") { + core.status.event.id = "fly"; + core.ui.drawFly(core.status.event.ui); + } else { + core.ui._drawViewMaps(core.status.event.ui); + } + } else core.ui.closePanel(); + return; + } + if (keycode == 13 || keycode == 32 || keycode == 67) { + var data = core.status.event.data; + if (data != null) { + core.ui._drawBookDetail(data); + } + return; + } + }; + ////// 怪物手册界面的点击操作 ////// + actions.prototype._clickBook = function (x, y) { + var pageinfo = core.ui._drawBook_pageinfo(); + // 上一页 + if ( + (x == this._HX_ - 2 || x == this._HX_ - 3) && + y === core._HEIGHT_ - 1 + ) { + core.playSound("光标移动"); + core.ui.drawBook(core.status.event.data - pageinfo.per_page); + return; + } + // 下一页 + if ( + (x == this._HX_ + 2 || x == this._HX_ + 3) && + y === core._HEIGHT_ - 1 + ) { + core.playSound("光标移动"); + core.ui.drawBook(core.status.event.data + pageinfo.per_page); + return; + } + // 返回 + if (x >= this.LAST - 2 && y === core._HEIGHT_ - 1) { + core.playSound("取消"); + if (core.events.recoverEvents(core.status.event.interval)) { + return; + } else if (core.status.event.ui != null) { + core.status.boxAnimateObjs = []; + if (typeof core.status.event.ui === "number") { + core.status.event.id = "fly"; + core.ui.drawFly(core.status.event.ui); + } else { + core.ui._drawViewMaps(core.status.event.ui); + } + } else core.ui.closePanel(); + return; + } + // 怪物信息 + var data = core.status.event.data; + if (data != null && y < core._HEIGHT_ - 1) { + var per_page = pageinfo.per_page, + page = parseInt(data / per_page); + var u = (core._HEIGHT_ - 1) / per_page; + for (var i = 0; i < per_page; ++i) { + if (y >= u * i && y < u * (i + 1)) { + var index = per_page * page + i; + core.ui.drawBook(index); + core.ui._drawBookDetail(index); + break; + } + } + return; + } + return; + }; - ////// 执行当前自定义事件列表中的下一个事件 ////// - events.prototype.doAction = function () { - // 清空boxAnimate和UI层 - clearInterval(core.status.event.interval); - clearTimeout(core.status.event.interval); - clearInterval(core.status.event.animateUI); - core.status.event.interval = null; - delete core.status.event.aniamteUI; - if (core.status.gameOver || core.status.replay.failed) return; - // 判定是否执行完毕 - if (this._doAction_finishEvents()) return; - core.clearUI(); - var floorId = core.status.event.data.floorId || core.status.floorId; - // 当前点坐标和前缀 - var x = core.status.event.data.x, - y = core.status.event.data.y; - var prefix = [ - floorId || ":f", - x != null ? x : "x", - y != null ? y : "y", - ].join("@"); - var current = core.status.event.data.list[0]; - if (this._popEvents(current, prefix)) return; - // 当前要执行的事件 - var data = current.todo.shift(); - core.status.event.data.current = data; - if (typeof data == "string") data = { type: "text", text: data }; - // 该事件块已经被禁用 - if (data._disabled) return core.doAction(); - if (data.type !== "cgtext") { - core.unregisterAnimationFrame("skip"); - core.setFlag("skip", false); - } - data.floorId = data.floorId || floorId; - core.status.event.data.type = data.type; - this.doEvent(data, x, y, prefix); - return; - }; + ////// 执行当前自定义事件列表中的下一个事件 ////// + events.prototype.doAction = function () { + // 清空boxAnimate和UI层 + clearInterval(core.status.event.interval); + clearTimeout(core.status.event.interval); + clearInterval(core.status.event.animateUI); + core.status.event.interval = null; + delete core.status.event.aniamteUI; + if (core.status.gameOver || core.status.replay.failed) return; + // 判定是否执行完毕 + if (this._doAction_finishEvents()) return; + core.clearUI(); + var floorId = core.status.event.data.floorId || core.status.floorId; + // 当前点坐标和前缀 + var x = core.status.event.data.x, + y = core.status.event.data.y; + var prefix = [ + floorId || ":f", + x != null ? x : "x", + y != null ? y : "y", + ].join("@"); + var current = core.status.event.data.list[0]; + if (this._popEvents(current, prefix)) return; + // 当前要执行的事件 + var data = current.todo.shift(); + core.status.event.data.current = data; + if (typeof data == "string") data = { type: "text", text: data }; + // 该事件块已经被禁用 + if (data._disabled) return core.doAction(); + if (data.type !== "cgtext") { + core.unregisterAnimationFrame("skip"); + core.setFlag("skip", false); + } + data.floorId = data.floorId || floorId; + core.status.event.data.type = data.type; + this.doEvent(data, x, y, prefix); + return; + }; - ////// 在某个canvas上绘制粗体 ////// - core.fillBoldText1 = function ( - name, - text, - x, - y, - style, - strokeStyle, - lineWidth, - font, - maxWidth - ) { - var ctx = this.getContextByName(name); - if (!ctx) return; - if (font) ctx.font = font; - if (!style) style = ctx.fillStyle; - style = core.arrayToRGBA(style); - if (!strokeStyle) strokeStyle = "#000000"; - strokeStyle = core.arrayToRGBA(strokeStyle); - if (maxWidth != null) { - this.setFontForMaxWidth(ctx, text, maxWidth); - } - ctx.strokeStyle = strokeStyle; + ////// 在某个canvas上绘制粗体 ////// + core.fillBoldText1 = function ( + name, + text, + x, + y, + style, + strokeStyle, + lineWidth, + font, + maxWidth + ) { + var ctx = this.getContextByName(name); + if (!ctx) return; + if (font) ctx.font = font; + if (!style) style = ctx.fillStyle; + style = core.arrayToRGBA(style); + if (!strokeStyle) strokeStyle = "#000000"; + strokeStyle = core.arrayToRGBA(strokeStyle); + if (maxWidth != null) { + this.setFontForMaxWidth(ctx, text, maxWidth); + } + ctx.strokeStyle = strokeStyle; - if (!lineWidth) lineWidth = 2; - ctx.lineWidth = lineWidth; - ctx.strokeText(text, x, y); - ctx.fillStyle = style; - ctx.fillText(text, x, y); - }; - ////// 绘制 WindowSkin - ui.prototype.drawWindowSkin = function ( - background, - ctx, - x, - y, - w, - h, - direction, - px, - py, - size = 1 - ) { - background = background || core.status.textAttribute.background; + if (!lineWidth) lineWidth = 2; + ctx.lineWidth = lineWidth; + ctx.strokeText(text, x, y); + ctx.fillStyle = style; + ctx.fillText(text, x, y); + }; + ////// 绘制 WindowSkin + ui.prototype.drawWindowSkin = function ( + background, + ctx, + x, + y, + w, + h, + direction, + px, + py, + size = 1 + ) { + background = background || core.status.textAttribute.background; - // 仿RM窗口皮肤 ↓ - // 绘制背景 - core.drawImage( - ctx, - background, - 0, - 0, - 128, - 128, - x + 2 * size, - y + 2 * size, - w - 4 * size, - h - 4 * size - ); - // 绘制边框 - // 上方 - core.drawImage( - ctx, - background, - 128, - 0, - 16, - 16, - x, - y, - 16 * size, - 16 * size - ); - for (var dx = 0; dx < w - 64 * size; dx += 32 * size) { - core.drawImage( - ctx, - background, - 144, - 0, - 32, - 16, - x + dx + 16 * size, - y, - 32 * size, - 16 * size - ); - core.drawImage( - ctx, - background, - 144, - 48, - 32, - 16, - x + dx + 16 * size, - y + h - 16 * size, - 32 * size, - 16 * size - ); - } - core.drawImage( - ctx, - background, - 144, - 0, - (w - dx - 32 * size) / size, - 16, - x + dx + 16 * size, - y, - w - dx - 32 * size, - 16 * size - ); - core.drawImage( - ctx, - background, - 144, - 48, - (w - dx - 32 * size) / size, - 16, - x + dx + 16 * size, - y + h - 16 * size, - w - dx - 32 * size, - 16 * size - ); - core.drawImage( - ctx, - background, - 176, - 0, - 16, - 16, - x + w - 16 * size, - y, - 16 * size, - 16 * size - ); - // 左右 - for (var dy = 0; dy < h - 64 * size; dy += 32 * size) { - core.drawImage( - ctx, - background, - 128, - 16, - 16, - 32, - x, - y + dy + 16 * size, - 16 * size, - 32 * size - ); - core.drawImage( - ctx, - background, - 176, - 16, - 16, - 32, - x + w - 16 * size, - y + dy + 16 * size, - 16 * size, - 32 * size - ); - } - core.drawImage( - ctx, - background, - 128, - 16, - 16, - (h - dy - 32 * size) / size, - x, - y + dy + 16 * size, - 16 * size, - h - dy - 32 * size - ); - core.drawImage( - ctx, - background, - 176, - 16, - 16, - (h - dy - 32 * size) / size, - x + w - 16 * size, - y + dy + 16 * size, - 16 * size, - h - dy - 32 * size - ); - //下方 - core.drawImage( - ctx, - background, - 128, - 48, - 16, - 16, - x, - y + h - 16 * size, - 16 * size, - 16 * size - ); - core.drawImage( - ctx, - background, - 176, - 48, - 16, - 16, - x + w - 16 * size, - y + h - 16 * size, - 16 * size, - 16 * size - ); + // 仿RM窗口皮肤 ↓ + // 绘制背景 + core.drawImage( + ctx, + background, + 0, + 0, + 128, + 128, + x + 2 * size, + y + 2 * size, + w - 4 * size, + h - 4 * size + ); + // 绘制边框 + // 上方 + core.drawImage( + ctx, + background, + 128, + 0, + 16, + 16, + x, + y, + 16 * size, + 16 * size + ); + for (var dx = 0; dx < w - 64 * size; dx += 32 * size) { + core.drawImage( + ctx, + background, + 144, + 0, + 32, + 16, + x + dx + 16 * size, + y, + 32 * size, + 16 * size + ); + core.drawImage( + ctx, + background, + 144, + 48, + 32, + 16, + x + dx + 16 * size, + y + h - 16 * size, + 32 * size, + 16 * size + ); + } + core.drawImage( + ctx, + background, + 144, + 0, + (w - dx - 32 * size) / size, + 16, + x + dx + 16 * size, + y, + w - dx - 32 * size, + 16 * size + ); + core.drawImage( + ctx, + background, + 144, + 48, + (w - dx - 32 * size) / size, + 16, + x + dx + 16 * size, + y + h - 16 * size, + w - dx - 32 * size, + 16 * size + ); + core.drawImage( + ctx, + background, + 176, + 0, + 16, + 16, + x + w - 16 * size, + y, + 16 * size, + 16 * size + ); + // 左右 + for (var dy = 0; dy < h - 64 * size; dy += 32 * size) { + core.drawImage( + ctx, + background, + 128, + 16, + 16, + 32, + x, + y + dy + 16 * size, + 16 * size, + 32 * size + ); + core.drawImage( + ctx, + background, + 176, + 16, + 16, + 32, + x + w - 16 * size, + y + dy + 16 * size, + 16 * size, + 32 * size + ); + } + core.drawImage( + ctx, + background, + 128, + 16, + 16, + (h - dy - 32 * size) / size, + x, + y + dy + 16 * size, + 16 * size, + h - dy - 32 * size + ); + core.drawImage( + ctx, + background, + 176, + 16, + 16, + (h - dy - 32 * size) / size, + x + w - 16 * size, + y + dy + 16 * size, + 16 * size, + h - dy - 32 * size + ); + //下方 + core.drawImage( + ctx, + background, + 128, + 48, + 16, + 16, + x, + y + h - 16 * size, + 16 * size, + 16 * size + ); + core.drawImage( + ctx, + background, + 176, + 48, + 16, + 16, + x + w - 16 * size, + y + h - 16 * size, + 16 * size, + 16 * size + ); - // arrow - if (px != null && py != null) { - if (direction == "up") { - core.drawImage( - ctx, - background, - 128, - 96, - 32, - 32, - px, - y + h - 3 * size, - 32 * size, - 32 * size - ); - } else if (direction == "down") { - core.drawImage( - ctx, - background, - 160, - 96, - 32, - 32, - px, - y - 29 * size, - 32 * size, - 32 * size - ); - } - } - // 仿RM窗口皮肤 ↑ - }; - events.prototype.battle = function (id, x, y, force, callback) { - core.saveAndStopAutomaticRoute(); - id = id || core.getBlockId(x, y); - const cls = core.getClsFromId(id) - if (!id || !cls || !(cls === 'enemys' || cls === 'enemy48')) return core.clearContinueAutomaticRoute(callback); - // 非强制战斗 - if (!core.enemys.canBattle(id, x, y) && !force && !core.status.event.id) { - core.stopSound(); - core.playSound("操作失败"); - core.drawTip("你打不过此怪物!", id); - return core.clearContinueAutomaticRoute(callback); - } - // 自动存档 - if (!core.status.event.id) core.autosave(true); - // 战前事件 - if (!this.beforeBattle(id, x, y)) - return core.clearContinueAutomaticRoute(callback); - // 战后事件 - this.afterBattle(id, x, y); - if (callback) callback(); - }; - -}, + // arrow + if (px != null && py != null) { + if (direction == "up") { + core.drawImage( + ctx, + background, + 128, + 96, + 32, + 32, + px, + y + h - 3 * size, + 32 * size, + 32 * size + ); + } else if (direction == "down") { + core.drawImage( + ctx, + background, + 160, + 96, + 32, + 32, + px, + y - 29 * size, + 32 * size, + 32 * size + ); + } + } + // 仿RM窗口皮肤 ↑ + }; + events.prototype.battle = function (id, x, y, force, callback) { + core.saveAndStopAutomaticRoute(); + id = id || core.getBlockId(x, y); + const cls = core.getClsFromId(id); + if (!id || !cls || !(cls === "enemys" || cls === "enemy48")) + return core.clearContinueAutomaticRoute(callback); + // 非强制战斗 + if (!core.enemys.canBattle(id, x, y) && !force && !core.status.event.id) { + core.stopSound(); + core.playSound("操作失败"); + core.drawTip("你打不过此怪物!", id); + return core.clearContinueAutomaticRoute(callback); + } + // 自动存档 + if (!core.status.event.id) core.autosave(true); + // 战前事件 + if (!this.beforeBattle(id, x, y)) + return core.clearContinueAutomaticRoute(callback); + // 战后事件 + this.afterBattle(id, x, y); + if (callback) callback(); + }; + }, "额外信息": function () { /* 宝石血瓶左下角显示数值 * 注意!!!不要在道具属性中直接操作flags,使用core.status.hero.flags或core.setFlag系列函数代替! @@ -8724,8 +8733,8 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 = }; }, "音频系统": function () { - // 在此增加新插件 - /*首先,在造塔群下载所需的库文件,然后放置在塔目录下的 libs/thirdparty 或其他目录下,之后在 index.html 的最后加上下面这几行: + // 在此增加新插件 + /*首先,在造塔群下载所需的库文件,然后放置在塔目录下的 libs/thirdparty 或其他目录下,之后在 index.html 的最后加上下面这几行: @@ -8733,2327 +8742,2081 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 = */ - // 将__enable置为false将关闭插件 - let __enable = true; - if (!__enable || main.mode === "editor") return; - const { OggOpusDecoderWebWorker } = window["ogg-opus-decoder"]; - const { OggVorbisDecoderWebWorker } = window["ogg-vorbis-decoder"]; - const { CodecParser } = window.CodecParser; - const { Transition, linear } = core.plugin.animate; - - const audio = new Audio(); - const AudioStatus = { - Playing: 0, - Pausing: 1, - Paused: 2, - Stoping: 3, - Stoped: 4, - }; - const supportMap = new Map(); - const AudioType = { - Mp3: "audio/mpeg", - Wav: 'audio/wav; codecs="1"', - Flac: "audio/flac", - Opus: 'audio/ogg; codecs="opus"', - Ogg: 'audio/ogg; codecs="vorbis"', - Aac: "audio/aac", - }; - /** - * 检查一种音频类型是否能被播放 - * @param type 音频类型 AudioType - */ - function isAudioSupport(type) { - if (supportMap.has(type)) return supportMap.get(type); - else { - const support = audio.canPlayType(type); - const canPlay = support === "maybe" || support === "probably"; - supportMap.set(type, canPlay); - return canPlay; - } - } - - const typeMap = new Map([ - ["ogg", AudioType.Ogg], - ["mp3", AudioType.Mp3], - ["wav", AudioType.Wav], - ["flac", AudioType.Flac], - ["opus", AudioType.Opus], - ["aac", AudioType.Aac], - ]); - - /** - * 根据文件名拓展猜测其类型 - * @param file 文件名 string - */ - function guessTypeByExt(file) { - const ext = /\.[a-zA-Z\d]+$/.exec(file); - if (!ext?.[0]) return ""; - const type = ext[0].slice(1); - return typeMap.get(type.toLocaleLowerCase()) ?? ""; - } - - isAudioSupport(AudioType.Ogg); - isAudioSupport(AudioType.Mp3); - isAudioSupport(AudioType.Wav); - isAudioSupport(AudioType.Flac); - isAudioSupport(AudioType.Opus); - isAudioSupport(AudioType.Aac); - - function isNil(value) { - return value === void 0 || value === null; - } - - function sleep(time) { - return new Promise((res) => setTimeout(res, time)); - } - class AudioEffect { - constructor(ac) {} - /** - * 连接至其他效果器 - * @param target 目标输入 IAudioInput - * @param output 当前效果器输出通道 Number - * @param input 目标效果器的输入通道 Number - */ - connect(target, output, input) { - this.output.connect(target.input, output, input); - } - - /** - * 与其他效果器取消连接 - * @param target 目标输入 IAudioInput - * @param output 当前效果器输出通道 Number - * @param input 目标效果器的输入通道 Number - */ - disconnect(target, output, input) { - if (!target) { - if (!isNil(output)) { - this.output.disconnect(output); - } else { - this.output.disconnect(); - } - } else { - if (!isNil(output)) { - if (!isNil(input)) { - this.output.disconnect(target.input, output, input); - } else { - this.output.disconnect(target.input, output); - } - } else { - this.output.disconnect(target.input); - } - } - } - } - - class StereoEffect extends AudioEffect { - constructor(ac) { - super(ac); - const panner = ac.createPanner(); - this.input = panner; - this.output = panner; - } - - /** - * 设置音频朝向,x正方形水平向右,y正方形垂直于地面向上,z正方向垂直屏幕远离用户 - * @param x 朝向x坐标 Number - * @param y 朝向y坐标 Number - * @param z 朝向z坐标 Number - */ - setOrientation(x, y, z) { - this.output.orientationX.value = x; - this.output.orientationY.value = y; - this.output.orientationZ.value = z; - } - /** - * 设置音频位置,x正方形水平向右,y正方形垂直于地面向上,z正方向垂直屏幕远离用户 - * @param x 位置x坐标 Number - * @param y 位置y坐标 Number - * @param z 位置z坐标 Number - */ - setPosition(x, y, z) { - this.output.positionX.value = x; - this.output.positionY.value = y; - this.output.positionZ.value = z; - } - end() {} - - start() {} - } - class VolumeEffect extends AudioEffect { - constructor(ac) { - super(ac); - const gain = ac.createGain(); - this.input = gain; - this.output = gain; - } - - /** - * 设置音量大小 - * @param volume 音量大小 Number - */ - setVolume(volume) { - this.output.gain.value = volume; - } - - /** - * 获取音量大小 Number - */ - getVolume() { - return this.output.gain.value; - } - - end() {} - - start() {} - } - class ChannelVolumeEffect extends AudioEffect { - /** 所有的音量控制节点 */ - - constructor(ac) { - super(ac); - /** 所有的音量控制节点 */ - this.gain = []; - const splitter = ac.createChannelSplitter(); - const merger = ac.createChannelMerger(); - this.output = merger; - this.input = splitter; - for (let i = 0; i < 6; i++) { - const gain = ac.createGain(); - splitter.connect(gain, i); - gain.connect(merger, 0, i); - this.gain.push(gain); - } - } - - /** - * 设置某个声道的音量大小 - * @param channel 要设置的声道,可填0-5 Number - * @param volume 这个声道的音量大小 Number - */ - setVolume(channel, volume) { - if (!this.gain[channel]) return; - this.gain[channel].gain.value = volume; - } - - /** - * 获取某个声道的音量大小,可填0-5 - * @param channel 要获取的声道 Number - */ - getVolume(channel) { - if (!this.gain[channel]) return 0; - return this.gain[channel].gain.value; - } - - end() {} - - start() {} - } - class DelayEffect extends AudioEffect { - constructor(ac) { - super(ac); - - const delay = ac.createDelay(); - this.input = delay; - this.output = delay; - } - - /** - * 设置延迟时长 - * @param delay 延迟时长,单位秒 Number - */ - setDelay(delay) { - this.output.delayTime.value = delay; - } - - /** - * 获取延迟时长 - */ - getDelay() { - return this.output.delayTime.value; - } - - end() {} - - start() {} - } - class EchoEffect extends AudioEffect { - constructor(ac) { - super(ac); - /** 当前增益 */ - this.gain = 0.5; - /** 是否正在播放 */ - this.playing = false; - const delay = ac.createDelay(); - const gain = ac.createGain(); - gain.gain.value = 0.5; - delay.delayTime.value = 0.05; - delay.connect(gain); - gain.connect(delay); - /** 延迟节点 */ - this.delay = delay; - /** 反馈增益节点 */ - this.gainNode = gain; - - this.input = gain; - this.output = gain; - } - - /** - * 设置回声反馈增益大小 - * @param gain 增益大小,范围 0-1,大于等于1的视为0.5,小于0的视为0 Number - */ - setFeedbackGain(gain) { - const resolved = gain >= 1 ? 0.5 : gain < 0 ? 0 : gain; - this.gain = resolved; - if (this.playing) this.gainNode.gain.value = resolved; - } - - /** - * 设置回声间隔时长 - * @param delay 回声时长,范围 0.01-Infinity,小于0.01的视为0.01 Number - */ - setEchoDelay(delay) { - const resolved = delay < 0.01 ? 0.01 : delay; - this.delay.delayTime.value = resolved; - } - - /** - * 获取反馈节点增益 - */ - getFeedbackGain() { - return this.gain; - } - - /** - * 获取回声间隔时长 - */ - getEchoDelay() { - return this.delay.delayTime.value; - } - - end() { - this.playing = false; - const echoTime = Math.ceil(Math.log(0.001) / Math.log(this.gain)) + 10; - sleep(this.delay.delayTime.value * echoTime).then(() => { - if (!this.playing) this.gainNode.gain.value = 0; - }); - } - - start() { - this.playing = true; - this.gainNode.gain.value = this.gain; - } - } - - class StreamLoader { - constructor(url) { - /** 传输目标 Set*/ - this.target = new Set(); - this.loading = false; - } - - /** - * 将加载流传递给字节流读取对象 - * @param reader 字节流读取对象 IStreamReader - */ - pipe(reader) { - if (this.loading) { - console.warn( - "Cannot pipe new StreamReader object when stream is loading." - ); - return; - } - this.target.add(reader); - reader.piped(this); - return this; - } - - async start() { - if (this.loading) return; - this.loading = true; - const response = await window.fetch(this.url); - const stream = response.body; - if (!stream) { - console.error("Cannot get reader when fetching '" + this.url + "'."); - return; - } - // 获取读取器 - this.stream = stream; - const reader = response.body?.getReader(); - const targets = [...this.target]; - - await Promise.all(targets.map((v) => v.start(stream, this, response))); - if (reader && reader.read) { - // 开始流传输 - while (true) { - const { value, done } = await reader.read(); - await Promise.all( - targets.map((v) => v.pump(value, done, response)) - ); - if (done) break; - } - } else { - // 如果不支持流传输 - const buffer = await response.arrayBuffer(); - const data = new Uint8Array(buffer); - await Promise.all(targets.map((v) => v.pump(data, true, response))); - } - - this.loading = false; - targets.forEach((v) => v.end(true)); - - // - } - - cancel(reason) { - if (!this.stream) return; - this.stream.cancel(reason); - this.loading = false; - this.target.forEach((v) => v.end(false, reason)); - } - } - const fileSignatures = [ - [AudioType.Mp3, [0x49, 0x44, 0x33]], - [AudioType.Ogg, [0x4f, 0x67, 0x67, 0x53]], - [AudioType.Wav, [0x52, 0x49, 0x46, 0x46]], - [AudioType.Flac, [0x66, 0x4c, 0x61, 0x43]], - [AudioType.Aac, [0xff, 0xf1]], - [AudioType.Aac, [0xff, 0xf9]], - ]; - const oggHeaders = [ - [AudioType.Opus, [0x4f, 0x70, 0x75, 0x73, 0x48, 0x65, 0x61, 0x64]], - ]; - - function checkAudioType(data) { - let audioType = ""; - // 检查头文件获取音频类型,仅检查前256个字节 - const toCheck = data.slice(0, 256); - for (const [type, value] of fileSignatures) { - if (value.every((v, i) => toCheck[i] === v)) { - audioType = type; - break; - } - } - if (audioType === AudioType.Ogg) { - // 如果是ogg的话,进一步判断是不是opus - for (const [key, value] of oggHeaders) { - const has = toCheck.some((_, i) => { - return value.every((v, ii) => toCheck[i + ii] === v); - }); - if (has) { - audioType = key; - break; - } - } - } - - return audioType; - } - class AudioDecoder { - /** - * 注册一个解码器 - * @param type 要注册的解码器允许解码的类型 - * @param decoder 解码器对象 - */ - static registerDecoder(type, decoder) { - if (!this.decoderMap) this.decoderMap = new Map(); - if (this.decoderMap.has(type)) { - console.warn( - "Audio stream decoder for audio type '" + - type + - "' has already existed." - ); - return; - } - - this.decoderMap.set(type, decoder); - } - - /** - * 解码音频数据 - * @param data 音频文件数据 - * @param player AudioPlayer实例 - */ - static async decodeAudioData(data, player) { - // 检查头文件获取音频类型,仅检查前256个字节 - const toCheck = data.slice(0, 256); - const type = checkAudioType(data); - if (type === "") { - console.error( - "Unknown audio type. Header: '" + [...toCheck] - .map((v) => v.toString().padStart(2, "0")) - .join(" ") - .toUpperCase() + - "'" - ); - return null; - } - if (isAudioSupport(type)) { - if (data.buffer instanceof ArrayBuffer) { - return player.ac.decodeAudioData(data.buffer); - } else { - return null; - } - } else { - const Decoder = this.decoderMap.get(type); - if (!Decoder) { - return null; - } else { - const decoder = new Decoder(); - await decoder.create(); - const decodedData = await decoder.decode(data); - if (!decodedData) return null; - const buffer = player.ac.createBuffer( - decodedData.channelData.length, - decodedData.channelData[0].length, - decodedData.sampleRate - ); - decodedData.channelData.forEach((v, i) => { - buffer.copyToChannel(v, i); - }); - decoder.destroy(); - return buffer; - } - } - } - } - - class VorbisDecoder { - /** - * 创建音频解码器 - */ - async create() { - this.decoder = new OggVorbisDecoderWebWorker(); - await this.decoder.ready; - } - /** - * 摧毁这个解码器 - */ - destroy() { - this.decoder?.free(); - } - /** - * 解码流数据 - * @param data 流数据 - */ - - async decode(data) { - return this.decoder?.decode(data); - } - /** - * 解码整个文件 - * @param data 文件数据 - */ - async decodeAll(data) { - return this.decoder?.decodeFile(data); - } - /** - * 当音频解码完成后,会调用此函数,需要返回之前还未解析或未返回的音频数据。调用后,该解码器将不会被再次使用 - */ - async flush() { - return this.decoder?.flush(); - } - } - - class OpusDecoder { - /** - * 创建音频解码器 - */ - async create() { - this.decoder = new OggOpusDecoderWebWorker(); - await this.decoder.ready; - } - /** - * 摧毁这个解码器 - */ - destroy() { - this.decoder?.free(); - } - /** - * 解码流数据 - * @param data 流数据 - */ - async decode(data) { - return this.decoder?.decode(data); - } - /** - * 解码整个文件 - * @param data 文件数据 - */ - async decodeAll(data) { - return this.decoder?.decodeFile(data); - } - /** - * 当音频解码完成后,会调用此函数,需要返回之前还未解析或未返回的音频数据。调用后,该解码器将不会被再次使用 - */ - async flush() { - return await this.decoder?.flush(); - } - } - const mimeTypeMap = { - [AudioType.Aac]: "audio/aac", - [AudioType.Flac]: "audio/flac", - [AudioType.Mp3]: "audio/mpeg", - [AudioType.Ogg]: "application/ogg", - [AudioType.Opus]: "application/ogg", - [AudioType.Wav]: "application/ogg", - }; - - function isOggPage(data) { - return !isNil(data.isFirstPage); - } - class AudioStreamSource { - - constructor(context) { - this.output = context.createBufferSource(); - /** 是否已经完全加载完毕 */ - this.loaded = false; - /** 是否正在播放 */ - this.playing = false; - /** 已经缓冲了多长时间,如果缓冲完那么跟歌曲时长一致 */ - this.buffered = 0; - /** 已经缓冲的采样点数量 */ - this.bufferedSamples = 0; - /** 歌曲时长,加载完毕之前保持为 0 */ - this.duration = 0; - /** 在流传输阶段,至少缓冲多长时间的音频之后才开始播放,单位秒 */ - this.bufferPlayDuration = 1; - /** 音频的采样率,未成功解析出之前保持为 0 */ - this.sampleRate = 0; - //是否循环播放 - this.loop = false; - /** 上一次播放是从何时开始的 */ - this.lastStartWhen = 0; - /** 开始播放时刻 */ - this.lastStartTime = 0; - /** 上一次播放的缓存长度 */ - this.lastBufferSamples = 0; - - /** 是否已经获取到头文件 */ - this.headerRecieved = false; - /** 音频类型 */ - this.audioType = ""; - /** 每多长时间组成一个缓存 Float32Array */ - this.bufferChunkSize = 10; - /** 缓存音频数据,每 bufferChunkSize 秒钟组成一个 Float32Array,用于流式解码 */ - this.audioData = []; - - this.errored = false; - this.ac = context; - } - /** 当前已经播放了多长时间 */ - get currentTime() { - return this.ac.currentTime - this.lastStartTime + this.lastStartWhen; - } - /** - * 设置每个缓存数据的大小,默认为10秒钟一个缓存数据 - * @param size 每个缓存数据的时长,单位秒 - */ - setChunkSize(size) { - if (this.controller?.loading || this.loaded) return; - this.bufferChunkSize = size; - } - - piped(controller) { - this.controller = controller; - } - - async pump(data, done) { - if (!data || this.errored) return; - if (!this.headerRecieved) { - // 检查头文件获取音频类型,仅检查前256个字节 - const toCheck = data.slice(0, 256); - this.audioType = checkAudioType(data); - if (!this.audioType) { - console.error( - "Unknown audio type. Header: '" + [...toCheck] - .map((v) => v.toString(16).padStart(2, "0")) - .join(" ") - .toUpperCase() + - "'" - ); - return; - } - // 创建解码器 - const Decoder = AudioDecoder.decoderMap.get(this.audioType); - if (!Decoder) { - this.errored = true; - console.error( - "Cannot decode stream source type of '" + - this.audioType + - "', since there is no registered decoder for that type." - ); - return Promise.reject( - `Cannot decode stream source type of '${this.audioType}', since there is no registered decoder for that type.` - ); - } - this.decoder = new Decoder(); - // 创建数据解析器 - const mime = mimeTypeMap[this.audioType]; - const parser = new CodecParser(mime); - this.parser = parser; - await this.decoder.create(); - this.headerRecieved = true; - } - - const decoder = this.decoder; - const parser = this.parser; - if (!decoder || !parser) { - this.errored = true; - return Promise.reject( - "No parser or decoder attached in this AudioStreamSource" - ); - } - - await this.decodeData(data, decoder, parser); - if (done) await this.decodeFlushData(decoder, parser); - this.checkBufferedPlay(); - } - - /** - * 检查采样率,如果还未解析出采样率,那么将设置采样率,如果当前采样率与之前不同,那么发出警告 - */ - checkSampleRate(info) { - for (const one of info) { - const frame = isOggPage(one) ? one.codecFrames[0] : one; - if (frame) { - const rate = frame.header.sampleRate; - if (this.sampleRate === 0) { - this.sampleRate = rate; - break; - } else { - if (rate !== this.sampleRate) { - console.warn("Sample rate in stream audio must be constant."); - } - } - } - } - } - - /** - * 解析音频数据 - */ - async decodeData(data, decoder, parser) { - // 解析音频数据 - const audioData = await decoder.decode(data); - if (!audioData) return; - // @ts-expect-error 库类型声明错误 - const audioInfo = [...parser.parseChunk(data)]; - - // 检查采样率 - this.checkSampleRate(audioInfo); - // 追加音频数据 - this.appendDecodedData(audioData, audioInfo); - } - - /** - * 解码剩余数据 - */ - async decodeFlushData(decoder, parser) { - const audioData = await decoder.flush(); - if (!audioData) return; - // @ts-expect-error 库类型声明错误 - const audioInfo = [...parser.flush()]; - - this.checkSampleRate(audioInfo); - this.appendDecodedData(audioData, audioInfo); - } - - /** - * 追加音频数据 - */ - appendDecodedData(data, info) { - const channels = data.channelData.length; - if (channels === 0) return; - if (this.audioData.length !== channels) { - this.audioData = []; - for (let i = 0; i < channels; i++) { - this.audioData.push([]); - } - } - // 计算出应该放在哪 - const chunk = this.sampleRate * this.bufferChunkSize; - const sampled = this.bufferedSamples; - const pushIndex = Math.floor(sampled / chunk); - const bufferIndex = sampled % chunk; - const dataLength = data.channelData[0].length; - let buffered = 0; - let nowIndex = pushIndex; - let toBuffer = bufferIndex; - while (buffered < dataLength) { - const rest = toBuffer !== 0 ? chunk - bufferIndex : chunk; - - for (let i = 0; i < channels; i++) { - const audioData = this.audioData[i]; - if (!audioData[nowIndex]) { - audioData.push(new Float32Array(chunk)); - } - const toPush = data.channelData[i].slice(buffered, buffered + rest); - - audioData[nowIndex].set(toPush, toBuffer); - } - buffered += rest; - nowIndex++; - toBuffer = 0; - } - - this.buffered += - info.reduce((prev, curr) => prev + curr.duration, 0) / 1000; - this.bufferedSamples += info.reduce( - (prev, curr) => prev + curr.samples, - 0 - ); - } - - /** - * 检查已缓冲内容,并在未开始播放时播放 - */ - checkBufferedPlay() { - if (this.playing || this.sampleRate === 0) return; - const played = this.lastBufferSamples / this.sampleRate; - const dt = this.buffered - played; - if (this.loaded) { - this.playAudio(played); - return; - } - if (dt < this.bufferPlayDuration) return; - - this.lastBufferSamples = this.bufferedSamples; - // 需要播放 - this.mergeBuffers(); - if (!this.buffer) return; - if (this.playing) this.output.stop(); - this.createSourceNode(this.buffer); - this.output.loop = false; - this.output.start(0, played); - this.lastStartTime = this.ac.currentTime; - this.playing = true; - this.output.addEventListener("ended", () => { - this.playing = false; - this.checkBufferedPlay(); - }); - } - - mergeBuffers() { - const buffer = this.ac.createBuffer( - this.audioData.length, - this.bufferedSamples, - this.sampleRate - ); - const chunk = this.sampleRate * this.bufferChunkSize; - const bufferedChunks = Math.floor(this.bufferedSamples / chunk); - const restLength = this.bufferedSamples % chunk; - for (let i = 0; i < this.audioData.length; i++) { - const audio = this.audioData[i]; - const data = new Float32Array(this.bufferedSamples); - for (let j = 0; j < bufferedChunks; j++) { - data.set(audio[j], chunk * j); - } - if (restLength !== 0) { - data.set( - audio[bufferedChunks].slice(0, restLength), - chunk * bufferedChunks - ); - } - - buffer.copyToChannel(data, i, 0); - } - this.buffer = buffer; - } - - async start() { - delete this.buffer; - this.headerRecieved = false; - this.audioType = ""; - this.errored = false; - this.buffered = 0; - this.sampleRate = 0; - this.bufferedSamples = 0; - this.duration = 0; - this.loaded = false; - if (this.playing) this.output.stop(); - this.playing = false; - this.lastStartTime = this.ac.currentTime; - } - - end(done, reason) { - if (done && this.buffer) { - this.loaded = true; - delete this.controller; - this.mergeBuffers(); - - this.duration = this.buffered; - this.audioData = []; - this.decoder?.destroy(); - delete this.decoder; - delete this.parser; - } else { - console.warn( - "Unexpected end when loading stream audio, reason: '" + - (reason ?? "") + - "'" - ); - } - } - - playAudio(when) { - if (!this.buffer) return; - this.lastStartTime = this.ac.currentTime; - if (this.playing) this.output.stop(); - if (this.route.status !== AudioStatus.Playing) { - this.route.status = AudioStatus.Playing; - } - this.createSourceNode(this.buffer); - this.output.start(0, when); - this.playing = true; - - this.output.addEventListener("ended", () => { - this.playing = false; - if (this.route.status === AudioStatus.Playing) { - this.route.status = AudioStatus.Stoped; - } - if (this.loop && !this.output.loop) this.play(0); - }); - } - /** - * 开始播放这个音频源 - */ - play(when) { - if (this.playing || this.errored) return; - if (this.loaded && this.buffer) { - this.playing = true; - this.playAudio(when); - } else { - this.controller?.start(); - } - } - - createSourceNode(buffer) { - if (!this.target) return; - const node = this.ac.createBufferSource(); - node.buffer = buffer; - if (this.playing) this.output.stop(); - this.playing = false; - this.output = node; - node.connect(this.target.input); - node.loop = this.loop; - } - /** - * 停止播放这个音频源 - * @returns 音频暂停的时刻 number - */ - stop() { - if (this.playing) this.output.stop(); - this.playing = false; - return this.ac.currentTime - this.lastStartTime; - } - /** - * 连接到音频路由图上,每次调用播放的时候都会执行一次 - * @param target 连接至的目标 IAudioInput - */ - connect(target) { - this.target = target; - } - /** - * 设置是否循环播放 - * @param loop 是否循环 boolean) - */ - setLoop(loop) { - this.loop = loop; - } - } - class AudioElementSource { - - constructor(context) { - const audio = new Audio(); - audio.preload = "none"; - this.output = context.createMediaElementSource(audio); - this.audio = audio; - this.ac = context; - audio.addEventListener("play", () => { - this.playing = true; - if (this.route.status !== AudioStatus.Playing) { - this.route.status = AudioStatus.Playing; - } - }); - audio.addEventListener("ended", () => { - this.playing = false; - if (this.route.status === AudioStatus.Playing) { - this.route.status = AudioStatus.Stoped; - } - }); - } - get duration() { - return this.audio.duration; - } - get currentTime() { - return this.audio.currentTime; - } - /** - * 设置音频源的路径 - * @param url 音频路径 - */ - setSource(url) { - this.audio.src = url; - } - - play(when = 0) { - if (this.playing) return; - this.audio.currentTime = when; - this.audio.play(); - } - - stop() { - this.audio.pause(); - this.playing = false; - if (this.route.status === AudioStatus.Playing) { - this.route.status = AudioStatus.Stoped; - } - return this.audio.currentTime; - } - - connect(target) { - this.output.connect(target.input); - } - - setLoop(loop) { - this.audio.loop = loop; - } - } - class AudioBufferSource { - - constructor(context) { - this.output = context.createBufferSource(); - /** 是否循环 */ - this.loop = false; - /** 上一次播放是从何时开始的 */ - this.lastStartWhen = 0; - /** 播放开始时刻 */ - this.lastStartTime = 0; - this.duration = 0; - this.ac = context; - } - get currentTime() { - return this.ac.currentTime - this.lastStartTime + this.lastStartWhen; - } - - /** - * 设置音频源数据 - * @param buffer 音频源,可以是未解析的 ArrayBuffer,也可以是已解析的 AudioBuffer - */ - async setBuffer(buffer) { - if (buffer instanceof ArrayBuffer) { - this.buffer = await this.ac.decodeAudioData(buffer); - } else { - this.buffer = buffer; - } - this.duration = this.buffer.duration; - } - - play(when) { - if (this.playing || !this.buffer) return; - this.playing = true; - this.lastStartTime = this.ac.currentTime; - if (this.route.status !== AudioStatus.Playing) { - this.route.status = AudioStatus.Playing; - } - this.createSourceNode(this.buffer); - this.output.start(0, when); - this.output.addEventListener("ended", () => { - this.playing = false; - if (this.route.status === AudioStatus.Playing) { - this.route.status = AudioStatus.Stoped; - } - if (this.loop && !this.output.loop) this.play(0); - }); - } - - createSourceNode(buffer) { - if (!this.target) return; - const node = this.ac.createBufferSource(); - node.buffer = buffer; - this.output = node; - node.connect(this.target.input); - node.loop = this.loop; - } - - stop() { - this.output.stop(); - return this.ac.currentTime - this.lastStartTime; - } - - connect(target) { - this.target = target; - } - - setLoop(loop) { - this.loop = loop; - } - } - class AudioPlayer { - constructor() { - /** 音频播放上下文 */ - this.ac = new AudioContext(); - /** 音量节点 */ - this.gain = this.ac.createGain(); - this.gain.connect(this.ac.destination); - this.audioRoutes = new Map(); - } - /** - * 解码音频数据 - * @param data 音频数据 - */ - decodeAudioData(data) { - return AudioDecoder.decodeAudioData(data, this); - } - /** - * 设置音量 - * @param volume 音量 - */ - setVolume(volume) { - this.gain.gain.value = volume; - } - - /** - * 获取音量 - */ - getVolume() { - return this.gain.gain.value; - } - - /** - * 创建一个音频源 - * @param Source 音频源类 - */ - createSource(Source) { - return new Source(this.ac); - } - - /** - * 创建一个兼容流式音频源,可以与流式加载相结合,主要用于处理 opus ogg 不兼容的情况 - */ - createStreamSource() { - return new AudioStreamSource(this.ac); - } - - /** - * 创建一个通过 audio 元素播放的音频源 - */ - createElementSource() { - return new AudioElementSource(this.ac); - } - - /** - * 创建一个通过 AudioBuffer 播放的音频源 - */ - createBufferSource() { - return new AudioBufferSource(this.ac); - } - - /** - * 获取音频目的地 - */ - getDestination() { - return this.gain; - } - - /** - * 创建一个音频效果器 - * @param Effect 效果器类 - */ - createEffect(Effect) { - return new Effect(this.ac); - } - - /** - * 创建一个修改音量的效果器 - * ```txt - * |----------| - * Input ----> | GainNode | ----> Output - * |----------| - * ``` - */ - createVolumeEffect() { - return new VolumeEffect(this.ac); - } - - /** - * 创建一个立体声效果器 - * ```txt - * |------------| - * Input ----> | PannerNode | ----> Output - * |------------| - * ``` - */ - createStereoEffect() { - return new StereoEffect(this.ac); - } - - /** - * 创建一个修改单个声道音量的效果器 - * ```txt - * |----------| - * -> | GainNode | \ - * |--------------| / |----------| -> |------------| - * Input ----> | SplitterNode | ...... | MergerNode | ----> Output - * |--------------| \ |----------| -> |------------| - * -> | GainNode | / - * |----------| - * ``` - */ - createChannelVolumeEffect() { - return new ChannelVolumeEffect(this.ac); - } - - /** - * 创建一个延迟效果器 - * |-----------| - * Input ----> | DelayNode | ----> Output - * |-----------| - */ - createDelay() { - return new DelayEffect(this.ac); - } - - /** - * 创建一个回声效果器 - * ```txt - * |----------| - * Input ----> | GainNode | ----> Output - * ^ |----------| | - * | | - * | |------------| ↓ - * |-- | Delay Node | <-- - * |------------| - * ``` - */ - createEchoEffect() { - return new EchoEffect(this.ac); - } - - /** - * 创建一个音频播放路由 - * @param source 音频源 - */ - createRoute(source) { - return new AudioRoute(source, this); - } - - /** - * 添加一个音频播放路由,可以直接被播放 - * @param id 这个音频播放路由的名称 - * @param route 音频播放路由对象 - */ - addRoute(id, route) { - if (!this.audioRoutes) this.audioRoutes = new Map(); - if (this.audioRoutes.has(id)) { - console.warn( - "Audio route with id of '" + - id + - "' has already existed. New route will override old route." - ); - } - this.audioRoutes.set(id, route); - } - - /** - * 根据名称获取音频播放路由对象 - * @param id 音频播放路由的名称 - */ - getRoute(id) { - return this.audioRoutes.get(id); - } - /** - * 移除一个音频播放路由 - * @param id 要移除的播放路由的名称 - */ - removeRoute(id) { - this.audioRoutes.delete(id); - } - /** - * 播放音频 - * @param id 音频名称 - * @param when 从音频的哪个位置开始播放,单位秒 - */ - play(id, when) { - const route = this.getRoute(id); - if (!route) { - console.warn( - "Cannot play audio route '" + - id + - "', since there is not added route named it." - ); - return; - } - - route.play(when); - } - - /** - * 暂停音频播放 - * @param id 音频名称 - * @returns 当音乐真正停止时兑现 - */ - pause(id) { - const route = this.getRoute(id); - if (!route) { - console.warn( - "Cannot pause audio route '" + - id + - "', since there is not added route named it." - ); - return; - } - return route.pause(); - } - - /** - * 停止音频播放 - * @param id 音频名称 - * @returns 当音乐真正停止时兑现 - */ - stop(id) { - const route = this.getRoute(id); - if (!route) { - console.warn( - "Cannot stop audio route '" + - id + - "', since there is not added route named it." - ); - return; - } - return route.stop(); - } - - /** - * 继续音频播放 - * @param id 音频名称 - */ - resume(id) { - const route = this.getRoute(id); - if (!route) { - console.warn( - "Cannot pause audio route '" + - id + - "', since there is not added route named it." - ); - return; - } - route.resume(); - } - - /** - * 设置听者位置,x正方向水平向右,y正方向垂直于地面向上,z正方向垂直屏幕远离用户 - * @param x 位置x坐标 - * @param y 位置y坐标 - * @param z 位置z坐标 - */ - setListenerPosition(x, y, z) { - const listener = this.ac.listener; - listener.positionX.value = x; - listener.positionY.value = y; - listener.positionZ.value = z; - } - - /** - * 设置听者朝向,x正方向水平向右,y正方向垂直于地面向上,z正方向垂直屏幕远离用户 - * @param x 朝向x坐标 - * @param y 朝向y坐标 - * @param z 朝向z坐标 - */ - setListenerOrientation(x, y, z) { - const listener = this.ac.listener; - listener.forwardX.value = x; - listener.forwardY.value = y; - listener.forwardZ.value = z; - } - - /** - * 设置听者头顶朝向,x正方向水平向右,y正方向垂直于地面向上,z正方向垂直屏幕远离用户 - * @param x 头顶朝向x坐标 - * @param y 头顶朝向y坐标 - * @param z 头顶朝向z坐标 - */ - setListenerUp(x, y, z) { - const listener = this.ac.listener; - listener.upX.value = x; - listener.upY.value = y; - listener.upZ.value = z; - } - } - class AudioRoute { - constructor(source, player) { - source.route = this; - this.output = source.output; - - /** 效果器路由图 */ - this.effectRoute = []; - - /** 结束时长,当音频暂停或停止时,会经过这么长时间之后才真正终止播放,期间可以做音频淡入淡出等效果 */ - this.endTime = 0; - /** 暂停时播放了多长时间 */ - this.pauseCurrentTime = 0; - /** 当前播放状态 */ - this.player = player; - this.status = AudioStatus.Stoped; - - this.shouldStop = false; - /** - * 每次暂停或停止时自增,用于判断当前正在处理的情况。 - * 假如暂停后很快播放,然后很快暂停,那么需要根据这个来判断实际是否应该执行暂停后操作 - */ - this.stopIdentifier = 0; - /** 暂停时刻 */ - this.pauseTime = 0; - this.source = source; - this.source.player = player; - } - /** 音频时长,单位秒 */ - get duration() { - return this.source.duration; - } - /** 当前播放了多长时间,单位秒 */ - get currentTime() { - if (this.status === AudioStatus.Paused) { - return this.pauseCurrentTime; - } else { - return this.source.currentTime; - } - } - set currentTime(time) { - this.source.stop(); - this.source.play(time); - } - /** - * 设置结束时间,暂停或停止时,会经过这么长时间才终止音频的播放,这期间可以做一下音频淡出的效果。 - * @param time 暂停或停止时,经过多长时间之后才会结束音频的播放 - */ - setEndTime(time) { - this.endTime = time; - } - - /** - * 当音频播放时执行的函数,可以用于音频淡入效果 - * @param fn 音频开始播放时执行的函数 - */ - onStart(fn) { - this.audioStartHook = fn; - } - - /** - * 当音频暂停或停止时执行的函数,可以用于音频淡出效果 - * @param fn 音频在暂停或停止时执行的函数,不填时表示取消这个钩子。 - * 包含两个参数,第一个参数是结束时长,第二个参数是当前音频播放路由对象 - */ - onEnd(fn) { - this.audioEndHook = fn; - } - - /** - * 开始播放这个音频 - * @param when 从音频的什么时候开始播放,单位秒 - */ - async play(when = 0) { - if (this.status === AudioStatus.Playing) return; - this.link(); - await this.player.ac.resume(); - if (this.effectRoute.length > 0) { - const first = this.effectRoute[0]; - this.source.connect(first); - const last = this.effectRoute.at(-1); - last.connect({ input: this.player.getDestination() }); - } else { - this.source.connect({ input: this.player.getDestination() }); - } - this.source.play(when); - this.status = AudioStatus.Playing; - this.pauseTime = 0; - this.audioStartHook?.(this); - this.startAllEffect(); - if (this.status !== AudioStatus.Playing) { - this.status = AudioStatus.Playing; - } - } - - /** - * 暂停音频播放 - */ - async pause() { - if (this.status !== AudioStatus.Playing) return; - this.status = AudioStatus.Pausing; - this.stopIdentifier++; - const identifier = this.stopIdentifier; - if (this.audioEndHook) { - this.audioEndHook(this.endTime, this); - await sleep(this.endTime); - } - if ( - this.status !== AudioStatus.Pausing || - this.stopIdentifier !== identifier - ) { - return; - } - this.pauseCurrentTime = this.source.currentTime; - const time = this.source.stop(); - this.pauseTime = time; - if (this.shouldStop) { - this.status = AudioStatus.Stoped; - this.endAllEffect(); - - this.shouldStop = false; - } else { - this.status = AudioStatus.Paused; - this.endAllEffect(); - } - this.endAllEffect(); - } - - /** - * 继续音频播放 - */ - resume() { - if (this.status === AudioStatus.Playing) return; - if ( - this.status === AudioStatus.Pausing || - this.status === AudioStatus.Stoping - ) { - this.audioStartHook?.(this); - - return; - } - if (this.status === AudioStatus.Paused) { - this.play(this.pauseTime); - } else { - this.play(0); - } - this.status = AudioStatus.Playing; - this.pauseTime = 0; - this.audioStartHook?.(this); - this.startAllEffect(); - } - - /** - * 停止音频播放 - */ - async stop() { - if (this.status !== AudioStatus.Playing) { - if (this.status === AudioStatus.Pausing) { - this.shouldStop = true; - } - return; - } - this.status = AudioStatus.Stoping; - this.stopIdentifier++; - const identifier = this.stopIdentifier; - if (this.audioEndHook) { - this.audioEndHook(this.endTime, this); - await sleep(this.endTime); - } - if ( - this.status !== AudioStatus.Stoping || - this.stopIdentifier !== identifier - ) { - return; - } - this.source.stop(); - this.status = AudioStatus.Stoped; - this.pauseTime = 0; - this.endAllEffect(); - } - - /** - * 添加效果器 - * @param effect 要添加的效果,可以是数组,表示一次添加多个 - * @param index 从哪个位置开始添加,如果大于数组长度,那么加到末尾,如果小于0,那么将会从后面往前数。默认添加到末尾 - */ - addEffect(effect, index) { - if (isNil(index)) { - if (effect instanceof Array) { - this.effectRoute.push(...effect); - } else { - this.effectRoute.push(effect); - } - } else { - if (effect instanceof Array) { - this.effectRoute.splice(index, 0, ...effect); - } else { - this.effectRoute.splice(index, 0, effect); - } - } - this.setOutput(); - if (this.source.playing) this.link(); - } - - /** - * 移除一个效果器 - * @param effect 要移除的效果 - */ - removeEffect(effect) { - const index = this.effectRoute.indexOf(effect); - if (index === -1) return; - this.effectRoute.splice(index, 1); - effect.disconnect(); - this.setOutput(); - if (this.source.playing) this.link(); - } - - setOutput() { - const effect = this.effectRoute.at(-1); - if (!effect) this.output = this.source.output; - else this.output = effect.output; - } - - /** - * 连接音频路由图 - */ - link() { - this.effectRoute.forEach((v) => v.disconnect()); - this.effectRoute.forEach((v, i) => { - const next = this.effectRoute[i + 1]; - if (next) { - v.connect(next); - } - }); - } - - startAllEffect() { - this.effectRoute.forEach((v) => v.start()); - } - - endAllEffect() { - this.effectRoute.forEach((v) => v.end()); - } - } - - const audioPlayer = new AudioPlayer(); - - class BgmController { - constructor(player) { - this.mainGain = player.createVolumeEffect(); - this.player = player; - /** bgm音频名称的前缀 */ - this.prefix = "bgms."; - /** 每个 bgm 的音量控制器 */ - this.gain = new Map(); - - /** 正在播放的 bgm */ - this.playingBgm = ""; - /** 是否正在播放 */ - this.playing = false; - - /** 是否已经启用 */ - this.enabled = true; - /** 是否屏蔽所有的音乐切换 */ - this.blocking = false; - /** 渐变时长 */ - this.transitionTime = 2000; - } - - /** - * 设置音频渐变时长 - * @param time 渐变时长 - */ - setTransitionTime(time) { - this.transitionTime = time; - for (const [, value] of this.gain) { - value.transition.time(time); - } - } - - /** - * 屏蔽音乐切换 - */ - blockChange() { - this.blocking = true; - } - - /** - * 取消屏蔽音乐切换 - */ - unblockChange() { - this.blocking = false; - } - - /** - * 设置总音量大小 - * @param volume 音量大小 - */ - setVolume(volume) { - this.mainGain.setVolume(volume); - this._volume = volume; - } - /** - * 获取总音量大小 - */ - getVolume() { - return this.mainGain.getVolume(); - } - /** - * 设置是否启用 - * @param enabled 是否启用 - */ - setEnabled(enabled) { - if (enabled) this.resume(); - else this.stop(); - this.enabled = enabled; - } - - /** - * 设置 bgm 音频名称的前缀 - */ - setPrefix(prefix) { - this.prefix = prefix; - } - - getId(name) { - return `${this.prefix}${name}`; - } - - /** - * 根据 bgm 名称获取其 AudioRoute 实例 - * @param id 音频名称 - */ - get(id) { - return this.player.getRoute(this.getId(id)); - } - - /** - * 添加一个 bgm - * @param id 要添加的 bgm 的名称 - * @param url 指定 bgm 的加载地址 - */ - addBgm(id, url = `project/bgms/${id}`) { - const type = guessTypeByExt(id); - if (!type) { - console.warn( - "Unknown audio extension name: '" + - id.split(".").slice(0, -1).join(".") + - "'" - ); - return; - } - const gain = this.player.createVolumeEffect(); - if (isAudioSupport(type)) { - const source = audioPlayer.createElementSource(); - source.setSource(url); - source.setLoop(true); - const route = new AudioRoute(source, audioPlayer); - route.addEffect([gain, this.mainGain]); - audioPlayer.addRoute(this.getId(id), route); - this.setTransition(id, route, gain); - } else { - const source = audioPlayer.createStreamSource(); - const stream = new StreamLoader(url); - stream.pipe(source); - source.setLoop(true); - const route = new AudioRoute(source, audioPlayer); - route.addEffect([gain, this.mainGain]); - audioPlayer.addRoute(this.getId(id), route); - this.setTransition(id, route, gain); - } - } - - /** - * 移除一个 bgm - * @param id 要移除的 bgm 的名称 - */ - removeBgm(id) { - this.player.removeRoute(this.getId(id)); - const gain = this.gain.get(id); - gain?.transition.ticker.destroy(); - this.gain.delete(id); - } - - setTransition(id, route, gain) { - const transition = new Transition(); - transition - .time(this.transitionTime) - .mode(linear()) - .transition("volume", 0); - - const tick = () => { - gain.setVolume(transition.value.volume); - }; - - /** - * @param expect 在结束时应该是正在播放还是停止 - */ - const setTick = async (expect) => { - transition.ticker.remove(tick); - transition.ticker.add(tick); - const identifier = route.stopIdentifier; - await sleep(this.transitionTime + 500); - if (route.status === expect && identifier === route.stopIdentifier) { - transition.ticker.remove(tick); - if (route.status === AudioStatus.Playing) { - gain.setVolume(1); - } else { - gain.setVolume(0); - } - } - }; - - route.onStart(async () => { - transition.transition("volume", 1); - setTick(AudioStatus.Playing); - }); - route.onEnd(() => { - transition.transition("volume", 0); - setTick(AudioStatus.Paused); - }); - route.setEndTime(this.transitionTime); - - this.gain.set(id, { effect: gain, transition }); - } - - /** - * 播放一个 bgm - * @param id 要播放的 bgm 名称 - */ - play(id, when) { - if (this.blocking) return; - if (id !== this.playingBgm && this.playingBgm) { - this.player.pause(this.getId(this.playingBgm)); - } - this.playingBgm = id; - if (!this.enabled) return; - this.player.play(this.getId(id), when); - this.playing = true; - } - - /** - * 继续当前的 bgm - */ - resume() { - if (this.blocking || !this.enabled || this.playing) return; - if (this.playingBgm) { - this.player.resume(this.getId(this.playingBgm)); - } - this.playing = true; - } - - /** - * 暂停当前的 bgm - */ - pause() { - if (this.blocking || !this.enabled) return; - if (this.playingBgm) { - this.player.pause(this.getId(this.playingBgm)); - } - this.playing = false; - } - - /** - * 停止当前的 bgm - */ - stop() { - if (this.blocking || !this.enabled) return; - if (this.playingBgm) { - this.player.stop(this.getId(this.playingBgm)); - } - this.playing = false; - } - } - const bgmController = new BgmController(audioPlayer); - - class SoundPlayer { - constructor(player) { - /** 每个音效的唯一标识符 */ - this.num = 0; - this.enabled = true; - this.gain = player.createVolumeEffect(); - /** 每个音效的数据 */ - this.buffer = new Map(); - /** 所有正在播放的音乐 */ - this.playing = new Set(); - this.player = player; - } - /** - * 设置是否启用音效 - * @param enabled 是否启用音效 - */ - setEnabled(enabled) { - if (!enabled) this.stopAllSounds(); - this.enabled = enabled; - } - - /** - * 设置音量大小 - * @param volume 音量大小 - */ - setVolume(volume) { - this.gain.setVolume(volume); - } - /** - * 获取音量大小 - */ - getVolume() { - return this.gain.getVolume(); - } - /** - * 添加一个音效 - * @param id 音效名称 - * @param data 音效的Uint8Array数据 - */ - async add(id, data) { - const buffer = await this.player.decodeAudioData(data); - if (!buffer) { - console.warn( - "Cannot decode sound '" + - id + - "', since audio file may not supported by 2.b." - ); - return; - } - this.buffer.set(id, buffer); - } - - /** - * 播放一个音效 - * @param id 音效名称 - * @param position 音频位置,[0, 0, 0]表示正中心,x轴指向水平向右,y轴指向水平向上,z轴指向竖直向上 - * @param orientation 音频朝向,[0, 1, 0]表示朝向前方 - */ - play(id, position = [0, 0, 0], orientation = [1, 0, 0]) { - if (!this.enabled || !id) return -1; - const buffer = this.buffer.get(id); - if (!buffer) { - console.warn( - "Cannot play sound '" + - id + - "', since there is no added data named it." - ); - return -1; - } - const soundNum = this.num++; - - const source = this.player.createBufferSource(); - source.setBuffer(buffer); - const route = this.player.createRoute(source); - const stereo = this.player.createStereoEffect(); - stereo.setPosition(position[0], position[1], position[2]); - stereo.setOrientation(orientation[0], orientation[1], orientation[2]); - route.addEffect([stereo, this.gain]); - this.player.addRoute(`sounds.${soundNum}`, route); - route.play(); - source.output.addEventListener("ended", () => { - this.playing.delete(soundNum); - }); - this.playing.add(soundNum); - return soundNum; - } - - /** - * 停止一个音效 - * @param num 音效的唯一 id - */ - stop(num) { - const id = `sounds.${num}`; - const route = this.player.getRoute(id); - if (route) { - route.stop(); - this.player.removeRoute(id); - this.playing.delete(num); - } - } - - /** - * 停止播放所有音效 - */ - stopAllSounds() { - this.playing.forEach((v) => { - const id = `sounds.${v}`; - const route = this.player.getRoute(id); - if (route) { - route.stop(); - this.player.removeRoute(id); - } - }); - this.playing.clear(); - } - } - const soundPlayer = new SoundPlayer(audioPlayer); - - function loadAllBgm() { - const data = data_a1e2fb4a_e986_4524_b0da_9b7ba7c0874d; - for (const bgm of data.main.bgms) { - bgmController.addBgm(bgm); - } - } - loadAllBgm(); - AudioDecoder.registerDecoder(AudioType.Ogg, VorbisDecoder); - AudioDecoder.registerDecoder(AudioType.Opus, OpusDecoder); - - core.plugin.audioSystem = { - AudioType, - AudioDecoder, - AudioStatus, - checkAudioType, - isAudioSupport, - audioPlayer, - soundPlayer, - bgmController, - guessTypeByExt, - BgmController, - SoundPlayer, - EchoEffect, - DelayEffect, - ChannelVolumeEffect, - VolumeEffect, - StereoEffect, - AudioEffect, - AudioPlayer, - AudioRoute, - AudioStreamSource, - AudioElementSource, - AudioBufferSource, - loadAllBgm, - StreamLoader, - }; - //bgm相关复写 - control.prototype.playBgm = (bgm, when) => { - bgm = core.getMappedName(bgm); - bgmController.play(bgm, when); - core.setMusicBtn(); - }; - control.prototype.pauseBgm = () => { - bgmController.pause(); - core.setMusicBtn(); - }; - - control.prototype.resumeBgm = function () { - bgmController.resume(); - core.setMusicBtn(); - }; - control.prototype.checkBgm = function () { - core.playBgm(bgmController.playingBgm || main.startBgm); - }; - control.prototype.triggerBgm = function () { - core.musicStatus.bgmStatus = !core.musicStatus.bgmStatus; - if (bgmController.playing) bgmController.pause(); - else bgmController.resume(); - core.setMusicBtn(); - core.setLocalStorage("bgmStatus", core.musicStatus.bgmStatus); - }; - //sound相关复写 - control.prototype.playSound = function ( - sound, - _pitch, - callback, - position, - orientation - ) { - if (main.mode != "play" || !core.musicStatus.soundStatus) return; - const name = core.getMappedName(sound); - const num = soundPlayer.play(name, position, orientation); - const route = audioPlayer.getRoute(`sounds.${num}`); - if (!route) { - callback?.(); - return -1; - } else { - sleep(route.duration * 1000).then(() => callback?.()); - return num; - } - }; - control.prototype.stopSound = function (id) { - if (isNil(id)) { - soundPlayer.stopAllSounds(); - } else { - soundPlayer.stop(id); - } - }; - control.prototype.getPlayingSounds = function () { - return [...soundPlayer.playing]; - }; - //sound加载复写 - loader.prototype._loadOneSound_decodeData = function (name, data) { - if (data instanceof Blob) { - var blobReader = new zip.BlobReader(data); - blobReader.init(function () { - blobReader.readUint8Array(0, blobReader.size, function (uint8) { - //core.loader._loadOneSound_decodeData(name, uint8.buffer); - soundPlayer.add(name, uint8); - }); - }); - return; - } - if (data instanceof ArrayBuffer) { - const uint8 = new Uint8Array(data); - soundPlayer.add(name, uint8); - } - }; - //音量控制复写 - soundPlayer.setVolume( - core.musicStatus.userVolume * core.musicStatus.designVolume - ); - bgmController.setVolume( - core.musicStatus.userVolume * core.musicStatus.designVolume - ); - actions.prototype._clickSwitchs_sounds_userVolume = function (delta) { - var value = Math.round(Math.sqrt(100 * core.musicStatus.userVolume)); - if (value == 0 && delta < 0) return; - core.musicStatus.userVolume = core.clamp( - Math.pow(value + delta, 2) / 100, - 0, - 1 - ); - //audioContext 音效 不受designVolume 影响 - if (core.musicStatus.gainNode != null) - core.musicStatus.gainNode.gain.value = core.musicStatus.userVolume; - soundPlayer.setVolume( - core.musicStatus.userVolume * core.musicStatus.designVolume - ); - bgmController.setVolume( - core.musicStatus.userVolume * core.musicStatus.designVolume - ); - core.setLocalStorage("userVolume", core.musicStatus.userVolume); - core.playSound("确定"); - core.ui._drawSwitchs_sounds(); - }; -}, - "怪物碎裂特效": function () { - // 在此增加新插件 - // -------------------- 安装说明 -------------------- // - // 先安装两个在插件简介中说明的前置插件 - // 然后再将本插件复制到插件编写中即可 - // 插件自带一个打怪后显示碎裂特效的功能 - // -------------------- 使用说明 -------------------- // - /* - - 本插件的核心是一个名为 applyFragWith 的函数,打怪后的碎裂特效也是由它执行的。 - 我们来说明一下这个函数的使用方式。 - 1. 引入 - 你可以使用 const { applyFragWith } = core.plugin.frag; 在任何地方来引入这个函数。 - - 2. 函数的参数 - 该函数有三个参数,分别是canvas, length, time。 - 其中,第一个参数意思是,在执行碎裂时,其内容由该画布决定,这个特效并不会修改传入的画布,因此原画布的内容会依然存在 - 第二个参数指的是每个碎片的边长,虽然原则上每个碎片都是正方形,但边缘一周的碎片可能不是正方形,但中间的碎片一定是 - 第三个参数指的是这个特效要执行多长时间 - 第四个参数是一个对象,包含四种配置量,均为可选,分别是maxMoveLength,moveFlush,maxRotate,fragTiming - 当这些不存在时会默认取同名的常量作为默认值。这些值有什么用可以看下面的常量注释。 - - 3. 函数的返回值 - 这个函数会返回一个特效控制器对象,这个控制器共有三个属性。 - animation: 指的是当前特效的高级动画对象 - onEnd: 一个Promise,当这个特效执行完毕后会被 fulfilled - canvas: 特效所显示的画布。这个画布不会自动部署到样板中,需要你手动使用appendChild来部署,具体可参考打怪后碎裂的样例 - - 4. 修改一些常量 - 在下面有四个有注释的常量MAX_MOVE_LENGTH ~ FRAG_TIMING,你可以根据你自己的需要来更改。 - - */ - - if (main.replayChecking) return (core.plugin.frag = {}); - - const { Animation, linear, sleep } = core.plugin.animate; - const { has } = core.plugin.utils; - - /** 最大移动距离,最终位置距离中心的距离变成原来的几倍 */ - const MAX_MOVE_LENGTH = 1.15; - /** 移动距离波动,在最大移动距离的基础上加上多少倍距离的波动距离 */ - const MOVE_FLUSH = 0.7; - /** 最大旋转角,单位是弧度,每个碎片都会有自己的旋转程度,是随机的 */ - const MAX_ROTATE = 0.5; - /** 碎裂动画的速率曲线函数 */ - const FRAG_TIMING = linear(); - + // 将__enable置为false将关闭插件 + let __enable = true; + if (!__enable || main.mode === "editor") return; + const { OggOpusDecoderWebWorker } = window["ogg-opus-decoder"]; + const { OggVorbisDecoderWebWorker } = window["ogg-vorbis-decoder"]; + const { CodecParser } = window.CodecParser; + const { Transition, linear } = core.plugin.animate; + + const audio = new Audio(); + const AudioStatus = { + Playing: 0, + Pausing: 1, + Paused: 2, + Stoping: 3, + Stoped: 4, + }; + const supportMap = new Map(); + const AudioType = { + Mp3: "audio/mpeg", + Wav: 'audio/wav; codecs="1"', + Flac: "audio/flac", + Opus: 'audio/ogg; codecs="opus"', + Ogg: 'audio/ogg; codecs="vorbis"', + Aac: "audio/aac", + }; /** - * @param {HTMLCanvasElement} canvas 要执行特效的画布 - * @param {number} length 切分成的碎片的边长,碎片为正方形 - * @param {number} time 特效持续时长 - * @returns 返回一个碎裂特效控制器,是一个对象,详见开头的使用注释 + * 检查一种音频类型是否能被播放 + * @param type 音频类型 AudioType */ - function applyFragWith(canvas, length = 4, time = 2000, config = {}) { - // 先切分图片 - const imgs = splitCanvas(canvas, length); - const cx = canvas.width / 2; - const cy = canvas.height / 2; - - let maxX = 0; - let maxY = 0; - const toMove = imgs.map((v) => { - const centerX = v.x + v.canvas.width / 2; - const centerY = v.y + v.canvas.height / 2; - const onX = centerX === cx; - const onY = centerY === cy; - const mml = config.maxMoveLength ?? MAX_MOVE_LENGTH; - const mf = config.moveFlush ?? MOVE_FLUSH; - const rate = mml - 1 + Math.random() ** 3 * mf; - let endX = onY ? 0 : (centerX - cx) * rate; - let endY = onX ? 0 : (centerY - cy) * rate; - const mx = Math.abs(endX + centerX) + Math.abs(v.canvas.width); - const my = Math.abs(endY + centerY) + Math.abs(v.canvas.height); - if (mx > maxX) maxX = mx; - if (my > maxY) maxY = my; - const r = config.maxRotate ?? MAX_ROTATE; - const endRad = Math.random() * r * 2 - r; - - return { - deltaX: endX, - deltaY: endY, - endRad, - x: centerX, - y: centerY, - canvas: v.canvas, - }; - }); - - // 再执行动画 - const frag = document.createElement("canvas"); - const ctx = frag.getContext("2d"); - const ani = new Animation(); - ani.register("rate", 0); - const ft = config.fragTiming ?? FRAG_TIMING; - ani.absolute().time(time).mode(ft).apply("rate", 1); - frag.width = maxX * 2; - frag.height = maxY * 2; - ctx.save(); - const dw = maxX - canvas.width / 2; - const dh = maxY - canvas.height / 2; - - const fragFn = () => { - const rate = ani.value.rate; - const opacity = 1 - rate; - ctx.globalAlpha = opacity; - ctx.clearRect(0, 0, frag.width, frag.height); - toMove.forEach((v) => { - ctx.save(); - const nx = v.deltaX * rate; - const ny = v.deltaY * rate; - const rotate = v.endRad * rate; - - ctx.translate(nx + v.x + dw, ny + v.y + dh); - ctx.rotate(rotate); - ctx.drawImage( - v.canvas, - nx - v.canvas.width / 2, - ny - v.canvas.height / 2 - ); - ctx.restore(); - }); - }; - const onEnd = () => {}; - ani.ticker.add(fragFn); - - return makeFragManager(frag, ani, time, onEnd); - } - - function makeFragManager(canvas, ani, time, onEnd) { - const promise = sleep(time + 50); - - return { - animation: ani, - - onEnd: promise.then(() => { - ani.ticker.destroy(); - onEnd(); - }), - canvas, - }; - } - - function withImage(image, sx, sy, sw, sh) { - const canvas = document.createElement("canvas"); - const ctx = canvas.getContext("2d"); - canvas.width = sw; - canvas.height = sh; - ctx.drawImage(image, sx, sy, sw, sh, 0, 0, sw, sh); - return { canvas, x: sx, y: sy }; - } - - /** - * 切分画布 - * @param canvas 要被切分的画布 - * @param l 切分小块的边长 - */ - function splitCanvas(canvas, l) { - if (canvas.width / l < 2 || canvas.height / l < 2) { - console.warn("切分画布要求切分边长大于等于画布长宽的一半!"); - return []; + function isAudioSupport(type) { + if (supportMap.has(type)) return supportMap.get(type); + else { + const support = audio.canPlayType(type); + const canPlay = support === "maybe" || support === "probably"; + supportMap.set(type, canPlay); + return canPlay; } - const w = canvas.width; - const h = canvas.height; - const numX = Math.floor(w / l); - const numY = Math.floor(h / l); - const rw = (w - numX * l) / 2; - const rh = (h - numY * l) / 2; + } - const res = []; + const typeMap = new Map([ + ["ogg", AudioType.Ogg], + ["mp3", AudioType.Mp3], + ["wav", AudioType.Wav], + ["flac", AudioType.Flac], + ["opus", AudioType.Opus], + ["aac", AudioType.Aac], + ]); - if (rw > 0) { - if (rh > 0) { - res.push( - withImage(canvas, 0, 0, rw, rh), - withImage(canvas, 0, canvas.height - rh, rw, rh), - withImage(canvas, canvas.width - rw, 0, rw, rh), - withImage(canvas, canvas.width - rw, canvas.height - rh, rw, rh) - ); - } - for (const x of [0, canvas.width - rw]) { - for (let ny = 0; ny < numY; ny++) { - res.push(withImage(canvas, x, rh + l * ny, rw, l)); + /** + * 根据文件名拓展猜测其类型 + * @param file 文件名 string + */ + function guessTypeByExt(file) { + const ext = /\.[a-zA-Z\d]+$/.exec(file); + if (!ext?.[0]) return ""; + const type = ext[0].slice(1); + return typeMap.get(type.toLocaleLowerCase()) ?? ""; + } + + isAudioSupport(AudioType.Ogg); + isAudioSupport(AudioType.Mp3); + isAudioSupport(AudioType.Wav); + isAudioSupport(AudioType.Flac); + isAudioSupport(AudioType.Opus); + isAudioSupport(AudioType.Aac); + + function isNil(value) { + return value === void 0 || value === null; + } + + function sleep(time) { + return new Promise((res) => setTimeout(res, time)); + } + class AudioEffect { + constructor(ac) {} + /** + * 连接至其他效果器 + * @param target 目标输入 IAudioInput + * @param output 当前效果器输出通道 Number + * @param input 目标效果器的输入通道 Number + */ + connect(target, output, input) { + this.output.connect(target.input, output, input); + } + + /** + * 与其他效果器取消连接 + * @param target 目标输入 IAudioInput + * @param output 当前效果器输出通道 Number + * @param input 目标效果器的输入通道 Number + */ + disconnect(target, output, input) { + if (!target) { + if (!isNil(output)) { + this.output.disconnect(output); + } else { + this.output.disconnect(); + } + } else { + if (!isNil(output)) { + if (!isNil(input)) { + this.output.disconnect(target.input, output, input); + } else { + this.output.disconnect(target.input, output); + } + } else { + this.output.disconnect(target.input); } } } - if (rh > 0) { - for (const y of [0, canvas.height - rh]) { - for (let nx = 0; nx < numX; nx++) { - res.push(withImage(canvas, rw + l * nx, y, l, rh)); + } + + class StereoEffect extends AudioEffect { + constructor(ac) { + super(ac); + const panner = ac.createPanner(); + this.input = panner; + this.output = panner; + } + + /** + * 设置音频朝向,x正方形水平向右,y正方形垂直于地面向上,z正方向垂直屏幕远离用户 + * @param x 朝向x坐标 Number + * @param y 朝向y坐标 Number + * @param z 朝向z坐标 Number + */ + setOrientation(x, y, z) { + this.output.orientationX.value = x; + this.output.orientationY.value = y; + this.output.orientationZ.value = z; + } + /** + * 设置音频位置,x正方形水平向右,y正方形垂直于地面向上,z正方向垂直屏幕远离用户 + * @param x 位置x坐标 Number + * @param y 位置y坐标 Number + * @param z 位置z坐标 Number + */ + setPosition(x, y, z) { + this.output.positionX.value = x; + this.output.positionY.value = y; + this.output.positionZ.value = z; + } + end() {} + + start() {} + } + class VolumeEffect extends AudioEffect { + constructor(ac) { + super(ac); + const gain = ac.createGain(); + this.input = gain; + this.output = gain; + } + + /** + * 设置音量大小 + * @param volume 音量大小 Number + */ + setVolume(volume) { + this.output.gain.value = volume; + } + + /** + * 获取音量大小 Number + */ + getVolume() { + return this.output.gain.value; + } + + end() {} + + start() {} + } + class ChannelVolumeEffect extends AudioEffect { + /** 所有的音量控制节点 */ + + constructor(ac) { + super(ac); + /** 所有的音量控制节点 */ + this.gain = []; + const splitter = ac.createChannelSplitter(); + const merger = ac.createChannelMerger(); + this.output = merger; + this.input = splitter; + for (let i = 0; i < 6; i++) { + const gain = ac.createGain(); + splitter.connect(gain, i); + gain.connect(merger, 0, i); + this.gain.push(gain); + } + } + + /** + * 设置某个声道的音量大小 + * @param channel 要设置的声道,可填0-5 Number + * @param volume 这个声道的音量大小 Number + */ + setVolume(channel, volume) { + if (!this.gain[channel]) return; + this.gain[channel].gain.value = volume; + } + + /** + * 获取某个声道的音量大小,可填0-5 + * @param channel 要获取的声道 Number + */ + getVolume(channel) { + if (!this.gain[channel]) return 0; + return this.gain[channel].gain.value; + } + + end() {} + + start() {} + } + class DelayEffect extends AudioEffect { + constructor(ac) { + super(ac); + + const delay = ac.createDelay(); + this.input = delay; + this.output = delay; + } + + /** + * 设置延迟时长 + * @param delay 延迟时长,单位秒 Number + */ + setDelay(delay) { + this.output.delayTime.value = delay; + } + + /** + * 获取延迟时长 + */ + getDelay() { + return this.output.delayTime.value; + } + + end() {} + + start() {} + } + class EchoEffect extends AudioEffect { + constructor(ac) { + super(ac); + /** 当前增益 */ + this.gain = 0.5; + /** 是否正在播放 */ + this.playing = false; + const delay = ac.createDelay(); + const gain = ac.createGain(); + gain.gain.value = 0.5; + delay.delayTime.value = 0.05; + delay.connect(gain); + gain.connect(delay); + /** 延迟节点 */ + this.delay = delay; + /** 反馈增益节点 */ + this.gainNode = gain; + + this.input = gain; + this.output = gain; + } + + /** + * 设置回声反馈增益大小 + * @param gain 增益大小,范围 0-1,大于等于1的视为0.5,小于0的视为0 Number + */ + setFeedbackGain(gain) { + const resolved = gain >= 1 ? 0.5 : gain < 0 ? 0 : gain; + this.gain = resolved; + if (this.playing) this.gainNode.gain.value = resolved; + } + + /** + * 设置回声间隔时长 + * @param delay 回声时长,范围 0.01-Infinity,小于0.01的视为0.01 Number + */ + setEchoDelay(delay) { + const resolved = delay < 0.01 ? 0.01 : delay; + this.delay.delayTime.value = resolved; + } + + /** + * 获取反馈节点增益 + */ + getFeedbackGain() { + return this.gain; + } + + /** + * 获取回声间隔时长 + */ + getEchoDelay() { + return this.delay.delayTime.value; + } + + end() { + this.playing = false; + const echoTime = Math.ceil(Math.log(0.001) / Math.log(this.gain)) + 10; + sleep(this.delay.delayTime.value * echoTime).then(() => { + if (!this.playing) this.gainNode.gain.value = 0; + }); + } + + start() { + this.playing = true; + this.gainNode.gain.value = this.gain; + } + } + + class StreamLoader { + constructor(url) { + /** 传输目标 Set*/ + this.target = new Set(); + this.loading = false; + } + + /** + * 将加载流传递给字节流读取对象 + * @param reader 字节流读取对象 IStreamReader + */ + pipe(reader) { + if (this.loading) { + console.warn( + "Cannot pipe new StreamReader object when stream is loading." + ); + return; + } + this.target.add(reader); + reader.piped(this); + return this; + } + + async start() { + if (this.loading) return; + this.loading = true; + const response = await window.fetch(this.url); + const stream = response.body; + if (!stream) { + console.error("Cannot get reader when fetching '" + this.url + "'."); + return; + } + // 获取读取器 + this.stream = stream; + const reader = response.body?.getReader(); + const targets = [...this.target]; + + await Promise.all(targets.map((v) => v.start(stream, this, response))); + if (reader && reader.read) { + // 开始流传输 + while (true) { + const { value, done } = await reader.read(); + await Promise.all( + targets.map((v) => v.pump(value, done, response)) + ); + if (done) break; + } + } else { + // 如果不支持流传输 + const buffer = await response.arrayBuffer(); + const data = new Uint8Array(buffer); + await Promise.all(targets.map((v) => v.pump(data, true, response))); + } + + this.loading = false; + targets.forEach((v) => v.end(true)); + + // + } + + cancel(reason) { + if (!this.stream) return; + this.stream.cancel(reason); + this.loading = false; + this.target.forEach((v) => v.end(false, reason)); + } + } + const fileSignatures = [ + [AudioType.Mp3, [0x49, 0x44, 0x33]], + [AudioType.Ogg, [0x4f, 0x67, 0x67, 0x53]], + [AudioType.Wav, [0x52, 0x49, 0x46, 0x46]], + [AudioType.Flac, [0x66, 0x4c, 0x61, 0x43]], + [AudioType.Aac, [0xff, 0xf1]], + [AudioType.Aac, [0xff, 0xf9]], + ]; + const oggHeaders = [ + [AudioType.Opus, [0x4f, 0x70, 0x75, 0x73, 0x48, 0x65, 0x61, 0x64]], + ]; + + function checkAudioType(data) { + let audioType = ""; + // 检查头文件获取音频类型,仅检查前256个字节 + const toCheck = data.slice(0, 256); + for (const [type, value] of fileSignatures) { + if (value.every((v, i) => toCheck[i] === v)) { + audioType = type; + break; + } + } + if (audioType === AudioType.Ogg) { + // 如果是ogg的话,进一步判断是不是opus + for (const [key, value] of oggHeaders) { + const has = toCheck.some((_, i) => { + return value.every((v, ii) => toCheck[i + ii] === v); + }); + if (has) { + audioType = key; + break; } } } - for (let nx = 0; nx < numX; nx++) { - for (let ny = 0; ny < numY; ny++) { - res.push(withImage(canvas, rw + l * nx, rh + l * ny, l, l)); + + return audioType; + } + class AudioDecoder { + /** + * 注册一个解码器 + * @param type 要注册的解码器允许解码的类型 + * @param decoder 解码器对象 + */ + static registerDecoder(type, decoder) { + if (!this.decoderMap) this.decoderMap = new Map(); + if (this.decoderMap.has(type)) { + console.warn( + "Audio stream decoder for audio type '" + + type + + "' has already existed." + ); + return; + } + + this.decoderMap.set(type, decoder); + } + + /** + * 解码音频数据 + * @param data 音频文件数据 + * @param player AudioPlayer实例 + */ + static async decodeAudioData(data, player) { + // 检查头文件获取音频类型,仅检查前256个字节 + const toCheck = data.slice(0, 256); + const type = checkAudioType(data); + if (type === "") { + console.error( + "Unknown audio type. Header: '" + + [...toCheck] + .map((v) => v.toString().padStart(2, "0")) + .join(" ") + .toUpperCase() + + "'" + ); + return null; + } + if (isAudioSupport(type)) { + if (data.buffer instanceof ArrayBuffer) { + return player.ac.decodeAudioData(data.buffer); + } else { + return null; + } + } else { + const Decoder = this.decoderMap.get(type); + if (!Decoder) { + return null; + } else { + const decoder = new Decoder(); + await decoder.create(); + const decodedData = await decoder.decode(data); + if (!decodedData) return null; + const buffer = player.ac.createBuffer( + decodedData.channelData.length, + decodedData.channelData[0].length, + decodedData.sampleRate + ); + decodedData.channelData.forEach((v, i) => { + buffer.copyToChannel(v, i); + }); + decoder.destroy(); + return buffer; + } } } - - return res; } - const origin = core.events.afterBattle; - core.events.afterBattle = function (enemyId, x, y) { - // 打怪特效 - if (has(x) && has(y)) { - const frame = core.status.globalAnimateStatus % 2; - // 生成怪物图像 - const canvas = document.createElement("canvas"); - canvas.width = 32; - canvas.height = 32; - core.drawIcon(canvas, enemyId, 0, 0, 32, 32, frame); - // 执行动画 - const manager = applyFragWith(canvas); - const frag = manager.canvas; - // 设置特效画布的css属性 - frag.style.imageRendering = "pixelated"; - frag.style.width = `${frag.width * core.domStyle.scale}px`; - frag.style.height = `${frag.height * core.domStyle.scale}px`; - const left = - (x * 32 + 16 - frag.width / 2 - core.bigmap.offsetX) * - core.domStyle.scale; - const top = - (y * 32 + 16 - frag.height / 2 - core.bigmap.offsetY) * - core.domStyle.scale; - frag.style.left = `${left}px`; - frag.style.top = `${top}px`; - frag.style.zIndex = "45"; - frag.style.position = "absolute"; - // 将特效画布部署到样板上 - core.dom.gameDraw.appendChild(frag); - // 当特效执行完毕后移除这个特效画布 - manager.onEnd.then(() => { - frag.remove(); - }); + class VorbisDecoder { + /** + * 创建音频解码器 + */ + async create() { + this.decoder = new OggVorbisDecoderWebWorker(); + await this.decoder.ready; } - return origin.apply(this, arguments); + /** + * 摧毁这个解码器 + */ + destroy() { + this.decoder?.free(); + } + /** + * 解码流数据 + * @param data 流数据 + */ + + async decode(data) { + return this.decoder?.decode(data); + } + /** + * 解码整个文件 + * @param data 文件数据 + */ + async decodeAll(data) { + return this.decoder?.decodeFile(data); + } + /** + * 当音频解码完成后,会调用此函数,需要返回之前还未解析或未返回的音频数据。调用后,该解码器将不会被再次使用 + */ + async flush() { + return this.decoder?.flush(); + } + } + + class OpusDecoder { + /** + * 创建音频解码器 + */ + async create() { + this.decoder = new OggOpusDecoderWebWorker(); + await this.decoder.ready; + } + /** + * 摧毁这个解码器 + */ + destroy() { + this.decoder?.free(); + } + /** + * 解码流数据 + * @param data 流数据 + */ + async decode(data) { + return this.decoder?.decode(data); + } + /** + * 解码整个文件 + * @param data 文件数据 + */ + async decodeAll(data) { + return this.decoder?.decodeFile(data); + } + /** + * 当音频解码完成后,会调用此函数,需要返回之前还未解析或未返回的音频数据。调用后,该解码器将不会被再次使用 + */ + async flush() { + return await this.decoder?.flush(); + } + } + const mimeTypeMap = { + [AudioType.Aac]: "audio/aac", + [AudioType.Flac]: "audio/flac", + [AudioType.Mp3]: "audio/mpeg", + [AudioType.Ogg]: "application/ogg", + [AudioType.Opus]: "application/ogg", + [AudioType.Wav]: "application/ogg", }; - if ("frag" in core.plugin) { - throw new ReferenceError(`core.plugin上已存在名为frag的属性!`); + function isOggPage(data) { + return !isNil(data.isFirstPage); } - core.plugin.frag = { - applyFragWith, + class AudioStreamSource { + constructor(context) { + this.output = context.createBufferSource(); + /** 是否已经完全加载完毕 */ + this.loaded = false; + /** 是否正在播放 */ + this.playing = false; + /** 已经缓冲了多长时间,如果缓冲完那么跟歌曲时长一致 */ + this.buffered = 0; + /** 已经缓冲的采样点数量 */ + this.bufferedSamples = 0; + /** 歌曲时长,加载完毕之前保持为 0 */ + this.duration = 0; + /** 在流传输阶段,至少缓冲多长时间的音频之后才开始播放,单位秒 */ + this.bufferPlayDuration = 1; + /** 音频的采样率,未成功解析出之前保持为 0 */ + this.sampleRate = 0; + //是否循环播放 + this.loop = false; + /** 上一次播放是从何时开始的 */ + this.lastStartWhen = 0; + /** 开始播放时刻 */ + this.lastStartTime = 0; + /** 上一次播放的缓存长度 */ + this.lastBufferSamples = 0; + + /** 是否已经获取到头文件 */ + this.headerRecieved = false; + /** 音频类型 */ + this.audioType = ""; + /** 每多长时间组成一个缓存 Float32Array */ + this.bufferChunkSize = 10; + /** 缓存音频数据,每 bufferChunkSize 秒钟组成一个 Float32Array,用于流式解码 */ + this.audioData = []; + + this.errored = false; + this.ac = context; + } + /** 当前已经播放了多长时间 */ + get currentTime() { + return this.ac.currentTime - this.lastStartTime + this.lastStartWhen; + } + /** + * 设置每个缓存数据的大小,默认为10秒钟一个缓存数据 + * @param size 每个缓存数据的时长,单位秒 + */ + setChunkSize(size) { + if (this.controller?.loading || this.loaded) return; + this.bufferChunkSize = size; + } + + piped(controller) { + this.controller = controller; + } + + async pump(data, done) { + if (!data || this.errored) return; + if (!this.headerRecieved) { + // 检查头文件获取音频类型,仅检查前256个字节 + const toCheck = data.slice(0, 256); + this.audioType = checkAudioType(data); + if (!this.audioType) { + console.error( + "Unknown audio type. Header: '" + + [...toCheck] + .map((v) => v.toString(16).padStart(2, "0")) + .join(" ") + .toUpperCase() + + "'" + ); + return; + } + // 创建解码器 + const Decoder = AudioDecoder.decoderMap.get(this.audioType); + if (!Decoder) { + this.errored = true; + console.error( + "Cannot decode stream source type of '" + + this.audioType + + "', since there is no registered decoder for that type." + ); + return Promise.reject( + `Cannot decode stream source type of '${this.audioType}', since there is no registered decoder for that type.` + ); + } + this.decoder = new Decoder(); + // 创建数据解析器 + const mime = mimeTypeMap[this.audioType]; + const parser = new CodecParser(mime); + this.parser = parser; + await this.decoder.create(); + this.headerRecieved = true; + } + + const decoder = this.decoder; + const parser = this.parser; + if (!decoder || !parser) { + this.errored = true; + return Promise.reject( + "No parser or decoder attached in this AudioStreamSource" + ); + } + + await this.decodeData(data, decoder, parser); + if (done) await this.decodeFlushData(decoder, parser); + this.checkBufferedPlay(); + } + + /** + * 检查采样率,如果还未解析出采样率,那么将设置采样率,如果当前采样率与之前不同,那么发出警告 + */ + checkSampleRate(info) { + for (const one of info) { + const frame = isOggPage(one) ? one.codecFrames[0] : one; + if (frame) { + const rate = frame.header.sampleRate; + if (this.sampleRate === 0) { + this.sampleRate = rate; + break; + } else { + if (rate !== this.sampleRate) { + console.warn("Sample rate in stream audio must be constant."); + } + } + } + } + } + + /** + * 解析音频数据 + */ + async decodeData(data, decoder, parser) { + // 解析音频数据 + const audioData = await decoder.decode(data); + if (!audioData) return; + // @ts-expect-error 库类型声明错误 + const audioInfo = [...parser.parseChunk(data)]; + + // 检查采样率 + this.checkSampleRate(audioInfo); + // 追加音频数据 + this.appendDecodedData(audioData, audioInfo); + } + + /** + * 解码剩余数据 + */ + async decodeFlushData(decoder, parser) { + const audioData = await decoder.flush(); + if (!audioData) return; + // @ts-expect-error 库类型声明错误 + const audioInfo = [...parser.flush()]; + + this.checkSampleRate(audioInfo); + this.appendDecodedData(audioData, audioInfo); + } + + /** + * 追加音频数据 + */ + appendDecodedData(data, info) { + const channels = data.channelData.length; + if (channels === 0) return; + if (this.audioData.length !== channels) { + this.audioData = []; + for (let i = 0; i < channels; i++) { + this.audioData.push([]); + } + } + // 计算出应该放在哪 + const chunk = this.sampleRate * this.bufferChunkSize; + const sampled = this.bufferedSamples; + const pushIndex = Math.floor(sampled / chunk); + const bufferIndex = sampled % chunk; + const dataLength = data.channelData[0].length; + let buffered = 0; + let nowIndex = pushIndex; + let toBuffer = bufferIndex; + while (buffered < dataLength) { + const rest = toBuffer !== 0 ? chunk - bufferIndex : chunk; + + for (let i = 0; i < channels; i++) { + const audioData = this.audioData[i]; + if (!audioData[nowIndex]) { + audioData.push(new Float32Array(chunk)); + } + const toPush = data.channelData[i].slice(buffered, buffered + rest); + + audioData[nowIndex].set(toPush, toBuffer); + } + buffered += rest; + nowIndex++; + toBuffer = 0; + } + + this.buffered += + info.reduce((prev, curr) => prev + curr.duration, 0) / 1000; + this.bufferedSamples += info.reduce( + (prev, curr) => prev + curr.samples, + 0 + ); + } + + /** + * 检查已缓冲内容,并在未开始播放时播放 + */ + checkBufferedPlay() { + if (this.playing || this.sampleRate === 0) return; + const played = this.lastBufferSamples / this.sampleRate; + const dt = this.buffered - played; + if (this.loaded) { + this.playAudio(played); + return; + } + if (dt < this.bufferPlayDuration) return; + + this.lastBufferSamples = this.bufferedSamples; + // 需要播放 + this.mergeBuffers(); + if (!this.buffer) return; + if (this.playing) this.output.stop(); + this.createSourceNode(this.buffer); + this.output.loop = false; + this.output.start(0, played); + this.lastStartTime = this.ac.currentTime; + this.playing = true; + this.output.addEventListener("ended", () => { + this.playing = false; + this.checkBufferedPlay(); + }); + } + + mergeBuffers() { + const buffer = this.ac.createBuffer( + this.audioData.length, + this.bufferedSamples, + this.sampleRate + ); + const chunk = this.sampleRate * this.bufferChunkSize; + const bufferedChunks = Math.floor(this.bufferedSamples / chunk); + const restLength = this.bufferedSamples % chunk; + for (let i = 0; i < this.audioData.length; i++) { + const audio = this.audioData[i]; + const data = new Float32Array(this.bufferedSamples); + for (let j = 0; j < bufferedChunks; j++) { + data.set(audio[j], chunk * j); + } + if (restLength !== 0) { + data.set( + audio[bufferedChunks].slice(0, restLength), + chunk * bufferedChunks + ); + } + + buffer.copyToChannel(data, i, 0); + } + this.buffer = buffer; + } + + async start() { + delete this.buffer; + this.headerRecieved = false; + this.audioType = ""; + this.errored = false; + this.buffered = 0; + this.sampleRate = 0; + this.bufferedSamples = 0; + this.duration = 0; + this.loaded = false; + if (this.playing) this.output.stop(); + this.playing = false; + this.lastStartTime = this.ac.currentTime; + } + + end(done, reason) { + if (done && this.buffer) { + this.loaded = true; + delete this.controller; + this.mergeBuffers(); + + this.duration = this.buffered; + this.audioData = []; + this.decoder?.destroy(); + delete this.decoder; + delete this.parser; + } else { + console.warn( + "Unexpected end when loading stream audio, reason: '" + + (reason ?? "") + + "'" + ); + } + } + + playAudio(when) { + if (!this.buffer) return; + this.lastStartTime = this.ac.currentTime; + if (this.playing) this.output.stop(); + if (this.route.status !== AudioStatus.Playing) { + this.route.status = AudioStatus.Playing; + } + this.createSourceNode(this.buffer); + this.output.start(0, when); + this.playing = true; + + this.output.addEventListener("ended", () => { + this.playing = false; + if (this.route.status === AudioStatus.Playing) { + this.route.status = AudioStatus.Stoped; + } + if (this.loop && !this.output.loop) this.play(0); + }); + } + /** + * 开始播放这个音频源 + */ + play(when) { + if (this.playing || this.errored) return; + if (this.loaded && this.buffer) { + this.playing = true; + this.playAudio(when); + } else { + this.controller?.start(); + } + } + + createSourceNode(buffer) { + if (!this.target) return; + const node = this.ac.createBufferSource(); + node.buffer = buffer; + if (this.playing) this.output.stop(); + this.playing = false; + this.output = node; + node.connect(this.target.input); + node.loop = this.loop; + } + /** + * 停止播放这个音频源 + * @returns 音频暂停的时刻 number + */ + stop() { + if (this.playing) this.output.stop(); + this.playing = false; + return this.ac.currentTime - this.lastStartTime; + } + /** + * 连接到音频路由图上,每次调用播放的时候都会执行一次 + * @param target 连接至的目标 IAudioInput + */ + connect(target) { + this.target = target; + } + /** + * 设置是否循环播放 + * @param loop 是否循环 boolean) + */ + setLoop(loop) { + this.loop = loop; + } + } + class AudioElementSource { + constructor(context) { + const audio = new Audio(); + audio.preload = "none"; + this.output = context.createMediaElementSource(audio); + this.audio = audio; + this.ac = context; + audio.addEventListener("play", () => { + this.playing = true; + if (this.route.status !== AudioStatus.Playing) { + this.route.status = AudioStatus.Playing; + } + }); + audio.addEventListener("ended", () => { + this.playing = false; + if (this.route.status === AudioStatus.Playing) { + this.route.status = AudioStatus.Stoped; + } + }); + } + get duration() { + return this.audio.duration; + } + get currentTime() { + return this.audio.currentTime; + } + /** + * 设置音频源的路径 + * @param url 音频路径 + */ + setSource(url) { + this.audio.src = url; + } + + play(when = 0) { + if (this.playing) return; + this.audio.currentTime = when; + this.audio.play(); + } + + stop() { + this.audio.pause(); + this.playing = false; + if (this.route.status === AudioStatus.Playing) { + this.route.status = AudioStatus.Stoped; + } + return this.audio.currentTime; + } + + connect(target) { + this.output.connect(target.input); + } + + setLoop(loop) { + this.audio.loop = loop; + } + } + class AudioBufferSource { + constructor(context) { + this.output = context.createBufferSource(); + /** 是否循环 */ + this.loop = false; + /** 上一次播放是从何时开始的 */ + this.lastStartWhen = 0; + /** 播放开始时刻 */ + this.lastStartTime = 0; + this.duration = 0; + this.ac = context; + } + get currentTime() { + return this.ac.currentTime - this.lastStartTime + this.lastStartWhen; + } + + /** + * 设置音频源数据 + * @param buffer 音频源,可以是未解析的 ArrayBuffer,也可以是已解析的 AudioBuffer + */ + async setBuffer(buffer) { + if (buffer instanceof ArrayBuffer) { + this.buffer = await this.ac.decodeAudioData(buffer); + } else { + this.buffer = buffer; + } + this.duration = this.buffer.duration; + } + + play(when) { + if (this.playing || !this.buffer) return; + this.playing = true; + this.lastStartTime = this.ac.currentTime; + if (this.route.status !== AudioStatus.Playing) { + this.route.status = AudioStatus.Playing; + } + this.createSourceNode(this.buffer); + this.output.start(0, when); + this.output.addEventListener("ended", () => { + this.playing = false; + if (this.route.status === AudioStatus.Playing) { + this.route.status = AudioStatus.Stoped; + } + if (this.loop && !this.output.loop) this.play(0); + }); + } + + createSourceNode(buffer) { + if (!this.target) return; + const node = this.ac.createBufferSource(); + node.buffer = buffer; + this.output = node; + node.connect(this.target.input); + node.loop = this.loop; + } + + stop() { + this.output.stop(); + return this.ac.currentTime - this.lastStartTime; + } + + connect(target) { + this.target = target; + } + + setLoop(loop) { + this.loop = loop; + } + } + class AudioPlayer { + constructor() { + /** 音频播放上下文 */ + this.ac = new AudioContext(); + /** 音量节点 */ + this.gain = this.ac.createGain(); + this.gain.connect(this.ac.destination); + this.audioRoutes = new Map(); + } + /** + * 解码音频数据 + * @param data 音频数据 + */ + decodeAudioData(data) { + return AudioDecoder.decodeAudioData(data, this); + } + /** + * 设置音量 + * @param volume 音量 + */ + setVolume(volume) { + this.gain.gain.value = volume; + } + + /** + * 获取音量 + */ + getVolume() { + return this.gain.gain.value; + } + + /** + * 创建一个音频源 + * @param Source 音频源类 + */ + createSource(Source) { + return new Source(this.ac); + } + + /** + * 创建一个兼容流式音频源,可以与流式加载相结合,主要用于处理 opus ogg 不兼容的情况 + */ + createStreamSource() { + return new AudioStreamSource(this.ac); + } + + /** + * 创建一个通过 audio 元素播放的音频源 + */ + createElementSource() { + return new AudioElementSource(this.ac); + } + + /** + * 创建一个通过 AudioBuffer 播放的音频源 + */ + createBufferSource() { + return new AudioBufferSource(this.ac); + } + + /** + * 获取音频目的地 + */ + getDestination() { + return this.gain; + } + + /** + * 创建一个音频效果器 + * @param Effect 效果器类 + */ + createEffect(Effect) { + return new Effect(this.ac); + } + + /** + * 创建一个修改音量的效果器 + * ```txt + * |----------| + * Input ----> | GainNode | ----> Output + * |----------| + * ``` + */ + createVolumeEffect() { + return new VolumeEffect(this.ac); + } + + /** + * 创建一个立体声效果器 + * ```txt + * |------------| + * Input ----> | PannerNode | ----> Output + * |------------| + * ``` + */ + createStereoEffect() { + return new StereoEffect(this.ac); + } + + /** + * 创建一个修改单个声道音量的效果器 + * ```txt + * |----------| + * -> | GainNode | \ + * |--------------| / |----------| -> |------------| + * Input ----> | SplitterNode | ...... | MergerNode | ----> Output + * |--------------| \ |----------| -> |------------| + * -> | GainNode | / + * |----------| + * ``` + */ + createChannelVolumeEffect() { + return new ChannelVolumeEffect(this.ac); + } + + /** + * 创建一个延迟效果器 + * |-----------| + * Input ----> | DelayNode | ----> Output + * |-----------| + */ + createDelay() { + return new DelayEffect(this.ac); + } + + /** + * 创建一个回声效果器 + * ```txt + * |----------| + * Input ----> | GainNode | ----> Output + * ^ |----------| | + * | | + * | |------------| ↓ + * |-- | Delay Node | <-- + * |------------| + * ``` + */ + createEchoEffect() { + return new EchoEffect(this.ac); + } + + /** + * 创建一个音频播放路由 + * @param source 音频源 + */ + createRoute(source) { + return new AudioRoute(source, this); + } + + /** + * 添加一个音频播放路由,可以直接被播放 + * @param id 这个音频播放路由的名称 + * @param route 音频播放路由对象 + */ + addRoute(id, route) { + if (!this.audioRoutes) this.audioRoutes = new Map(); + if (this.audioRoutes.has(id)) { + console.warn( + "Audio route with id of '" + + id + + "' has already existed. New route will override old route." + ); + } + this.audioRoutes.set(id, route); + } + + /** + * 根据名称获取音频播放路由对象 + * @param id 音频播放路由的名称 + */ + getRoute(id) { + return this.audioRoutes.get(id); + } + /** + * 移除一个音频播放路由 + * @param id 要移除的播放路由的名称 + */ + removeRoute(id) { + this.audioRoutes.delete(id); + } + /** + * 播放音频 + * @param id 音频名称 + * @param when 从音频的哪个位置开始播放,单位秒 + */ + play(id, when) { + const route = this.getRoute(id); + if (!route) { + console.warn( + "Cannot play audio route '" + + id + + "', since there is not added route named it." + ); + return; + } + + route.play(when); + } + + /** + * 暂停音频播放 + * @param id 音频名称 + * @returns 当音乐真正停止时兑现 + */ + pause(id) { + const route = this.getRoute(id); + if (!route) { + console.warn( + "Cannot pause audio route '" + + id + + "', since there is not added route named it." + ); + return; + } + return route.pause(); + } + + /** + * 停止音频播放 + * @param id 音频名称 + * @returns 当音乐真正停止时兑现 + */ + stop(id) { + const route = this.getRoute(id); + if (!route) { + console.warn( + "Cannot stop audio route '" + + id + + "', since there is not added route named it." + ); + return; + } + return route.stop(); + } + + /** + * 继续音频播放 + * @param id 音频名称 + */ + resume(id) { + const route = this.getRoute(id); + if (!route) { + console.warn( + "Cannot pause audio route '" + + id + + "', since there is not added route named it." + ); + return; + } + route.resume(); + } + + /** + * 设置听者位置,x正方向水平向右,y正方向垂直于地面向上,z正方向垂直屏幕远离用户 + * @param x 位置x坐标 + * @param y 位置y坐标 + * @param z 位置z坐标 + */ + setListenerPosition(x, y, z) { + const listener = this.ac.listener; + listener.positionX.value = x; + listener.positionY.value = y; + listener.positionZ.value = z; + } + + /** + * 设置听者朝向,x正方向水平向右,y正方向垂直于地面向上,z正方向垂直屏幕远离用户 + * @param x 朝向x坐标 + * @param y 朝向y坐标 + * @param z 朝向z坐标 + */ + setListenerOrientation(x, y, z) { + const listener = this.ac.listener; + listener.forwardX.value = x; + listener.forwardY.value = y; + listener.forwardZ.value = z; + } + + /** + * 设置听者头顶朝向,x正方向水平向右,y正方向垂直于地面向上,z正方向垂直屏幕远离用户 + * @param x 头顶朝向x坐标 + * @param y 头顶朝向y坐标 + * @param z 头顶朝向z坐标 + */ + setListenerUp(x, y, z) { + const listener = this.ac.listener; + listener.upX.value = x; + listener.upY.value = y; + listener.upZ.value = z; + } + } + class AudioRoute { + constructor(source, player) { + source.route = this; + this.output = source.output; + + /** 效果器路由图 */ + this.effectRoute = []; + + /** 结束时长,当音频暂停或停止时,会经过这么长时间之后才真正终止播放,期间可以做音频淡入淡出等效果 */ + this.endTime = 0; + /** 暂停时播放了多长时间 */ + this.pauseCurrentTime = 0; + /** 当前播放状态 */ + this.player = player; + this.status = AudioStatus.Stoped; + + this.shouldStop = false; + /** + * 每次暂停或停止时自增,用于判断当前正在处理的情况。 + * 假如暂停后很快播放,然后很快暂停,那么需要根据这个来判断实际是否应该执行暂停后操作 + */ + this.stopIdentifier = 0; + /** 暂停时刻 */ + this.pauseTime = 0; + this.source = source; + this.source.player = player; + } + /** 音频时长,单位秒 */ + get duration() { + return this.source.duration; + } + /** 当前播放了多长时间,单位秒 */ + get currentTime() { + if (this.status === AudioStatus.Paused) { + return this.pauseCurrentTime; + } else { + return this.source.currentTime; + } + } + set currentTime(time) { + this.source.stop(); + this.source.play(time); + } + /** + * 设置结束时间,暂停或停止时,会经过这么长时间才终止音频的播放,这期间可以做一下音频淡出的效果。 + * @param time 暂停或停止时,经过多长时间之后才会结束音频的播放 + */ + setEndTime(time) { + this.endTime = time; + } + + /** + * 当音频播放时执行的函数,可以用于音频淡入效果 + * @param fn 音频开始播放时执行的函数 + */ + onStart(fn) { + this.audioStartHook = fn; + } + + /** + * 当音频暂停或停止时执行的函数,可以用于音频淡出效果 + * @param fn 音频在暂停或停止时执行的函数,不填时表示取消这个钩子。 + * 包含两个参数,第一个参数是结束时长,第二个参数是当前音频播放路由对象 + */ + onEnd(fn) { + this.audioEndHook = fn; + } + + /** + * 开始播放这个音频 + * @param when 从音频的什么时候开始播放,单位秒 + */ + async play(when = 0) { + if (this.status === AudioStatus.Playing) return; + this.link(); + await this.player.ac.resume(); + if (this.effectRoute.length > 0) { + const first = this.effectRoute[0]; + this.source.connect(first); + const last = this.effectRoute.at(-1); + last.connect({ input: this.player.getDestination() }); + } else { + this.source.connect({ input: this.player.getDestination() }); + } + this.source.play(when); + this.status = AudioStatus.Playing; + this.pauseTime = 0; + this.audioStartHook?.(this); + this.startAllEffect(); + if (this.status !== AudioStatus.Playing) { + this.status = AudioStatus.Playing; + } + } + + /** + * 暂停音频播放 + */ + async pause() { + if (this.status !== AudioStatus.Playing) return; + this.status = AudioStatus.Pausing; + this.stopIdentifier++; + const identifier = this.stopIdentifier; + if (this.audioEndHook) { + this.audioEndHook(this.endTime, this); + await sleep(this.endTime); + } + if ( + this.status !== AudioStatus.Pausing || + this.stopIdentifier !== identifier + ) { + return; + } + this.pauseCurrentTime = this.source.currentTime; + const time = this.source.stop(); + this.pauseTime = time; + if (this.shouldStop) { + this.status = AudioStatus.Stoped; + this.endAllEffect(); + + this.shouldStop = false; + } else { + this.status = AudioStatus.Paused; + this.endAllEffect(); + } + this.endAllEffect(); + } + + /** + * 继续音频播放 + */ + resume() { + if (this.status === AudioStatus.Playing) return; + if ( + this.status === AudioStatus.Pausing || + this.status === AudioStatus.Stoping + ) { + this.audioStartHook?.(this); + + return; + } + if (this.status === AudioStatus.Paused) { + this.play(this.pauseTime); + } else { + this.play(0); + } + this.status = AudioStatus.Playing; + this.pauseTime = 0; + this.audioStartHook?.(this); + this.startAllEffect(); + } + + /** + * 停止音频播放 + */ + async stop() { + if (this.status !== AudioStatus.Playing) { + if (this.status === AudioStatus.Pausing) { + this.shouldStop = true; + } + return; + } + this.status = AudioStatus.Stoping; + this.stopIdentifier++; + const identifier = this.stopIdentifier; + if (this.audioEndHook) { + this.audioEndHook(this.endTime, this); + await sleep(this.endTime); + } + if ( + this.status !== AudioStatus.Stoping || + this.stopIdentifier !== identifier + ) { + return; + } + this.source.stop(); + this.status = AudioStatus.Stoped; + this.pauseTime = 0; + this.endAllEffect(); + } + + /** + * 添加效果器 + * @param effect 要添加的效果,可以是数组,表示一次添加多个 + * @param index 从哪个位置开始添加,如果大于数组长度,那么加到末尾,如果小于0,那么将会从后面往前数。默认添加到末尾 + */ + addEffect(effect, index) { + if (isNil(index)) { + if (effect instanceof Array) { + this.effectRoute.push(...effect); + } else { + this.effectRoute.push(effect); + } + } else { + if (effect instanceof Array) { + this.effectRoute.splice(index, 0, ...effect); + } else { + this.effectRoute.splice(index, 0, effect); + } + } + this.setOutput(); + if (this.source.playing) this.link(); + } + + /** + * 移除一个效果器 + * @param effect 要移除的效果 + */ + removeEffect(effect) { + const index = this.effectRoute.indexOf(effect); + if (index === -1) return; + this.effectRoute.splice(index, 1); + effect.disconnect(); + this.setOutput(); + if (this.source.playing) this.link(); + } + + setOutput() { + const effect = this.effectRoute.at(-1); + if (!effect) this.output = this.source.output; + else this.output = effect.output; + } + + /** + * 连接音频路由图 + */ + link() { + this.effectRoute.forEach((v) => v.disconnect()); + this.effectRoute.forEach((v, i) => { + const next = this.effectRoute[i + 1]; + if (next) { + v.connect(next); + } + }); + } + + startAllEffect() { + this.effectRoute.forEach((v) => v.start()); + } + + endAllEffect() { + this.effectRoute.forEach((v) => v.end()); + } + } + + const audioPlayer = new AudioPlayer(); + + class BgmController { + constructor(player) { + this.mainGain = player.createVolumeEffect(); + this.player = player; + /** bgm音频名称的前缀 */ + this.prefix = "bgms."; + /** 每个 bgm 的音量控制器 */ + this.gain = new Map(); + + /** 正在播放的 bgm */ + this.playingBgm = ""; + /** 是否正在播放 */ + this.playing = false; + + /** 是否已经启用 */ + this.enabled = true; + /** 是否屏蔽所有的音乐切换 */ + this.blocking = false; + /** 渐变时长 */ + this.transitionTime = 2000; + } + + /** + * 设置音频渐变时长 + * @param time 渐变时长 + */ + setTransitionTime(time) { + this.transitionTime = time; + for (const [, value] of this.gain) { + value.transition.time(time); + } + } + + /** + * 屏蔽音乐切换 + */ + blockChange() { + this.blocking = true; + } + + /** + * 取消屏蔽音乐切换 + */ + unblockChange() { + this.blocking = false; + } + + /** + * 设置总音量大小 + * @param volume 音量大小 + */ + setVolume(volume) { + this.mainGain.setVolume(volume); + this._volume = volume; + } + /** + * 获取总音量大小 + */ + getVolume() { + return this.mainGain.getVolume(); + } + /** + * 设置是否启用 + * @param enabled 是否启用 + */ + setEnabled(enabled) { + if (enabled) this.resume(); + else this.stop(); + this.enabled = enabled; + } + + /** + * 设置 bgm 音频名称的前缀 + */ + setPrefix(prefix) { + this.prefix = prefix; + } + + getId(name) { + return `${this.prefix}${name}`; + } + + /** + * 根据 bgm 名称获取其 AudioRoute 实例 + * @param id 音频名称 + */ + get(id) { + return this.player.getRoute(this.getId(id)); + } + + /** + * 添加一个 bgm + * @param id 要添加的 bgm 的名称 + * @param url 指定 bgm 的加载地址 + */ + addBgm(id, url = `project/bgms/${id}`) { + const type = guessTypeByExt(id); + if (!type) { + console.warn( + "Unknown audio extension name: '" + + id.split(".").slice(0, -1).join(".") + + "'" + ); + return; + } + const gain = this.player.createVolumeEffect(); + if (isAudioSupport(type)) { + const source = audioPlayer.createElementSource(); + source.setSource(url); + source.setLoop(true); + const route = new AudioRoute(source, audioPlayer); + route.addEffect([gain, this.mainGain]); + audioPlayer.addRoute(this.getId(id), route); + this.setTransition(id, route, gain); + } else { + const source = audioPlayer.createStreamSource(); + const stream = new StreamLoader(url); + stream.pipe(source); + source.setLoop(true); + const route = new AudioRoute(source, audioPlayer); + route.addEffect([gain, this.mainGain]); + audioPlayer.addRoute(this.getId(id), route); + this.setTransition(id, route, gain); + } + } + + /** + * 移除一个 bgm + * @param id 要移除的 bgm 的名称 + */ + removeBgm(id) { + this.player.removeRoute(this.getId(id)); + const gain = this.gain.get(id); + gain?.transition.ticker.destroy(); + this.gain.delete(id); + } + + setTransition(id, route, gain) { + const transition = new Transition(); + transition + .time(this.transitionTime) + .mode(linear()) + .transition("volume", 0); + + const tick = () => { + gain.setVolume(transition.value.volume); + }; + + /** + * @param expect 在结束时应该是正在播放还是停止 + */ + const setTick = async (expect) => { + transition.ticker.remove(tick); + transition.ticker.add(tick); + const identifier = route.stopIdentifier; + await sleep(this.transitionTime + 500); + if (route.status === expect && identifier === route.stopIdentifier) { + transition.ticker.remove(tick); + if (route.status === AudioStatus.Playing) { + gain.setVolume(1); + } else { + gain.setVolume(0); + } + } + }; + + route.onStart(async () => { + transition.transition("volume", 1); + setTick(AudioStatus.Playing); + }); + route.onEnd(() => { + transition.transition("volume", 0); + setTick(AudioStatus.Paused); + }); + route.setEndTime(this.transitionTime); + + this.gain.set(id, { effect: gain, transition }); + } + + /** + * 播放一个 bgm + * @param id 要播放的 bgm 名称 + */ + play(id, when) { + if (this.blocking) return; + if (id !== this.playingBgm && this.playingBgm) { + this.player.pause(this.getId(this.playingBgm)); + } + this.playingBgm = id; + if (!this.enabled) return; + this.player.play(this.getId(id), when); + this.playing = true; + } + + /** + * 继续当前的 bgm + */ + resume() { + if (this.blocking || !this.enabled || this.playing) return; + if (this.playingBgm) { + this.player.resume(this.getId(this.playingBgm)); + } + this.playing = true; + } + + /** + * 暂停当前的 bgm + */ + pause() { + if (this.blocking || !this.enabled) return; + if (this.playingBgm) { + this.player.pause(this.getId(this.playingBgm)); + } + this.playing = false; + } + + /** + * 停止当前的 bgm + */ + stop() { + if (this.blocking || !this.enabled) return; + if (this.playingBgm) { + this.player.stop(this.getId(this.playingBgm)); + } + this.playing = false; + } + } + const bgmController = new BgmController(audioPlayer); + + class SoundPlayer { + constructor(player) { + /** 每个音效的唯一标识符 */ + this.num = 0; + this.enabled = true; + this.gain = player.createVolumeEffect(); + /** 每个音效的数据 */ + this.buffer = new Map(); + /** 所有正在播放的音乐 */ + this.playing = new Set(); + this.player = player; + } + /** + * 设置是否启用音效 + * @param enabled 是否启用音效 + */ + setEnabled(enabled) { + if (!enabled) this.stopAllSounds(); + this.enabled = enabled; + } + + /** + * 设置音量大小 + * @param volume 音量大小 + */ + setVolume(volume) { + this.gain.setVolume(volume); + } + /** + * 获取音量大小 + */ + getVolume() { + return this.gain.getVolume(); + } + /** + * 添加一个音效 + * @param id 音效名称 + * @param data 音效的Uint8Array数据 + */ + async add(id, data) { + const buffer = await this.player.decodeAudioData(data); + if (!buffer) { + console.warn( + "Cannot decode sound '" + + id + + "', since audio file may not supported by 2.b." + ); + return; + } + this.buffer.set(id, buffer); + } + + /** + * 播放一个音效 + * @param id 音效名称 + * @param position 音频位置,[0, 0, 0]表示正中心,x轴指向水平向右,y轴指向水平向上,z轴指向竖直向上 + * @param orientation 音频朝向,[0, 1, 0]表示朝向前方 + */ + play(id, position = [0, 0, 0], orientation = [1, 0, 0]) { + if (!this.enabled || !id) return -1; + const buffer = this.buffer.get(id); + if (!buffer) { + console.warn( + "Cannot play sound '" + + id + + "', since there is no added data named it." + ); + return -1; + } + const soundNum = this.num++; + + const source = this.player.createBufferSource(); + source.setBuffer(buffer); + const route = this.player.createRoute(source); + const stereo = this.player.createStereoEffect(); + stereo.setPosition(position[0], position[1], position[2]); + stereo.setOrientation(orientation[0], orientation[1], orientation[2]); + route.addEffect([stereo, this.gain]); + this.player.addRoute(`sounds.${soundNum}`, route); + route.play(); + source.output.addEventListener("ended", () => { + this.playing.delete(soundNum); + }); + this.playing.add(soundNum); + return soundNum; + } + + /** + * 停止一个音效 + * @param num 音效的唯一 id + */ + stop(num) { + const id = `sounds.${num}`; + const route = this.player.getRoute(id); + if (route) { + route.stop(); + this.player.removeRoute(id); + this.playing.delete(num); + } + } + + /** + * 停止播放所有音效 + */ + stopAllSounds() { + this.playing.forEach((v) => { + const id = `sounds.${v}`; + const route = this.player.getRoute(id); + if (route) { + route.stop(); + this.player.removeRoute(id); + } + }); + this.playing.clear(); + } + } + const soundPlayer = new SoundPlayer(audioPlayer); + + function loadAllBgm() { + const data = data_a1e2fb4a_e986_4524_b0da_9b7ba7c0874d; + for (const bgm of data.main.bgms) { + bgmController.addBgm(bgm); + } + } + loadAllBgm(); + AudioDecoder.registerDecoder(AudioType.Ogg, VorbisDecoder); + AudioDecoder.registerDecoder(AudioType.Opus, OpusDecoder); + + core.plugin.audioSystem = { + AudioType, + AudioDecoder, + AudioStatus, + checkAudioType, + isAudioSupport, + audioPlayer, + soundPlayer, + bgmController, + guessTypeByExt, + BgmController, + SoundPlayer, + EchoEffect, + DelayEffect, + ChannelVolumeEffect, + VolumeEffect, + StereoEffect, + AudioEffect, + AudioPlayer, + AudioRoute, + AudioStreamSource, + AudioElementSource, + AudioBufferSource, + loadAllBgm, + StreamLoader, + }; + //bgm相关复写 + control.prototype.playBgm = (bgm, when) => { + bgm = core.getMappedName(bgm); + bgmController.play(bgm, when); + core.setMusicBtn(); + }; + control.prototype.pauseBgm = () => { + bgmController.pause(); + core.setMusicBtn(); + }; + + control.prototype.resumeBgm = function () { + bgmController.resume(); + core.setMusicBtn(); + }; + control.prototype.checkBgm = function () { + core.playBgm(bgmController.playingBgm || main.startBgm); + }; + control.prototype.triggerBgm = function () { + core.musicStatus.bgmStatus = !core.musicStatus.bgmStatus; + if (bgmController.playing) bgmController.pause(); + else bgmController.resume(); + core.setMusicBtn(); + core.setLocalStorage("bgmStatus", core.musicStatus.bgmStatus); + }; + //sound相关复写 + control.prototype.playSound = function ( + sound, + _pitch, + callback, + position, + orientation + ) { + if (main.mode != "play" || !core.musicStatus.soundStatus) return; + const name = core.getMappedName(sound); + const num = soundPlayer.play(name, position, orientation); + const route = audioPlayer.getRoute(`sounds.${num}`); + if (!route) { + callback?.(); + return -1; + } else { + sleep(route.duration * 1000).then(() => callback?.()); + return num; + } + }; + control.prototype.stopSound = function (id) { + if (isNil(id)) { + soundPlayer.stopAllSounds(); + } else { + soundPlayer.stop(id); + } + }; + control.prototype.getPlayingSounds = function () { + return [...soundPlayer.playing]; + }; + //sound加载复写 + loader.prototype._loadOneSound_decodeData = function (name, data) { + if (data instanceof Blob) { + var blobReader = new zip.BlobReader(data); + blobReader.init(function () { + blobReader.readUint8Array(0, blobReader.size, function (uint8) { + //core.loader._loadOneSound_decodeData(name, uint8.buffer); + soundPlayer.add(name, uint8); + }); + }); + return; + } + if (data instanceof ArrayBuffer) { + const uint8 = new Uint8Array(data); + soundPlayer.add(name, uint8); + } + }; + //音量控制复写 + soundPlayer.setVolume( + core.musicStatus.userVolume * core.musicStatus.designVolume + ); + bgmController.setVolume( + core.musicStatus.userVolume * core.musicStatus.designVolume + ); + actions.prototype._clickSwitchs_sounds_userVolume = function (delta) { + var value = Math.round(Math.sqrt(100 * core.musicStatus.userVolume)); + if (value == 0 && delta < 0) return; + core.musicStatus.userVolume = core.clamp( + Math.pow(value + delta, 2) / 100, + 0, + 1 + ); + //audioContext 音效 不受designVolume 影响 + if (core.musicStatus.gainNode != null) + core.musicStatus.gainNode.gain.value = core.musicStatus.userVolume; + soundPlayer.setVolume( + core.musicStatus.userVolume * core.musicStatus.designVolume + ); + bgmController.setVolume( + core.musicStatus.userVolume * core.musicStatus.designVolume + ); + core.setLocalStorage("userVolume", core.musicStatus.userVolume); + core.playSound("确定"); + core.ui._drawSwitchs_sounds(); }; }, "自定义常用事件": function () { @@ -12724,424 +12487,434 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 = }; }, "小地图": function () { - // 在此增加新插件 - // ----- 不可自定义 杂七杂八的变量 - /** @type {{[x: string]: BFSResult}} */ - let mapCache = {}; // 地图缓存 - let drawCache = {}; // 绘制信息缓存 - let status = "none"; // 当前的绘制状态 - /** @type {{[x: string]: Sprite}} */ - let sprites = {}; // 当前所有的sprite - /** @type {{[x: string]: Sprite}} */ - let canDrag = {}; // 可以拖拽的sprite - /** @type {{[x: string]: Button}} */ - let areaSprite = {}; // 区域列表对应的sprite - let clicking = false; // 是否正在点击,用于拖拽判定 - let drawingMap = ""; // 正在绘制的中心楼层 - let nowScale = 0; // 当前绘制的放缩比例 - let lastTouch = {}; // 上一次的单点点击信息 - let lastLength = 0; // 手机端缩放时上一次的两指间距离 - let nowDepth = 0; // 当前的遍历深度 - let drawedThumbnail = {}; // 已经绘制过的缩略图 - let moved = false; // 鼠标按下后是否移动了 - let noBorder = false; // 是否是无边框拼接模式 - let lastScale = 0; // 上一次缩放,用于优化缩略图绘制 - let areaPage = 0; // 区域显示的当前页数 - let nowArea = 0; // 当前区域index - let selecting = ""; // 选择时当前正在选择的地图 + // 在此增加新插件 + // ----- 不可自定义 杂七杂八的变量 + /** @type {{[x: string]: BFSResult}} */ + let mapCache = {}; // 地图缓存 + let drawCache = {}; // 绘制信息缓存 + let status = "none"; // 当前的绘制状态 + /** @type {{[x: string]: Sprite}} */ + let sprites = {}; // 当前所有的sprite + /** @type {{[x: string]: Sprite}} */ + let canDrag = {}; // 可以拖拽的sprite + /** @type {{[x: string]: Button}} */ + let areaSprite = {}; // 区域列表对应的sprite + let clicking = false; // 是否正在点击,用于拖拽判定 + let drawingMap = ""; // 正在绘制的中心楼层 + let nowScale = 0; // 当前绘制的放缩比例 + let lastTouch = {}; // 上一次的单点点击信息 + let lastLength = 0; // 手机端缩放时上一次的两指间距离 + let nowDepth = 0; // 当前的遍历深度 + let drawedThumbnail = {}; // 已经绘制过的缩略图 + let moved = false; // 鼠标按下后是否移动了 + let noBorder = false; // 是否是无边框拼接模式 + let lastScale = 0; // 上一次缩放,用于优化缩略图绘制 + let areaPage = 0; // 区域显示的当前页数 + let nowArea = 0; // 当前区域index + let selecting = ""; // 选择时当前正在选择的地图 - // ---- 不可自定义,常量 - /** @type {Area} */ - let areas = []; // 区域信息 - const perPage = Math.floor((core._PY_ - 60) / 30); // 区域的每页显示数量 + // ---- 不可自定义,常量 + /** @type {Area} */ + let areas = []; // 区域信息 + const perPage = Math.floor((core._PY_ - 60) / 30); // 区域的每页显示数量 - // ---- 可自定义,默认的切换地图的图块id - const defaultChange = { - left: "leftPortal", // 左箭头 - up: "upPortal", // 上箭头 - right: "rightPortal", // 右箭头 - down: "downPortal", // 下箭头 - upFloor: "upFloor", // 上楼 - downFloor: "downFloor", // 下楼 - }; - // ---- 可自定义,默认数值 - const defaultValue = { - font: "Verdana", // 默认字体 - scale: 60, // 默认地图缩放比例 - depth: Infinity, // 默认的遍历深度 - }; + // ---- 可自定义,默认的切换地图的图块id + const defaultChange = { + left: "leftPortal", // 左箭头 + up: "upPortal", // 上箭头 + right: "rightPortal", // 右箭头 + down: "downPortal", // 下箭头 + upFloor: "upFloor", // 上楼 + downFloor: "downFloor", // 下楼 + }; + // ---- 可自定义,默认数值 + const defaultValue = { + font: "Verdana", // 默认字体 + scale: 60, // 默认地图缩放比例 + depth: Infinity, // 默认的遍历深度 + }; - // ---- 不可自定义,计算数据 - const dirData = { - up: [1, 0], - down: [-1, 0], - left: [0, 1], - right: [0, -1], - upFloor: [0, 0], - downFloor: [0, 0], - }; - let ignoreEnemies = (this.ignoreEnemies = []); + // ---- 不可自定义,计算数据 + const dirData = { + up: [1, 0], + down: [-1, 0], + left: [0, 1], + right: [0, -1], + upFloor: [0, 0], + downFloor: [0, 0], + }; + let ignoreEnemies = (this.ignoreEnemies = []); - let allChangeEntries = Object.entries(defaultChange); + let allChangeEntries = Object.entries(defaultChange); - this.setq = function (floorId) { - core.setFlag("任务地点", floorId); - }; + this.setq = function (floorId) { + core.setFlag("任务地点", floorId); + }; - const reset = core.events.resetGame; - this.bfs = function () { - areas = []; - // 获取所有分区,使用异步函数,保证不会卡顿 - // 原理是用bfs扫,将所有连在一起的地图合并成一个区域 - (async function () { - let all = core.floorIds.slice(); - const scanned = { - [all[0]]: true, - }; - while (all.length > 0) { - let now = all.shift(); - if (core.status.maps[now].deleted) continue; - if (!now) return; - await new Promise((res) => { - const result = core.plugin.bfsSearch(now, Infinity, true); - mapCache[`${now}_Infinity_false`] = result; - areas.push({ name: core.floors[now].areas, maps: result.order }); - for (const map of result.order) { - scanned[map] = true; - all = all.filter((v) => !result.order.includes(v)); - } - res("success"); - }).then(() => { - core.setFlag("areas", areas); - }); - } - })(); - }; - core.events.resetGame = function () { - reset.apply(core.events, arguments); - core.plugin.bfs(); - }; - /** - * 广度优先搜索搜索地图路径 - * @param {string} center 中心地图的id - * @param {number} depth 搜索深度 - * @param {boolean} noCache 是否不使用缓存 - * @returns {BFSResult} 格式:floorId_x_y_dir: floorId_x_y - */ - this.bfsSearch = function bfsSearch(center, depth, noCache) { - // 检查缓存 - const id = `${center}_${depth}_${noBorder}`; - if (mapCache[id] && !noCache) return mapCache[id]; - const used = { - [center]: true, - }; // 搜索过的楼层 - let queue = []; - let stack = [center]; // 当前栈 - let nowDepth = -1; - const mapOrder = [center]; // 遍历顺序,顺便还能记录遍历了哪些楼层 + const reset = core.events.resetGame; + this.bfs = function () { + areas = []; + // 获取所有分区,使用异步函数,保证不会卡顿 + // 原理是用bfs扫,将所有连在一起的地图合并成一个区域 + (async function () { + let all = core.floorIds.slice(); + const scanned = { + [all[0]]: true, + }; + while (all.length > 0) { + let now = all.shift(); + if (core.status.maps[now].deleted) continue; + if (!now) return; + await new Promise((res) => { + const result = core.plugin.bfsSearch(now, Infinity, true); + mapCache[`${now}_Infinity_false`] = result; + areas.push({ name: core.floors[now].areas, maps: result.order }); + for (const map of result.order) { + scanned[map] = true; + all = all.filter((v) => !result.order.includes(v)); + } + res("success"); + }).then(() => { + core.setFlag("areas", areas); + }); + } + })(); + }; + core.events.resetGame = function () { + reset.apply(core.events, arguments); + core.plugin.bfs(); + }; + /** + * 广度优先搜索搜索地图路径 + * @param {string} center 中心地图的id + * @param {number} depth 搜索深度 + * @param {boolean} noCache 是否不使用缓存 + * @returns {BFSResult} 格式:floorId_x_y_dir: floorId_x_y + */ + this.bfsSearch = function bfsSearch(center, depth, noCache) { + // 检查缓存 + const id = `${center}_${depth}_${noBorder}`; + if (mapCache[id] && !noCache) return mapCache[id]; + const used = { + [center]: true, + }; // 搜索过的楼层 + let queue = []; + let stack = [center]; // 当前栈 + let nowDepth = -1; + const mapOrder = [center]; // 遍历顺序,顺便还能记录遍历了哪些楼层 - const res = {}; // 输出结果,格式:floorId_x_y_dir: floorId_x_y - const enemies = {}; - const upOrDown = {}; - const mapdir = {}; - // 开始循环搜索 - while (nowDepth < depth && stack.length > 0) { - const now = stack.shift(); // 当前id - if (core.status.maps[now].deleted) continue; - mapdir[now] = mapdir[now] ?? []; - const blocks = core.getMapBlocksObj(now); // 获取当前地图的每点的事件 - enemies[now] = {}; - // 遍历,获取可以传送的点,只检测绿点事件,因此可用红点事件进行传送来实现分区功能 - for (const i in blocks) { - const block = blocks[i]; - // 整合漏怪检测,所以要检测怪物 - if (block.event.trigger === "battle") { - const id = block.event.id; - if (ignoreEnemies.includes(id)) continue; - else enemies[now][i] = block.event.id; - continue; - } - // 检测触发器是否为切换楼层,不是则直接跳过 - if (block.event.trigger !== "changeFloor") continue; - const dirEntries = allChangeEntries.find( - (v) => v[1] === block.event.id - ); - // 如果不是那六种传送门,直接忽略 - if (!dirEntries) continue; - const data = block.event.data; - const dir = dirEntries[0]; - const route = now + "_" + i.replace(",", "_") + "_" + dir; - const target = data.floorId + "_" + data.loc.join("_"); + const res = {}; // 输出结果,格式:floorId_x_y_dir: floorId_x_y + const enemies = {}; + const upOrDown = {}; + const mapdir = {}; + // 开始循环搜索 + while (nowDepth < depth && stack.length > 0) { + const now = stack.shift(); // 当前id + if (core.status.maps[now].deleted) continue; + mapdir[now] = mapdir[now] ?? []; + const blocks = core.getMapBlocksObj(now); // 获取当前地图的每点的事件 + enemies[now] = {}; + // 遍历,获取可以传送的点,只检测绿点事件,因此可用红点事件进行传送来实现分区功能 + for (const i in blocks) { + const block = blocks[i]; + // 整合漏怪检测,所以要检测怪物 + if (block.event.trigger === "battle") { + const id = block.event.id; + if (ignoreEnemies.includes(id)) continue; + else enemies[now][i] = block.event.id; + continue; + } + // 检测触发器是否为切换楼层,不是则直接跳过 + if (block.event.trigger !== "changeFloor") continue; + const dirEntries = allChangeEntries.find( + (v) => v[1] === block.event.id + ); + // 如果不是那六种传送门,直接忽略 + if (!dirEntries) continue; + const data = block.event.data; + const dir = dirEntries[0]; + const route = now + "_" + i.replace(",", "_") + "_" + dir; + const target = data.floorId + "_" + data.loc.join("_"); - mapdir[now].push(dir); - if (!used[data.floorId]) { - if (dir === "upFloor" || dir === "downFloor") { - upOrDown[now] = upOrDown[id] ?? []; - upOrDown[now].push(dir); - } + mapdir[now].push(dir); + if (!used[data.floorId]) { + if (dir === "upFloor" || dir === "downFloor") { + upOrDown[now] = upOrDown[id] ?? []; + upOrDown[now].push(dir); + } - queue.push(data.floorId); // 没有搜索过,则加入栈中 - mapOrder.push(data.floorId); - used[data.floorId] = true; - } - res[route] = target; - } - if (stack.length === 0) { - stack = queue; - queue = []; - nowDepth++; - } - if (stack.length === 0 && queue.length === 0) break; - } - return { res, order: mapOrder, enemies, upOrDown, mapdir }; - }; - /** - * 获取绘制信息 - * @param {string?} center 中心地图id - * @param {number?} depth 搜索深度 - * @param {boolean?} noCache 是否不使用缓存 - * @returns {MapDrawInfo} - */ - this.getMapDrawInfo = function ( - center = core.status.floorId, - depth = defaultValue.depth, - noCache = false - ) { - nowDepth = depth; - drawingMap = center; - const id = `${center}_${depth}_${noBorder}`; - // 检查缓存 - if (drawCache[id] && !noCache) return drawCache[id]; - const map = core.plugin.bfsSearch(center, depth, noCache); - mapCache[id] = map; - const res = getDrawInfo(map.res, center, map.order); - res.upOrDown = map.upOrDown; - res.mapdir = map.mapdir; - drawCache[id] = res; - return res; - }; - /** - * 提供地图的绘制信息 - * @param {{[x: string]: string}} map 要绘制的地图,格式:floorId_x_y_dir: floorId_x_y - * @param {string} center 中心地图的id - * @param {string[]} order 遍历顺序 - * @returns {MapDrawInfo} 地图的绘制信息 - */ + queue.push(data.floorId); // 没有搜索过,则加入栈中 + mapOrder.push(data.floorId); + used[data.floorId] = true; + } + res[route] = target; + } + if (stack.length === 0) { + stack = queue; + queue = []; + nowDepth++; + } + if (stack.length === 0 && queue.length === 0) break; + } + return { res, order: mapOrder, enemies, upOrDown, mapdir }; + }; + /** + * 获取绘制信息 + * @param {string?} center 中心地图id + * @param {number?} depth 搜索深度 + * @param {boolean?} noCache 是否不使用缓存 + * @returns {MapDrawInfo} + */ + this.getMapDrawInfo = function ( + center = core.status.floorId, + depth = defaultValue.depth, + noCache = false + ) { + nowDepth = depth; + drawingMap = center; + const id = `${center}_${depth}_${noBorder}`; + // 检查缓存 + if (drawCache[id] && !noCache) return drawCache[id]; + const map = core.plugin.bfsSearch(center, depth, noCache); + mapCache[id] = map; + const res = getDrawInfo(map.res, center, map.order); + res.upOrDown = map.upOrDown; + res.mapdir = map.mapdir; + drawCache[id] = res; + return res; + }; + /** + * 提供地图的绘制信息 + * @param {{[x: string]: string}} map 要绘制的地图,格式:floorId_x_y_dir: floorId_x_y + * @param {string} center 中心地图的id + * @param {string[]} order 遍历顺序 + * @returns {MapDrawInfo} 地图的绘制信息 + */ - function getDrawInfo(map, center, order) { - // 先根据地图id分类,从而确定每个地图连接哪些地图,同时方便处理 - const links = {}; - for (const i in map) { - const splitted = i.split("_"); - const id = splitted[0]; - if (!links[id]) links[id] = {}; - links[id][i] = map[i]; - } + function getDrawInfo(map, center, order) { + // 先根据地图id分类,从而确定每个地图连接哪些地图,同时方便处理 + const links = {}; + for (const i in map) { + const splitted = i.split("_"); + const id = splitted[0]; + if (!links[id]) links[id] = {}; + links[id][i] = map[i]; + } - // 分类完毕,然后根据连接点先计算出各个地图的坐标,然后再进行判断 - const centerFloor = core.status.maps[center]; - const visitedCenter = core.hasVisitedFloor(center); - const locs = { - // 格式:[中心x, 中心y, 宽, 高, 是否到达过] - [center]: [2, 2, 1, 1, visitedCenter], - }; - // 可以上楼下楼的地图 - const upOrDown = {}; - for (const id of order) { - const now = links[id]; - // 遍历每一个地图的连接情况 - for (const from in now) { - const to = now[from]; - // 先根据from to计算物理位置 - const fromData = from.split("_"), - toData = to.split("_"); - const dir = fromData[3]; - if (dir === "upFloor" || dir === "downFloor") continue; - if (!defaultChange[dir]) continue; - const v = dirData[dir][1], // 竖直数值 - h = dirData[dir][0], // 水平数值 - ha = Math.abs(h), - va = Math.abs(v); - const ff = id, // fromFloorId - tf = toData[0]; // toFloorId - const fromFloor = core.status.maps[ff], - toFloor = core.status.maps[tf]; - const fhw = Math.floor(fromFloor.width / 2), // fromFloorHalfWidth - fhh = Math.floor(fromFloor.height / 2), - thw = Math.floor(toFloor.width / 2), - thh = Math.floor(toFloor.height / 2); - const fLoc = locs[id] ?? [0, 0]; - if (!locs[ff]) continue; - let x, y; - if (locs && locs[tf]) { - x = locs[tf][0]; - y = locs[tf][1]; - } else { - // 计算坐标,公式可以通过画图推断出 - x = fLoc[0] - v; - y = fLoc[1] - h; - } - locs[tf] = locs[tf] ?? [x, y, 1, 1, core.hasVisitedFloor(tf)]; - } - } - // 获取地图绘制需要的长宽 - let width = 0, - height = 0; - let left, right, up, down; - for (const id in locs) { - const [x, y, w, h] = locs[id]; - if (left === void 0) { - left = right = x; - up = down = y; - } - left = Math.min(x - 1, left); - right = Math.max(x + 1, right); - up = Math.min(y - 1, up); - down = Math.max(y + 1, down); - } - width = right - left; - height = down - up; + // 分类完毕,然后根据连接点先计算出各个地图的坐标,然后再进行判断 + const centerFloor = core.status.maps[center]; + const visitedCenter = core.hasVisitedFloor(center); + const locs = { + // 格式:[中心x, 中心y, 宽, 高, 是否到达过] + [center]: [2, 2, 1, 1, visitedCenter], + }; + // 可以上楼下楼的地图 + const upOrDown = {}; + for (const id of order) { + const now = links[id]; + // 遍历每一个地图的连接情况 + for (const from in now) { + const to = now[from]; + // 先根据from to计算物理位置 + const fromData = from.split("_"), + toData = to.split("_"); + const dir = fromData[3]; + if (dir === "upFloor" || dir === "downFloor") continue; + if (!defaultChange[dir]) continue; + const v = dirData[dir][1], // 竖直数值 + h = dirData[dir][0], // 水平数值 + ha = Math.abs(h), + va = Math.abs(v); + const ff = id, // fromFloorId + tf = toData[0]; // toFloorId + const fromFloor = core.status.maps[ff], + toFloor = core.status.maps[tf]; + const fhw = Math.floor(fromFloor.width / 2), // fromFloorHalfWidth + fhh = Math.floor(fromFloor.height / 2), + thw = Math.floor(toFloor.width / 2), + thh = Math.floor(toFloor.height / 2); + const fLoc = locs[id] ?? [0, 0]; + if (!locs[ff]) continue; + let x, y; + if (locs && locs[tf]) { + x = locs[tf][0]; + y = locs[tf][1]; + } else { + // 计算坐标,公式可以通过画图推断出 + x = fLoc[0] - v; + y = fLoc[1] - h; + } + locs[tf] = locs[tf] ?? [x, y, 1, 1, core.hasVisitedFloor(tf)]; + } + } + // 获取地图绘制需要的长宽 + let width = 0, + height = 0; + let left, right, up, down; + for (const id in locs) { + const [x, y, w, h] = locs[id]; + if (left === void 0) { + left = right = x; + up = down = y; + } + left = Math.min(x - 1, left); + right = Math.max(x + 1, right); + up = Math.min(y - 1, up); + down = Math.max(y + 1, down); + } + width = right - left; + height = down - up; - return { locs, width, height, layer: upOrDown }; - } + return { locs, width, height, layer: upOrDown }; + } - function mapblock(mapdir) { - let mb = ""; - if (mapdir.includes("up")) mb += "u"; - if (mapdir.includes("down")) mb += "d"; - if (mapdir.includes("left")) mb += "l"; - if (mapdir.includes("right")) mb += "r"; - return mb ? mb + ".webp" : "null.webp"; - } - core.animateFrame.globalAlphaFloor = 0; - core.animateFrame.globalAlphaFloorStatus = 1; + function mapblock(mapdir) { + let mb = ""; + if (mapdir.includes("up")) mb += "u"; + if (mapdir.includes("down")) mb += "d"; + if (mapdir.includes("left")) mb += "l"; + if (mapdir.includes("right")) mb += "r"; + return mb ? mb + ".webp" : "null.webp"; + } + core.animateFrame.globalAlphaFloor = 0; + core.animateFrame.globalAlphaFloorStatus = 1; - const tesk = document.createElement("canvas"); - tesk.width = 300; - tesk.height = 300; - const teskctx = tesk.getContext("2d"); + const tesk = document.createElement("canvas"); + tesk.width = 300; + tesk.height = 300; + const teskctx = tesk.getContext("2d"); - let line = 50; - teskctx.strokeStyle = "green"; - teskctx.fillStyle = "green"; - let now = 0; - core.registerAnimationFrame("tesk", true, function (timestamp) { - if (timestamp - now > 1000 / 60) { - now = timestamp; - core.clearMap(teskctx); - teskctx.lineWidth = 150 - line; + let line = 50; + teskctx.strokeStyle = "green"; + teskctx.fillStyle = "green"; + let now = 0; + core.registerAnimationFrame("tesk", true, function (timestamp) { + if (timestamp - now > 1000 / 60) { + now = timestamp; + core.clearMap(teskctx); + teskctx.lineWidth = 150 - line; - if (line <= 150) { - teskctx.beginPath(); - teskctx.arc(150, 150, line, 0, Math.PI * 2); - line += 2; - teskctx.stroke(); - } else { - teskctx.beginPath(); - teskctx.arc(150, 150, line - 150, 0, Math.PI * 2); - line += 2; - teskctx.fill(); - if (line >= 250) line = 50; - } - } - }); + if (line <= 150) { + teskctx.beginPath(); + teskctx.arc(150, 150, line, 0, Math.PI * 2); + line += 2; + teskctx.stroke(); + } else { + teskctx.beginPath(); + teskctx.arc(150, 150, line - 150, 0, Math.PI * 2); + line += 2; + teskctx.fill(); + if (line >= 250) line = 50; + } + } + }); - /** - * 绘制小地图 - * @param {MapDrawInfo} info 地图绘制信息 - * @param {number} scale 地图的绘制比例 - */ - this.drawSmallMap = function ( - ctx, - info, - center, - sx, - sy, - sw, - sh, - scale = defaultValue.scale - ) { - core.clearMap(ctx, sx, sy, sw + 40, sh + 60); - if (core.domStyle.isVertical) { - sy += 50; - sx += 15; - } else { - sy += 60; - sx += 30; - } - core.fillRect(ctx, sx, sy, sw, sh, "#000"); - core.strokeRect(ctx, sx, sy, sw, sh, "#fff", 5); - core.setTextAlign("outerUI", "center"); - core.fillBoldText1( - ctx, - core.status.maps[center].areas, - sx + sw / 2, - sy - 10, - "#FFFFFF", - "#000000", - 6, - "bold 42px Verdana" - ); - const locs = info.locs; - for (const id in locs) { - const loc = locs[id]; - let color = "#000"; - if (!loc[4]) color = "#f0f"; - const [x, y, w, h] = loc.map((v) => typeof v === "number" && v * scale); - const fx = x + sx, - fy = y + sy; - const mapdir = info.mapdir[id]; - const img = mapblock(mapdir); - if (x < 0 || x > 4 * scale || y < 0 || y > 4 * scale) continue; - core.drawImage(ctx, img, 0, 0, 60, 60, fx, fy, w, h); - const layer = info.upOrDown[id]; - const min = Math.min(w, h); - if (core.getFlag("任务地点") && core.getFlag("任务地点") === id) - ctx.drawImage(tesk, fx + min / 4, fy + min / 4, min / 2, min / 2); - if (layer?.includes("upFloor")) - core.drawIcon( - ctx, - defaultChange.upFloor, - fx + min / 4, - fy + min / 4, - min / 2, - min / 2 - ); - if (layer?.includes("downFloor")) - core.drawIcon( - ctx, - defaultChange.downFloor, - fx + min / 4, - fy + min / 4, - min / 2, - min / 2 - ); + /** + * 绘制小地图 + * @param {MapDrawInfo} info 地图绘制信息 + * @param {number} scale 地图的绘制比例 + */ + this.drawSmallMap = function ( + ctx, + info, + center, + sx, + sy, + sw, + sh, + scale = defaultValue.scale + ) { + core.clearMap(ctx, sx, sy, sw + 40, sh + 60); + if (core.domStyle.isVertical) { + sy += 50; + sx += 15; + } else { + sy += 60; + sx += 30; + } + core.fillRect(ctx, sx, sy, sw, sh, "#000"); + core.strokeRect(ctx, sx, sy, sw, sh, "#fff", 5); + core.setTextAlign("outerUI", "center"); + core.fillBoldText1( + ctx, + core.status.maps[center].areas, + sx + sw / 2, + sy - 10, + "#FFFFFF", + "#000000", + 6, + "bold 42px Verdana" + ); + const locs = info.locs; + for (const id in locs) { + const loc = locs[id]; + let color = "#000"; + if (!loc[4]) color = "#f0f"; + const [x, y, w, h] = loc.map((v) => typeof v === "number" && v * scale); + const fx = x + sx, + fy = y + sy; + const mapdir = info.mapdir[id]; + const img = mapblock(mapdir); + if (x < 0 || x > 4 * scale || y < 0 || y > 4 * scale) continue; + core.drawImage(ctx, img, 0, 0, 60, 60, fx, fy, w, h); + const layer = info.upOrDown[id]; + const min = Math.min(w, h); - // 显示漏怪数量 - if (core.getFlag("showEnemy")) { - ctx.textAlign = "center"; - ctx.textBaseline = "middle"; - const c = drawingMap + "_" + nowDepth + "_" + noBorder; - const n = Object.keys(mapCache[c].enemies[id]).length; - color = "#fff"; - if (n > 10) color = "#fc3"; - if (n > 20) color = "#f22"; - ctx.shadowBlur = 0.6 * nowScale; - ctx.shadowColor = "#000"; - if (n > 0) - core.fillText( - ctx, - n, - fx + (w * 3) / 10, - fy + (h * 7) / 10, - color, - 22 + "px normal" - ); - ctx.shadowBlur = 0; - } - } - }; - }, + + if (layer?.includes("upFloor")) + core.drawIcon( + ctx, + defaultChange.upFloor, + fx + min / 4, + fy + min / 4, + min / 2, + min / 2 + ); + if (layer?.includes("downFloor")) + core.drawIcon( + ctx, + defaultChange.downFloor, + fx + min / 4, + fy + min / 4, + min / 2, + min / 2 + ); + if (core.getFlag("任务地点") && core.getFlag("任务地点") === id) + ctx.drawImage(tesk, fx + min / 4, fy + min / 4, min / 2, min / 2); + if (id === core.status.floorId) core.drawImage(ctx, "hero.webp", + 0, + 0, + 32, + 19, fx + min / 4, fy + min * 5 / 16, 32, 19); + // 显示漏怪数量 + if (core.getFlag("showEnemy")) { + ctx.textAlign = "center"; + ctx.textBaseline = "middle"; + const c = drawingMap + "_" + nowDepth + "_" + noBorder; + const n = Object.keys(mapCache[c].enemies[id]).length; + color = "#fff"; + if (n > 10) color = "#fc3"; + if (n > 20) color = "#f22"; + ctx.shadowBlur = 0.6 * nowScale; + ctx.shadowColor = "#000"; + if (n > 0) + core.fillText( + ctx, + n, + fx + (w * 3) / 10, + fy + (h * 7) / 10, + color, + 22 + "px normal" + ); + ctx.shadowBlur = 0; + } + if (!core.hasVisitedFloor(id)) { + core.fillRect(ctx, fx, fy, w, h, "rgba(0,0,0,0.7)") + core.fillText(ctx, "?", fx + min / 2, fy + min * 3 / 4, "#FFFFFF", "bold 42px Verdana") + } + } + }; +}, "楼传": function () { // 在此增加新插件 @@ -13528,20 +13301,30 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 = if ( !core.status.maps[core.floorIds[page]].canFlyTo || !core.hasVisitedFloor(core.floorIds[page]) - ) + ) { + /*core.fillRect("ui", 58, + 58, + size - 50, + size - 50, "rgba(0,0,0,0.5)")*/ + core.getContextByName("ui").globalAlpha = 0.7 + core.drawImage( "ui", - "lock.webp", + "miwu.webp", 0, 0, size, size, 58, 58, - size - 8, - size - 8 + size - 50, + size - 50 ); - + core.getContextByName("ui").globalAlpha = 1 + /*core.fillText("ui", '?', 188, + 278, + "rgba(255,255,255,0.2)", this._buildFont(250, true))*/ + } core.fillRoundRect( "ui", 15 + 44 - 2, @@ -13767,7 +13550,7 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 = title, 15 - 4 + size - 4 + 45, 85, - "#FFFFFF", + core.hasVisitedFloor(floorId) ? "#FFFFFF" : "#444444", "#000000", 18 ); @@ -14258,511 +14041,508 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 = ); }, "CG回廊": function () { - // 在此增加新插件 - const CGUI = document.createElement("canvas"); //CGui画布设置 - CGUI.style.position = "absolute"; - CGUI.style.zIndex = 300; - CGUI.style.display = "none"; - CGUI.id = "CGUI"; - main.dom.gameGroup.insertAdjacentElement("afterend", CGUI); - CGUI.style.top = "50%"; - CGUI.style.left = "50%"; - CGUI.style.transform = "translate(-50%,-50%)"; - const ctx = CGUI.getContext("2d"); - main.dom.CGUI = CGUI; - let page = 0; //初始页面 - let show = false; //展示状态 - CGUI.onclick = function (e) { - try { - e.preventDefault(); - if (core.isPlaying()) return false; - const left = core.dom.gameGroup.offsetLeft; - const top = core.dom.gameGroup.offsetTop; - const px = Math.floor((e.clientX - left) / core.domStyle.scale), - py = Math.floor((e.clientY - top) / core.domStyle.scale); - core.ui.CG.onclick(px * 3, py * 3); - } catch (ee) { - main.log(ee); - } - }; + // 在此增加新插件 + const CGUI = document.createElement("canvas"); //CGui画布设置 + CGUI.style.position = "absolute"; + CGUI.style.zIndex = 300; + CGUI.style.display = "none"; + CGUI.id = "CGUI"; + main.dom.gameGroup.insertAdjacentElement("afterend", CGUI); + CGUI.style.top = "50%"; + CGUI.style.left = "50%"; + CGUI.style.transform = "translate(-50%,-50%)"; + const ctx = CGUI.getContext("2d"); + main.dom.CGUI = CGUI; + let page = 0; //初始页面 + let show = false; //展示状态 + CGUI.onclick = function (e) { + try { + e.preventDefault(); + if (core.isPlaying()) return false; + const left = core.dom.gameGroup.offsetLeft; + const top = core.dom.gameGroup.offsetTop; + const px = Math.floor((e.clientX - left) / core.domStyle.scale), + py = Math.floor((e.clientY - top) / core.domStyle.scale); + core.ui.CG.onclick(px * 3, py * 3); + } catch (ee) { + main.log(ee); + } + }; - class CG { - constructor() { - this.cgs; - //cg列表 - this.UIMx = [ - //空位用‘none’填充,当前ui3*2 - [ - ["eve_010102.webp", "eve_010203.webp", "eve_010304.webp"], - ["eve_010501.webp", "eve_010601.webp", "eve_010701.webp"], - ], - [ - ["eve_010801.webp", "eve_010902.webp", "eve_011001.webp"], - ["eve_011101.webp", "eve_011202.webp", "eve_011302.webp"], - ], - [ - ["eve_011402.webp", "eve_020102.webp", "eve_020201.webp"], - ["eve_020301.webp", "eve_020401.webp", "eve_020501.webp"], - ], - [ - ["eve_020605.webp", "eve_020701.webp", "eve_020801.webp"], - ["eve_030101.webp", "eve_030206.webp", "eve_030302.webp"], - ], - [ - ["eve_030508.webp", "eve_030601.webp", "eve_030801.webp"], - ["eve_030901.webp", "eve_031002.webp", "eve_031101.webp"], - ], - [ - ["eve_040201.webp", "eve_040401.webp", "eve_040501.webp"], - ["eve_040601.webp", "eve_040702.webp", "eve_040801.webp"], - ], - [ - ["eve_050101.webp", "eve_050201.webp", "eve_050401.webp"], - ["eve_050501.webp", "eve_050601.webp", "eve_050704.webp"], - ], - [ - ["eve_050801.webp", "eve_070101.webp", "bg_1511.webp"], - ["bg_1521.webp", "bg_2011.webp", "bg_2521.webp"], - ], - [ - ["bg_3042.webp", "bg_3551.webp", "bg_3571.webp"], - ["bg_3721.webp", "bg_5033.webp", "bg_5044.webp"], - ], - ]; - } + class CG { + constructor() { + this.cgs; + //cg列表 + this.UIMx = [ + //空位用‘none’填充,当前ui3*2 + [ + ["eve_010102.webp", "eve_010203.webp", "eve_010304.webp"], + ["eve_010501.webp", "eve_010601.webp", "eve_010701.webp"], + ], + [ + ["eve_010801.webp", "eve_010902.webp", "eve_011001.webp"], + ["eve_011101.webp", "eve_011202.webp", "eve_011302.webp"], + ], + [ + ["eve_011402.webp", "eve_020102.webp", "eve_020201.webp"], + ["eve_020301.webp", "eve_020401.webp", "eve_020501.webp"], + ], + [ + ["eve_020605.webp", "eve_020701.webp", "eve_020801.webp"], + ["eve_030101.webp", "eve_030206.webp", "eve_030302.webp"], + ], + [ + ["eve_030508.webp", "eve_030601.webp", "eve_030801.webp"], + ["eve_030901.webp", "eve_031002.webp", "eve_031101.webp"], + ], + [ + ["eve_040201.webp", "eve_040401.webp", "eve_040501.webp"], + ["eve_040601.webp", "eve_040702.webp", "eve_040801.webp"], + ], + [ + ["eve_050101.webp", "eve_050201.webp", "eve_050401.webp"], + ["eve_050501.webp", "eve_050601.webp", "eve_050704.webp"], + ], + [ + ["eve_050801.webp", "eve_070101.webp", "bg_1511.webp"], + ["bg_1521.webp", "bg_2011.webp", "bg_2521.webp"], + ], + [ + ["bg_3042.webp", "bg_3551.webp", "bg_3571.webp"], + ["bg_3721.webp", "bg_5033.webp", "bg_5044.webp"], + ], + ]; + } - //更新 - update() { - this.background(); - this.drawUI(); - } - background() { - //画布大小设置 - if (core.domStyle.isVertical) { - CGUI.width = 1248; - CGUI.height = 2028; - } else { - CGUI.width = 2028; - CGUI.height = 1248; - } - core.setTextAlign(ctx, "center"); - } - onclick(px, py) { - //点击 + //更新 + update() { + this.background(); + this.drawUI(); + } + background() { + //画布大小设置 + if (core.domStyle.isVertical) { + CGUI.width = 1248; + CGUI.height = 2028; + } else { + CGUI.width = 2028; + CGUI.height = 1248; + } + core.setTextAlign(ctx, "center"); + } + onclick(px, py) { + //点击 - if (show) { - show = !show; - core.clearMap(ctx); - this.update(); - return; - } - const makeBox = ([x, y], [w, h]) => { - return [ - [x, y], - [x + w, y + h], - ]; - }; - const inRect = ([x, y], [ - [sx, sy], - [dx, dy] - ]) => { - return sx <= x && x <= dx && sy <= y && y <= dy; - }; - const pos = [px, py]; - const backbox = makeBox([15, 35], [210, 90]); - if (inRect(pos, backbox)) { - //离开按钮是一致的,其余的记区分横竖屏 - CGUI.style.display = "none"; - core.clearMap(ctx); - core.restart(); - return; - } - if (core.domStyle.isVertical) { - //竖屏 - const pageupbox = makeBox([200, 1830], [200, 100]); - const pagedownbox = makeBox([900, 1830], [200, 100]); + if (show) { + show = !show; + core.clearMap(ctx); + this.update(); + return; + } + const makeBox = ([x, y], [w, h]) => { + return [ + [x, y], + [x + w, y + h], + ]; + }; + const inRect = ([x, y], [[sx, sy], [dx, dy]]) => { + return sx <= x && x <= dx && sy <= y && y <= dy; + }; + const pos = [px, py]; + const backbox = makeBox([15, 35], [210, 90]); + if (inRect(pos, backbox)) { + //离开按钮是一致的,其余的记区分横竖屏 + CGUI.style.display = "none"; + core.clearMap(ctx); + core.restart(); + return; + } + if (core.domStyle.isVertical) { + //竖屏 + const pageupbox = makeBox([200, 1830], [200, 100]); + const pagedownbox = makeBox([900, 1830], [200, 100]); - const imagebox0 = makeBox([50, 200], [560, 420]); - const imagebox1 = makeBox([50, 750], [560, 420]); - const imagebox2 = makeBox([50, 1300], [560, 420]); + const imagebox0 = makeBox([50, 200], [560, 420]); + const imagebox1 = makeBox([50, 750], [560, 420]); + const imagebox2 = makeBox([50, 1300], [560, 420]); - const imagebox3 = makeBox([650, 200], [560, 420]); - const imagebox4 = makeBox([650, 750], [560, 420]); - const imagebox5 = makeBox([650, 1300], [560, 420]); - if (inRect(pos, pagedownbox)) { - //2代表当前最大页数-1 - if (page < this.UIMx.length - 1) { - page++; - core.clearMap(ctx); - this.update(); - } - } else if (inRect(pos, pageupbox)) { - if (page > 0) { - page--; - core.clearMap(ctx); - this.update(); - } - } else if (inRect(pos, imagebox0)) { - if (this.cgs.includes(this.UIMx[page][0][0])) { - const img = core.material.images.images[this.UIMx[page][0][0]]; - if (img) { - ctx.save(); //保存设置 - ctx.translate(1248, 0); //重新定位右上角为基准 - ctx.rotate(Math.PI / 2); //旋转90度 - ctx.drawImage(img, 0, 0, 2028, 1248); - ctx.restore(); //重置画布设置 - show = !show; - } - } - } else if (inRect(pos, imagebox1)) { - if (this.cgs.includes(this.UIMx[page][0][1])) { - const img = core.material.images.images[this.UIMx[page][0][1]]; - if (img) { - ctx.save(); //保存设置 - ctx.translate(1248, 0); //重新定位右上角为基准 - ctx.rotate(Math.PI / 2); //旋转90度 - ctx.drawImage(img, 0, 0, 2028, 1248); - ctx.restore(); //重置画布设置 - show = !show; - } - } - } else if (inRect(pos, imagebox2)) { - if (this.cgs.includes(this.UIMx[page][0][2])) { - const img = core.material.images.images[this.UIMx[page][0][2]]; - if (img) { - ctx.save(); //保存设置 - ctx.translate(1248, 0); //重新定位右上角为基准 - ctx.rotate(Math.PI / 2); //旋转90度 - ctx.drawImage(img, 0, 0, 2028, 1248); - ctx.restore(); //重置画布设置 - show = !show; - } - } - } else if (inRect(pos, imagebox3)) { - if (this.cgs.includes(this.UIMx[page][1][0])) { - const img = core.material.images.images[this.UIMx[page][1][0]]; - if (img) { - ctx.save(); //保存设置 - ctx.translate(1248, 0); //重新定位右上角为基准 - ctx.rotate(Math.PI / 2); //旋转90度 - ctx.drawImage(img, 0, 0, 2028, 1248); - ctx.restore(); //重置画布设置 - show = !show; - } - } - } else if (inRect(pos, imagebox4)) { - if (this.cgs.includes(this.UIMx[page][1][1])) { - const img = core.material.images.images[this.UIMx[page][1][1]]; - if (img) { - ctx.save(); //保存设置 - ctx.translate(1248, 0); //重新定位右上角为基准 - ctx.rotate(Math.PI / 2); //旋转90度 - ctx.drawImage(img, 0, 0, 2028, 1248); - ctx.restore(); //重置画布设置 - show = !show; - } - } - } else if (inRect(pos, imagebox5)) { - if (this.cgs.includes(this.UIMx[page][1][2])) { - const img = core.material.images.images[this.UIMx[page][1][2]]; - if (img) { - ctx.save(); //保存设置 - ctx.translate(1248, 0); //重新定位右上角为基准 - ctx.rotate(Math.PI / 2); //旋转90度 - ctx.drawImage(img, 0, 0, 2028, 1248); - ctx.restore(); //重置画布设置 - show = !show; - } - } - } - } else { - const pageupbox = makeBox([200, 1110], [200, 100]); - const pagedownbox = makeBox([1600, 1110], [200, 100]); - const imagebox0 = makeBox([75, 150], [600, 450]); - const imagebox1 = makeBox([725, 150], [600, 450]); - const imagebox2 = makeBox([1300, 150], [600, 450]); - const imagebox3 = makeBox([75, 650], [600, 450]); - const imagebox4 = makeBox([725, 650], [600, 450]); - const imagebox5 = makeBox([1375, 650], [600, 450]); - if (inRect(pos, pagedownbox)) { - if (page < this.UIMx.length - 1) { - page++; - core.clearMap(ctx); - this.update(); - } - } else if (inRect(pos, pageupbox)) { - if (page > 0) { - page--; - core.clearMap(ctx); - this.update(); - } - } else if (inRect(pos, imagebox0)) { - if (this.cgs.includes(this.UIMx[page][0][0])) { - const img = core.material.images.images[this.UIMx[page][0][0]]; - if (img) { - ctx.drawImage(img, 0, 0, 2028, 1248); - show = !show; - } - } - } else if (inRect(pos, imagebox1)) { - if (this.cgs.includes(this.UIMx[page][0][1])) { - const img = core.material.images.images[this.UIMx[page][0][1]]; - if (img) { - ctx.drawImage(img, 0, 0, 2028, 1248); - show = !show; - } - } - } else if (inRect(pos, imagebox2)) { - if (this.cgs.includes(this.UIMx[page][0][2])) { - const img = core.material.images.images[this.UIMx[page][0][2]]; - if (img) { - ctx.drawImage(img, 0, 0, 2028, 1248); - show = !show; - } - } - } else if (inRect(pos, imagebox3)) { - if (this.cgs.includes(this.UIMx[page][1][0])) { - const img = core.material.images.images[this.UIMx[page][1][0]]; - if (img) { - ctx.drawImage(img, 0, 0, 2028, 1248); - show = !show; - } - } - } else if (inRect(pos, imagebox4)) { - if (this.cgs.includes(this.UIMx[page][1][1])) { - const img = core.material.images.images[this.UIMx[page][1][1]]; - if (img) { - ctx.drawImage(img, 0, 0, 2028, 1248); - show = !show; - } - } - } else if (inRect(pos, imagebox5)) { - if (this.cgs.includes(this.UIMx[page][1][2])) { - const img = core.material.images.images[this.UIMx[page][1][2]]; - if (img) { - ctx.drawImage(img, 0, 0, 2028, 1248); - show = !show; - } - } - } - } - } - drawUI() { - //绘制页面 - core.clearMap(CGUI); - const bgVertical = core.material.images.images["bg_2010.webp"]; //竖屏背景 - const bg = core.material.images.images["bg_5043.webp"]; //横屏背景 + const imagebox3 = makeBox([650, 200], [560, 420]); + const imagebox4 = makeBox([650, 750], [560, 420]); + const imagebox5 = makeBox([650, 1300], [560, 420]); + if (inRect(pos, pagedownbox)) { + //2代表当前最大页数-1 + if (page < this.UIMx.length - 1) { + page++; + core.clearMap(ctx); + this.update(); + } + } else if (inRect(pos, pageupbox)) { + if (page > 0) { + page--; + core.clearMap(ctx); + this.update(); + } + } else if (inRect(pos, imagebox0)) { + if (this.cgs.includes(this.UIMx[page][0][0])) { + const img = core.material.images.images[this.UIMx[page][0][0]]; + if (img) { + ctx.save(); //保存设置 + ctx.translate(1248, 0); //重新定位右上角为基准 + ctx.rotate(Math.PI / 2); //旋转90度 + ctx.drawImage(img, 0, 0, 2028, 1248); + ctx.restore(); //重置画布设置 + show = !show; + } + } + } else if (inRect(pos, imagebox1)) { + if (this.cgs.includes(this.UIMx[page][0][1])) { + const img = core.material.images.images[this.UIMx[page][0][1]]; + if (img) { + ctx.save(); //保存设置 + ctx.translate(1248, 0); //重新定位右上角为基准 + ctx.rotate(Math.PI / 2); //旋转90度 + ctx.drawImage(img, 0, 0, 2028, 1248); + ctx.restore(); //重置画布设置 + show = !show; + } + } + } else if (inRect(pos, imagebox2)) { + if (this.cgs.includes(this.UIMx[page][0][2])) { + const img = core.material.images.images[this.UIMx[page][0][2]]; + if (img) { + ctx.save(); //保存设置 + ctx.translate(1248, 0); //重新定位右上角为基准 + ctx.rotate(Math.PI / 2); //旋转90度 + ctx.drawImage(img, 0, 0, 2028, 1248); + ctx.restore(); //重置画布设置 + show = !show; + } + } + } else if (inRect(pos, imagebox3)) { + if (this.cgs.includes(this.UIMx[page][1][0])) { + const img = core.material.images.images[this.UIMx[page][1][0]]; + if (img) { + ctx.save(); //保存设置 + ctx.translate(1248, 0); //重新定位右上角为基准 + ctx.rotate(Math.PI / 2); //旋转90度 + ctx.drawImage(img, 0, 0, 2028, 1248); + ctx.restore(); //重置画布设置 + show = !show; + } + } + } else if (inRect(pos, imagebox4)) { + if (this.cgs.includes(this.UIMx[page][1][1])) { + const img = core.material.images.images[this.UIMx[page][1][1]]; + if (img) { + ctx.save(); //保存设置 + ctx.translate(1248, 0); //重新定位右上角为基准 + ctx.rotate(Math.PI / 2); //旋转90度 + ctx.drawImage(img, 0, 0, 2028, 1248); + ctx.restore(); //重置画布设置 + show = !show; + } + } + } else if (inRect(pos, imagebox5)) { + if (this.cgs.includes(this.UIMx[page][1][2])) { + const img = core.material.images.images[this.UIMx[page][1][2]]; + if (img) { + ctx.save(); //保存设置 + ctx.translate(1248, 0); //重新定位右上角为基准 + ctx.rotate(Math.PI / 2); //旋转90度 + ctx.drawImage(img, 0, 0, 2028, 1248); + ctx.restore(); //重置画布设置 + show = !show; + } + } + } + } else { + const pageupbox = makeBox([200, 1110], [200, 100]); + const pagedownbox = makeBox([1600, 1110], [200, 100]); + const imagebox0 = makeBox([75, 150], [600, 450]); + const imagebox1 = makeBox([725, 150], [600, 450]); + const imagebox2 = makeBox([1300, 150], [600, 450]); + const imagebox3 = makeBox([75, 650], [600, 450]); + const imagebox4 = makeBox([725, 650], [600, 450]); + const imagebox5 = makeBox([1375, 650], [600, 450]); + if (inRect(pos, pagedownbox)) { + if (page < this.UIMx.length - 1) { + page++; + core.clearMap(ctx); + this.update(); + } + } else if (inRect(pos, pageupbox)) { + if (page > 0) { + page--; + core.clearMap(ctx); + this.update(); + } + } else if (inRect(pos, imagebox0)) { + if (this.cgs.includes(this.UIMx[page][0][0])) { + const img = core.material.images.images[this.UIMx[page][0][0]]; + if (img) { + ctx.drawImage(img, 0, 0, 2028, 1248); + show = !show; + } + } + } else if (inRect(pos, imagebox1)) { + if (this.cgs.includes(this.UIMx[page][0][1])) { + const img = core.material.images.images[this.UIMx[page][0][1]]; + if (img) { + ctx.drawImage(img, 0, 0, 2028, 1248); + show = !show; + } + } + } else if (inRect(pos, imagebox2)) { + if (this.cgs.includes(this.UIMx[page][0][2])) { + const img = core.material.images.images[this.UIMx[page][0][2]]; + if (img) { + ctx.drawImage(img, 0, 0, 2028, 1248); + show = !show; + } + } + } else if (inRect(pos, imagebox3)) { + if (this.cgs.includes(this.UIMx[page][1][0])) { + const img = core.material.images.images[this.UIMx[page][1][0]]; + if (img) { + ctx.drawImage(img, 0, 0, 2028, 1248); + show = !show; + } + } + } else if (inRect(pos, imagebox4)) { + if (this.cgs.includes(this.UIMx[page][1][1])) { + const img = core.material.images.images[this.UIMx[page][1][1]]; + if (img) { + ctx.drawImage(img, 0, 0, 2028, 1248); + show = !show; + } + } + } else if (inRect(pos, imagebox5)) { + if (this.cgs.includes(this.UIMx[page][1][2])) { + const img = core.material.images.images[this.UIMx[page][1][2]]; + if (img) { + ctx.drawImage(img, 0, 0, 2028, 1248); + show = !show; + } + } + } + } + } + drawUI() { + //绘制页面 + core.clearMap(CGUI); + const bgVertical = core.material.images.images["bg_2010.webp"]; //竖屏背景 + const bg = core.material.images.images["bg_5043.webp"]; //横屏背景 - if (core.domStyle.isVertical) { - //竖屏 + if (core.domStyle.isVertical) { + //竖屏 - core.fillRect(ctx, 0, 0, 1248, 2028, "#000000"); //黑色背景 - ctx.globalAlpha = 0.5; //透明度 - if (bgVertical) - ctx.drawImage(bgVertical, 0, 0, 1280, 1500, 0, 0, 1248, 2028); //绘制半透明背景图片 - ctx.globalAlpha = 1; //恢复为不透明 + core.fillRect(ctx, 0, 0, 1248, 2028, "#000000"); //黑色背景 + ctx.globalAlpha = 0.5; //透明度 + if (bgVertical) + ctx.drawImage(bgVertical, 0, 0, 1280, 1500, 0, 0, 1248, 2028); //绘制半透明背景图片 + ctx.globalAlpha = 1; //恢复为不透明 - core.setTextAlign(ctx, "center"); - core.fillBoldText1( - ctx, - "◀离开", - 100, - 110, - "#FFFFFF", - "#000000", - 6, - core.ui._buildFont(66, true) - ); + core.setTextAlign(ctx, "center"); + core.fillBoldText1( + ctx, + "◀离开", + 100, + 110, + "#FFFFFF", + "#000000", + 6, + core.ui._buildFont(66, true) + ); - core.fillBoldText1( - ctx, - "上一页", - 300, - 1900, - page === 0 ? "#444444" : "#FFFFFF", - "#000000", - 6, - core.ui._buildFont(66, true) - ); + core.fillBoldText1( + ctx, + "上一页", + 300, + 1900, + page === 0 ? "#444444" : "#FFFFFF", + "#000000", + 6, + core.ui._buildFont(66, true) + ); - core.fillBoldText1( - ctx, - page + 1 + "/" + this.UIMx.length, - 650, - 1900, - "#FFFFFF", - "#000000", - 6, - core.ui._buildFont(66, true) - ); - core.fillBoldText1( - ctx, - "下一页", - 1000, - 1900, - page === this.UIMx.length - 1 ? "#444444" : "#FFFFFF", - "#000000", - 6, - core.ui._buildFont(66, true) - ); - // 添加向上翻页和向下翻页的按钮 + core.fillBoldText1( + ctx, + page + 1 + "/" + this.UIMx.length, + 650, + 1900, + "#FFFFFF", + "#000000", + 6, + core.ui._buildFont(66, true) + ); + core.fillBoldText1( + ctx, + "下一页", + 1000, + 1900, + page === this.UIMx.length - 1 ? "#444444" : "#FFFFFF", + "#000000", + 6, + core.ui._buildFont(66, true) + ); + // 添加向上翻页和向下翻页的按钮 - // 添加3*2个4:3的画框,及图片 - for (let i = 0; i < 3; i++) { - for (let j = 0; j < 2; j++) { - const img = core.material.images.images[this.UIMx[page][j][i]]; - core.strokeRect( - ctx, - 50 + j * 600, - 200 + i * 550, - 560, - 420, - "#444444", - 5 - ); - if (this.cgs.includes(this.UIMx[page][j][i])) { - if (img) - ctx.drawImage( - img, - 50 + j * 600 + 15, - 200 + i * 550 + 15, - 560 - 30, - 420 - 30 - ); - } else { - ctx.fillStyle = "#000000"; - ctx.fillRect( - 50 + j * 600 + 15, - 200 + i * 550 + 15, - 560 - 30, - 420 - 30 - ); - const img = core.material.images.images["LOGO.webp"]; - if (img) - ctx.drawImage( - img, - 50 + j * 600 + 15, - 200 + i * 550 + 15, - 560 - 30, - 420 - 30 - ); - } - } - } - } else { - //横屏 - core.fillRect(ctx, 0, 0, 2028, 1248, "#000000"); //黑色背景 - ctx.globalAlpha = 0.5; //透明度 - if (bg) ctx.drawImage(bg, 0, 0, 1280, 720, 0, 0, 2028, 1248); //绘制半透明背景图片 - ctx.globalAlpha = 1; //恢复为不透明 + // 添加3*2个4:3的画框,及图片 + for (let i = 0; i < 3; i++) { + for (let j = 0; j < 2; j++) { + const img = core.material.images.images[this.UIMx[page][j][i]]; + core.strokeRect( + ctx, + 50 + j * 600, + 200 + i * 550, + 560, + 420, + "#444444", + 5 + ); + if (this.cgs.includes(this.UIMx[page][j][i])) { + if (img) + ctx.drawImage( + img, + 50 + j * 600 + 15, + 200 + i * 550 + 15, + 560 - 30, + 420 - 30 + ); + } else { + ctx.fillStyle = "#000000"; + ctx.fillRect( + 50 + j * 600 + 15, + 200 + i * 550 + 15, + 560 - 30, + 420 - 30 + ); + const img = core.material.images.images["LOGO.webp"]; + if (img) + ctx.drawImage( + img, + 50 + j * 600 + 15, + 200 + i * 550 + 15, + 560 - 30, + 420 - 30 + ); + } + } + } + } else { + //横屏 + core.fillRect(ctx, 0, 0, 2028, 1248, "#000000"); //黑色背景 + ctx.globalAlpha = 0.5; //透明度 + if (bg) ctx.drawImage(bg, 0, 0, 1280, 720, 0, 0, 2028, 1248); //绘制半透明背景图片 + ctx.globalAlpha = 1; //恢复为不透明 - core.setTextAlign(ctx, "center"); - core.fillBoldText1( - ctx, - "◀离开", - 110, - 100, - "#FFFFFF", - "#000000", - 6, - core.ui._buildFont(66, true) - ); + core.setTextAlign(ctx, "center"); + core.fillBoldText1( + ctx, + "◀离开", + 110, + 100, + "#FFFFFF", + "#000000", + 6, + core.ui._buildFont(66, true) + ); - // 添加向上翻页和向下翻页的按钮 - core.fillBoldText1( - ctx, - "上一页", - 300, - 1180, - page === 0 ? "#444444" : "#FFFFFF", - "#000000", - 6, - core.ui._buildFont(66, true) - ); + // 添加向上翻页和向下翻页的按钮 + core.fillBoldText1( + ctx, + "上一页", + 300, + 1180, + page === 0 ? "#444444" : "#FFFFFF", + "#000000", + 6, + core.ui._buildFont(66, true) + ); - core.fillBoldText1( - ctx, - page + 1 + "/" + this.UIMx.length, - 1000, - 1180, - "#FFFFFF", - "#000000", - 6, - core.ui._buildFont(66, true) - ); - core.fillBoldText1( - ctx, - "下一页", - 1700, - 1180, - page === this.UIMx.length - 1 ? "#444444" : "#FFFFFF", - "#000000", - 6, - core.ui._buildFont(66, true) - ); + core.fillBoldText1( + ctx, + page + 1 + "/" + this.UIMx.length, + 1000, + 1180, + "#FFFFFF", + "#000000", + 6, + core.ui._buildFont(66, true) + ); + core.fillBoldText1( + ctx, + "下一页", + 1700, + 1180, + page === this.UIMx.length - 1 ? "#444444" : "#FFFFFF", + "#000000", + 6, + core.ui._buildFont(66, true) + ); - // 添加3*2个4:3的画框 - for (let i = 0; i < 2; i++) { - for (let j = 0; j < 3; j++) { - core.strokeRect( - ctx, - 75 + j * 650, - 150 + i * 500, - 600, - 450, - "#444444", - 2 - ); - if (this.cgs.includes(this.UIMx[page][i][j])) { - const img = core.material.images.images[this.UIMx[page][i][j]]; - if (img) - ctx.drawImage( - img, - 75 + j * 650 + 15, - 150 + i * 500 + 15, - 600 - 30, - 450 - 30 - ); - } else { - ctx.fillStyle = "#000000"; - ctx.fillRect( - 75 + j * 650 + 15, - 150 + i * 500 + 15, - 600 - 30, - 450 - 30 - ); - const img = core.material.images.images["LOGO.webp"]; - if (img) - ctx.drawImage( - img, - 75 + j * 650 + 15, - 150 + i * 500 + 15, - 600 - 30, - 450 - 30 - ); - } - } - } - } - } - } - this.setcgs = function (img) { - const a = core.getLocalStorage("cgs", []); - if (img) { - if (!a.includes(img)) a.push(img); - core.setLocalStorage("cgs", a); - } else core.setLocalStorage("cgs"); - }; - core.ui.CG = new CG(); - main.dom.CGMode.onclick = function () { - //点击开始页面的CG MODE进入cg回廊 - main.core.control.checkBgm(); - page = 0; - main.core.ui.CG.cgs = core.getLocalStorage("cgs", []); - CGUI.style.display = "block"; - main.core.ui.CG.update(); - }; -}, + // 添加3*2个4:3的画框 + for (let i = 0; i < 2; i++) { + for (let j = 0; j < 3; j++) { + core.strokeRect( + ctx, + 75 + j * 650, + 150 + i * 500, + 600, + 450, + "#444444", + 2 + ); + if (this.cgs.includes(this.UIMx[page][i][j])) { + const img = core.material.images.images[this.UIMx[page][i][j]]; + if (img) + ctx.drawImage( + img, + 75 + j * 650 + 15, + 150 + i * 500 + 15, + 600 - 30, + 450 - 30 + ); + } else { + ctx.fillStyle = "#000000"; + ctx.fillRect( + 75 + j * 650 + 15, + 150 + i * 500 + 15, + 600 - 30, + 450 - 30 + ); + const img = core.material.images.images["LOGO.webp"]; + if (img) + ctx.drawImage( + img, + 75 + j * 650 + 15, + 150 + i * 500 + 15, + 600 - 30, + 450 - 30 + ); + } + } + } + } + } + } + this.setcgs = function (img) { + const a = core.getLocalStorage("cgs", []); + if (img) { + if (!a.includes(img)) a.push(img); + core.setLocalStorage("cgs", a); + } else core.setLocalStorage("cgs"); + }; + core.ui.CG = new CG(); + main.dom.CGMode.onclick = function () { + //点击开始页面的CG MODE进入cg回廊 + main.core.control.checkBgm(); + page = 0; + main.core.ui.CG.cgs = core.getLocalStorage("cgs", []); + CGUI.style.display = "block"; + main.core.ui.CG.update(); + }; + }, "光标设置": function () { // 在此增加新插件 this.changeMouse = function ( @@ -15214,902 +14994,901 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 = }; }, "剧情cg": function () { - // 在此增加新插件 - // 在此增加新插件 - const cg = document.createElement("canvas"); //cg画布设置 - cg.style.position = "absolute"; - cg.style.zIndex = 300; - cg.style.display = "none"; - cg.id = "cgText"; - main.dom.gameGroup.insertAdjacentElement("afterend", cg); - cg.style.top = "50%"; - cg.style.left = "50%"; - cg.style.transform = "translate(-50%,-50%)"; - const ctx = cg.getContext("2d"); - main.dom.cgText = cg; - const logcanvas = document.createElement("canvas"); //cg画布设置 - logcanvas.style.position = "absolute"; - logcanvas.style.zIndex = 301; - logcanvas.style.display = "none"; - logcanvas.id = "cgText"; - main.dom.gameGroup.insertAdjacentElement("afterend", logcanvas); - logcanvas.style.top = "50%"; - logcanvas.style.left = "50%"; - logcanvas.style.transform = "translate(-50%,-50%)"; - const logctx = logcanvas.getContext("2d"); - main.dom.logcanvas = logcanvas; - logcanvas.onmouseup = function (e) { - //鼠标抬起 + // 在此增加新插件 + // 在此增加新插件 + const cg = document.createElement("canvas"); //cg画布设置 + cg.style.position = "absolute"; + cg.style.zIndex = 300; + cg.style.display = "none"; + cg.id = "cgText"; + main.dom.gameGroup.insertAdjacentElement("afterend", cg); + cg.style.top = "50%"; + cg.style.left = "50%"; + cg.style.transform = "translate(-50%,-50%)"; + const ctx = cg.getContext("2d"); + main.dom.cgText = cg; + const logcanvas = document.createElement("canvas"); //cg画布设置 + logcanvas.style.position = "absolute"; + logcanvas.style.zIndex = 301; + logcanvas.style.display = "none"; + logcanvas.id = "cgText"; + main.dom.gameGroup.insertAdjacentElement("afterend", logcanvas); + logcanvas.style.top = "50%"; + logcanvas.style.left = "50%"; + logcanvas.style.transform = "translate(-50%,-50%)"; + const logctx = logcanvas.getContext("2d"); + main.dom.logcanvas = logcanvas; + logcanvas.onmouseup = function (e) { + //鼠标抬起 - try { - if (!core.isPlaying()) return false; - core.unregisterAnimationFrame("skip"); - let a = core.getFlag("skip", false); - core.setFlag("skip", false); - if (a) { - const data = core.clone(core.status.event.data.current); + try { + if (!core.isPlaying()) return false; + core.unregisterAnimationFrame("skip"); + let a = core.getFlag("skip", false); + core.setFlag("skip", false); + if (a) { + const data = core.clone(core.status.event.data.current); - core.insertAction(data); - core.doAction(); - } - } catch (ee) { - console.error(ee); - } - }; - logcanvas.onmousedown = function (e) { - //鼠标按下 - try { - if (!core.isPlaying()) return false; - const left = core.dom.gameGroup.offsetLeft; - const top = core.dom.gameGroup.offsetTop; - const px = Math.floor((e.clientX - left) / core.domStyle.scale), - py = Math.floor((e.clientY - top) / core.domStyle.scale); - core.ui.cgText.click(px * 3, py * 3); - } catch (ee) { - main.log(ee); - } - }; - logcanvas.ontouchend = function (e) { - //触摸抬起 + core.insertAction(data); + core.doAction(); + } + } catch (ee) { + console.error(ee); + } + }; + logcanvas.onmousedown = function (e) { + //鼠标按下 + try { + if (!core.isPlaying()) return false; + const left = core.dom.gameGroup.offsetLeft; + const top = core.dom.gameGroup.offsetTop; + const px = Math.floor((e.clientX - left) / core.domStyle.scale), + py = Math.floor((e.clientY - top) / core.domStyle.scale); + core.ui.cgText.click(px * 3, py * 3); + } catch (ee) { + main.log(ee); + } + }; + logcanvas.ontouchend = function (e) { + //触摸抬起 - try { - if (!core.isPlaying()) return false; - core.unregisterAnimationFrame("skip"); - core.setFlag("skip", false); - let a = core.getFlag("skip", false); - core.setFlag("skip", false); - if (a) { - const data = core.clone(core.status.event.data.current); + try { + if (!core.isPlaying()) return false; + core.unregisterAnimationFrame("skip"); + core.setFlag("skip", false); + let a = core.getFlag("skip", false); + core.setFlag("skip", false); + if (a) { + const data = core.clone(core.status.event.data.current); - core.insertAction(data); - core.doAction(); - } - } catch (ee) {} - }; - logcanvas.ontouchstart = function (e) { - //触摸按下 - try { - if (!core.isPlaying()) return false; - const left = core.dom.gameGroup.offsetLeft; - const top = core.dom.gameGroup.offsetTop; - const px = Math.floor( - (e.targetTouches[0].clientX - left) / core.domStyle.scale - ), - py = Math.floor( - (e.targetTouches[0].clientY - top) / core.domStyle.scale - ); - core.ui.cgText.click(px * 3, py * 3); - } catch (ee) { - main.log(ee); - } - }; - cg.onmouseup = function (e) { - //鼠标抬起 + core.insertAction(data); + core.doAction(); + } + } catch (ee) {} + }; + logcanvas.ontouchstart = function (e) { + //触摸按下 + try { + if (!core.isPlaying()) return false; + const left = core.dom.gameGroup.offsetLeft; + const top = core.dom.gameGroup.offsetTop; + const px = Math.floor( + (e.targetTouches[0].clientX - left) / core.domStyle.scale + ), + py = Math.floor( + (e.targetTouches[0].clientY - top) / core.domStyle.scale + ); + core.ui.cgText.click(px * 3, py * 3); + } catch (ee) { + main.log(ee); + } + }; + cg.onmouseup = function (e) { + //鼠标抬起 - try { - if (!core.isPlaying()) return false; - core.unregisterAnimationFrame("skip"); - let a = core.getFlag("skip", false); - core.setFlag("skip", false); - if (a) { - const data = core.clone(core.status.event.data.current); + try { + if (!core.isPlaying()) return false; + core.unregisterAnimationFrame("skip"); + let a = core.getFlag("skip", false); + core.setFlag("skip", false); + if (a) { + const data = core.clone(core.status.event.data.current); - core.insertAction(data); - core.doAction(); - } - } catch (ee) { - console.error(ee); - } - }; - cg.onmousedown = function (e) { - //鼠标按下 - try { - if (!core.isPlaying()) return false; - const left = core.dom.gameGroup.offsetLeft; - const top = core.dom.gameGroup.offsetTop; - const px = Math.floor((e.clientX - left) / core.domStyle.scale), - py = Math.floor((e.clientY - top) / core.domStyle.scale); - core.ui.cgText.click(px * 3, py * 3); - } catch (ee) { - main.log(ee); - } - }; - cg.ontouchend = function (e) { - //触摸抬起 + core.insertAction(data); + core.doAction(); + } + } catch (ee) { + console.error(ee); + } + }; + cg.onmousedown = function (e) { + //鼠标按下 + try { + if (!core.isPlaying()) return false; + const left = core.dom.gameGroup.offsetLeft; + const top = core.dom.gameGroup.offsetTop; + const px = Math.floor((e.clientX - left) / core.domStyle.scale), + py = Math.floor((e.clientY - top) / core.domStyle.scale); + core.ui.cgText.click(px * 3, py * 3); + } catch (ee) { + main.log(ee); + } + }; + cg.ontouchend = function (e) { + //触摸抬起 - try { - if (!core.isPlaying()) return false; - core.unregisterAnimationFrame("skip"); - core.setFlag("skip", false); - let a = core.getFlag("skip", false); - core.setFlag("skip", false); - if (a) { - const data = core.clone(core.status.event.data.current); + try { + if (!core.isPlaying()) return false; + core.unregisterAnimationFrame("skip"); + core.setFlag("skip", false); + let a = core.getFlag("skip", false); + core.setFlag("skip", false); + if (a) { + const data = core.clone(core.status.event.data.current); - core.insertAction(data); - core.doAction(); - } - } catch (ee) { - console.error(ee); - } - }; - cg.ontouchstart = function (e) { - //触摸按下 - try { - if (!core.isPlaying()) return false; - const left = core.dom.gameGroup.offsetLeft; - const top = core.dom.gameGroup.offsetTop; - const px = Math.floor( - (e.targetTouches[0].clientX - left) / core.domStyle.scale - ), - py = Math.floor( - (e.targetTouches[0].clientY - top) / core.domStyle.scale - ); - core.ui.cgText.click(px * 3, py * 3); - } catch (ee) { - main.log(ee); - } - }; - let auto = false; + core.insertAction(data); + core.doAction(); + } + } catch (ee) { + console.error(ee); + } + }; + cg.ontouchstart = function (e) { + //触摸按下 + try { + if (!core.isPlaying()) return false; + const left = core.dom.gameGroup.offsetLeft; + const top = core.dom.gameGroup.offsetTop; + const px = Math.floor( + (e.targetTouches[0].clientX - left) / core.domStyle.scale + ), + py = Math.floor( + (e.targetTouches[0].clientY - top) / core.domStyle.scale + ); + core.ui.cgText.click(px * 3, py * 3); + } catch (ee) { + main.log(ee); + } + }; + let auto = false; - class cgText { - constructor() { - //绘制需要的变量 - this.image = ""; - this.head = { name: "face_050445.webp", px: -300 }; - this.bodyList = [ - { name: "tati_050145a.webp", px: 100, filter: false }, - { name: "tati_120124.webp", px: 1100, filter: true }, - ]; - this.name = ""; - this.text = ""; - this.time = 0; - this.WindowSkin = false; - this.sound = ""; - this.beforeSound = 0; - this.wait = 1000; - this.memory = false; - this.textList = []; - this.page = 1; - this.overpage = 1; - this.log = false; - this.index = 0; - } - click(px, py) { - //点击效果 + class cgText { + constructor() { + //绘制需要的变量 + this.image = ""; + this.head = { name: "face_050445.webp", px: -300 }; + this.bodyList = [ + { name: "tati_050145a.webp", px: 100, filter: false }, + { name: "tati_120124.webp", px: 1100, filter: true }, + ]; + this.name = ""; + this.text = ""; + this.time = 0; + this.WindowSkin = false; + this.sound = ""; + this.beforeSound = 0; + this.wait = 1000; + this.memory = false; + this.textList = []; + this.page = 1; + this.overpage = 1; + this.log = false; + this.index = 0; + } + click(px, py) { + //点击效果 - const makeBox = ([x, y], [w, h]) => { - return [ - [x, y], - [x + w, y + h], - ]; - }; - const inRect = ([x, y], [ - [sx, sy], - [dx, dy] - ]) => { - return sx <= x && x <= dx && sy <= y && y <= dy; - }; - const pos = [px, py]; - const savebox = makeBox([1700, 1100], [192, 96]); - const saveboxVertical = makeBox([52, 1700], [96, 192]); - const skipbox = makeBox([1700, 1000], [192, 96]); - const skipboxVertical = makeBox([152, 1700], [96, 192]); - const autobox = makeBox([1700, 900], [192, 96]); - const autoboxVertical = makeBox([252, 1700], [96, 192]); - const textbox = makeBox([1700, 800], [192, 96]); - const textboxVertical = makeBox([352, 1700], [96, 192]); - const backbox = makeBox([15, 35], [210, 90]); - const backboxVertical = makeBox([1123, 15], [90, 210]); - const pageupbox = makeBox([300, 1130], [200, 100]); - const pageupboxVertical = makeBox([18, 300], [100, 200]); - const pagedownbox = makeBox([1500, 1130], [200, 100]); - const pagedownboxVertical = makeBox([18, 1500], [100, 200]); - if (this.log) { - if ( - (core.domStyle.isVertical && inRect(pos, backboxVertical)) || - (!core.domStyle.isVertical && inRect(pos, backbox)) - ) { - core.clearMap(logctx); - main.dom.logcanvas.style.display = "none"; - this.log = false; - } else if ( - (core.domStyle.isVertical && inRect(pos, pageupboxVertical)) || - (!core.domStyle.isVertical && inRect(pos, pageupbox)) - ) { - core.clearMap(logctx); - if (this.page > 1) this.page--; - this.logdraw(this.page); - } else if ( - (core.domStyle.isVertical && inRect(pos, pagedownboxVertical)) || - (!core.domStyle.isVertical && inRect(pos, pagedownbox)) - ) { - core.clearMap(logctx); - if (this.page < this.overpage) this.page++; - this.logdraw(this.page); - } - } else { - if ( - (core.domStyle.isVertical && - inRect(pos, skipboxVertical) && - !this.WindowSkin) || - (!core.domStyle.isVertical && - !this.WindowSkin && - inRect(pos, skipbox)) - ) { - auto = false; - let time = 0; - core.stopSound(this.beforeSound); - core.registerAnimationFrame("skip", true, (timestamp) => { - if (timestamp > time + 50) { - time = timestamp; - if ( - core.status.event.id == "action" && - core.status.event.data.type == "cgtext" - ) { - core.setFlag("skip", true); - main.dom.cgText.style.display = "none"; - core.doAction(); - } - } - }); - } else if ( - (core.domStyle.isVertical && - inRect(pos, textboxVertical) && - !this.WindowSkin) || - (!core.domStyle.isVertical && - !this.WindowSkin && - inRect(pos, textbox)) - ) { - auto = false; - this.log = true; - this.overpage = Math.floor(this.index / 6) + 1; - this.page = this.overpage; - logcanvas.style.display = "block"; - const data = core.clone(core.status.event.data.current); - data.showAll = true; - data.time = 0; - data.text = this.text.replaceAll(/(\\(z))(\[.*?\])?/g, ""); //去除打字机暂停效果 - data.sound = ""; - core.insertAction(data); - core.doAction(); - this.logdraw(this.page); - } else if ( - (core.domStyle.isVertical && - inRect(pos, autoboxVertical) && - !this.WindowSkin) || - (!core.domStyle.isVertical && - !this.WindowSkin && - inRect(pos, autobox)) - ) { - auto = !auto; + const makeBox = ([x, y], [w, h]) => { + return [ + [x, y], + [x + w, y + h], + ]; + }; + const inRect = ([x, y], [[sx, sy], [dx, dy]]) => { + return sx <= x && x <= dx && sy <= y && y <= dy; + }; + const pos = [px, py]; + const savebox = makeBox([1700, 1100], [192, 96]); + const saveboxVertical = makeBox([52, 1700], [96, 192]); + const skipbox = makeBox([1700, 1000], [192, 96]); + const skipboxVertical = makeBox([152, 1700], [96, 192]); + const autobox = makeBox([1700, 900], [192, 96]); + const autoboxVertical = makeBox([252, 1700], [96, 192]); + const textbox = makeBox([1700, 800], [192, 96]); + const textboxVertical = makeBox([352, 1700], [96, 192]); + const backbox = makeBox([15, 35], [210, 90]); + const backboxVertical = makeBox([1123, 15], [90, 210]); + const pageupbox = makeBox([300, 1130], [200, 100]); + const pageupboxVertical = makeBox([18, 300], [100, 200]); + const pagedownbox = makeBox([1500, 1130], [200, 100]); + const pagedownboxVertical = makeBox([18, 1500], [100, 200]); + if (this.log) { + if ( + (core.domStyle.isVertical && inRect(pos, backboxVertical)) || + (!core.domStyle.isVertical && inRect(pos, backbox)) + ) { + core.clearMap(logctx); + main.dom.logcanvas.style.display = "none"; + this.log = false; + } else if ( + (core.domStyle.isVertical && inRect(pos, pageupboxVertical)) || + (!core.domStyle.isVertical && inRect(pos, pageupbox)) + ) { + core.clearMap(logctx); + if (this.page > 1) this.page--; + this.logdraw(this.page); + } else if ( + (core.domStyle.isVertical && inRect(pos, pagedownboxVertical)) || + (!core.domStyle.isVertical && inRect(pos, pagedownbox)) + ) { + core.clearMap(logctx); + if (this.page < this.overpage) this.page++; + this.logdraw(this.page); + } + } else { + if ( + (core.domStyle.isVertical && + inRect(pos, skipboxVertical) && + !this.WindowSkin) || + (!core.domStyle.isVertical && + !this.WindowSkin && + inRect(pos, skipbox)) + ) { + auto = false; + let time = 0; + core.stopSound(this.beforeSound); + core.registerAnimationFrame("skip", true, (timestamp) => { + if (timestamp > time + 50) { + time = timestamp; + if ( + core.status.event.id == "action" && + core.status.event.data.type == "cgtext" + ) { + core.setFlag("skip", true); + main.dom.cgText.style.display = "none"; + core.doAction(); + } + } + }); + } else if ( + (core.domStyle.isVertical && + inRect(pos, textboxVertical) && + !this.WindowSkin) || + (!core.domStyle.isVertical && + !this.WindowSkin && + inRect(pos, textbox)) + ) { + auto = false; + this.log = true; + this.overpage = Math.floor(this.index / 6) + 1; + this.page = this.overpage; + logcanvas.style.display = "block"; + const data = core.clone(core.status.event.data.current); + data.showAll = true; + data.time = 0; + data.text = this.text.replaceAll(/(\\(z))(\[.*?\])?/g, ""); //去除打字机暂停效果 + data.sound = ""; + core.insertAction(data); + core.doAction(); + this.logdraw(this.page); + } else if ( + (core.domStyle.isVertical && + inRect(pos, autoboxVertical) && + !this.WindowSkin) || + (!core.domStyle.isVertical && + !this.WindowSkin && + inRect(pos, autobox)) + ) { + auto = !auto; - const data = core.clone(core.status.event.data.current); - data.showAll = true; - data.time = 0; - data.text = this.text.replaceAll(/(\\(z))(\[.*?\])?/g, ""); //去除打字机暂停效果 - data.sound = ""; - core.insertAction(data); - core.doAction(); - } else if ( - (core.domStyle.isVertical && - inRect(pos, saveboxVertical) && - !this.WindowSkin) || - (!core.domStyle.isVertical && - !this.WindowSkin && - inRect(pos, savebox)) - ) { - //存档 - auto = false; - if (core.status.event.animateUI) return; - if (core.status.event.interval != null) return; - const current = core.clone(core.status.event.data.current); - current.showAll = true; - current.time = 0; - current.sound = ""; - current.text = this.text.replaceAll(/(\\(z))(\[.*?\])?/g, ""); //去除当前事件所有打字机效果 - cg.style.display = "none"; - const data = [{ type: "callSave" }, current]; //插入存档事件 - core.insertAction(data); + const data = core.clone(core.status.event.data.current); + data.showAll = true; + data.time = 0; + data.text = this.text.replaceAll(/(\\(z))(\[.*?\])?/g, ""); //去除打字机暂停效果 + data.sound = ""; + core.insertAction(data); + core.doAction(); + } else if ( + (core.domStyle.isVertical && + inRect(pos, saveboxVertical) && + !this.WindowSkin) || + (!core.domStyle.isVertical && + !this.WindowSkin && + inRect(pos, savebox)) + ) { + //存档 + auto = false; + if (core.status.event.animateUI) return; + if (core.status.event.interval != null) return; + const current = core.clone(core.status.event.data.current); + current.showAll = true; + current.time = 0; + current.sound = ""; + current.text = this.text.replaceAll(/(\\(z))(\[.*?\])?/g, ""); //去除当前事件所有打字机效果 + cg.style.display = "none"; + const data = [{ type: "callSave" }, current]; //插入存档事件 + core.insertAction(data); - core.doAction(); - } else if (!core.status.event.data) { - cg.style.display = "none"; - core.ui._animateUI("hide", null, () => { - core.doAction(); - }); - } else { - // 正在淡入淡出的话不执行 - if (core.status.event.animateUI) return; - auto = false; + core.doAction(); + } else if (!core.status.event.data) { + cg.style.display = "none"; + core.ui._animateUI("hide", null, () => { + core.doAction(); + }); + } else { + // 正在淡入淡出的话不执行 + if (core.status.event.animateUI) return; + auto = false; - // 打字机效果显示全部文字 - if (core.status.event.interval != null) { - const data = core.clone(core.status.event.data?.current); - data.showAll = true; - data.time = 0; - data.text = this.text.replaceAll(/(\\(z))(\[.*?\])?/g, ""); //去除打字机暂停效果 - data.sound = ""; - core.insertAction(data); - core.doAction(); - return; - } else { - core.stopSound(this.beforeSound); - } + // 打字机效果显示全部文字 + if (core.status.event.interval != null) { + const data = core.clone(core.status.event.data?.current); + data.showAll = true; + data.time = 0; + data.text = this.text.replaceAll(/(\\(z))(\[.*?\])?/g, ""); //去除打字机暂停效果 + data.sound = ""; + core.insertAction(data); + core.doAction(); + return; + } else { + core.stopSound(this.beforeSound); + } - cg.style.display = "none"; - core.ui._animateUI("hide", null, () => { - core.doAction(); - }); - } - } - } + cg.style.display = "none"; + core.ui._animateUI("hide", null, () => { + core.doAction(); + }); + } + } + } - drawTextContent(ctx, content, config) { - //绘制多行文字并执行打字机效果 + drawTextContent(ctx, content, config) { + //绘制多行文字并执行打字机效果 - ctx = core.getContextByName(ctx); - // 设置默认配置项 - var textAttribute = - core.status.textAttribute || core.initStatus.textAttribute; - var globalAttribute = - core.status.globalAttribute || core.initStatus.globalAttribute; - config = core.clone(config || {}); - config.left = config.left || 0; - config.right = - config.left + (config.maxWidth == null ? core._PX_ : config.maxWidth); - config.top = config.top || 0; - config.color = core.arrayToRGBA(config.color || textAttribute.text); - if (config.bold == null) config.bold = textAttribute.bold; - config.italic = config.italic || false; - config.align = config.align || textAttribute.align || "left"; - config.fontSize = config.fontSize || textAttribute.textfont; - config.lineHeight = config.lineHeight || config.fontSize * 1.3; - config.defaultFont = config.font = config.font || globalAttribute.font; - config.time = config.time || 0; - config.letterSpacing = - config.letterSpacing == null ? - textAttribute.letterSpacing || 0 : - config.letterSpacing; + ctx = core.getContextByName(ctx); + // 设置默认配置项 + var textAttribute = + core.status.textAttribute || core.initStatus.textAttribute; + var globalAttribute = + core.status.globalAttribute || core.initStatus.globalAttribute; + config = core.clone(config || {}); + config.left = config.left || 0; + config.right = + config.left + (config.maxWidth == null ? core._PX_ : config.maxWidth); + config.top = config.top || 0; + config.color = core.arrayToRGBA(config.color || textAttribute.text); + if (config.bold == null) config.bold = textAttribute.bold; + config.italic = config.italic || false; + config.align = config.align || textAttribute.align || "left"; + config.fontSize = config.fontSize || textAttribute.textfont; + config.lineHeight = config.lineHeight || config.fontSize * 1.3; + config.defaultFont = config.font = config.font || globalAttribute.font; + config.time = config.time || 0; + config.letterSpacing = + config.letterSpacing == null + ? textAttribute.letterSpacing || 0 + : config.letterSpacing; - config.index = 0; - config.currcolor = config.color; - config.currfont = config.fontSize; - config.lineMargin = Math.max( - Math.round(config.fontSize / 4), - config.lineHeight - config.fontSize - ); - config.topMargin = parseInt(config.lineMargin / 2); - config.lineMaxHeight = config.lineMargin + config.fontSize; - config.offsetX = 0; - config.offsetY = 0; - config.line = 0; - config.blocks = []; - config.isHD = ctx == null || ctx.canvas.hasAttribute("isHD"); + config.index = 0; + config.currcolor = config.color; + config.currfont = config.fontSize; + config.lineMargin = Math.max( + Math.round(config.fontSize / 4), + config.lineHeight - config.fontSize + ); + config.topMargin = parseInt(config.lineMargin / 2); + config.lineMaxHeight = config.lineMargin + config.fontSize; + config.offsetX = 0; + config.offsetY = 0; + config.line = 0; + config.blocks = []; + config.isHD = ctx == null || ctx.canvas.hasAttribute("isHD"); - // 创建一个新的临时画布 - var tempCtx = document.createElement("canvas").getContext("2d"); - if (config.isHD && ctx) { - core.maps._setHDCanvasSize( - tempCtx, - ctx.canvas.width, - ctx.canvas.height - ); - } else { - tempCtx.canvas.width = ctx == null ? 1 : ctx.canvas.width; - tempCtx.canvas.height = ctx == null ? 1 : ctx.canvas.height; - } + // 创建一个新的临时画布 + var tempCtx = document.createElement("canvas").getContext("2d"); + if (config.isHD && ctx) { + core.maps._setHDCanvasSize( + tempCtx, + ctx.canvas.width, + ctx.canvas.height + ); + } else { + tempCtx.canvas.width = ctx == null ? 1 : ctx.canvas.width; + tempCtx.canvas.height = ctx == null ? 1 : ctx.canvas.height; + } - tempCtx.textBaseline = "top"; - tempCtx.font = core.ui._buildFont( - config.fontSize, - config.bold, - config.italic, - config.font - ); - tempCtx.fillStyle = config.color; - config = this._drawTextContent_draw(ctx, tempCtx, content, config); - return config; - } - _drawTextContent_draw(ctx, tempCtx, content, config) { - // Step 1: 绘制到tempCtx上,并记录下图块信息 - while (core.ui._drawTextContent_next(tempCtx, content, config)); + tempCtx.textBaseline = "top"; + tempCtx.font = core.ui._buildFont( + config.fontSize, + config.bold, + config.italic, + config.font + ); + tempCtx.fillStyle = config.color; + config = this._drawTextContent_draw(ctx, tempCtx, content, config); + return config; + } + _drawTextContent_draw(ctx, tempCtx, content, config) { + // Step 1: 绘制到tempCtx上,并记录下图块信息 + while (core.ui._drawTextContent_next(tempCtx, content, config)); - if (ctx == null) return config; + if (ctx == null) return config; - // Step 2: 从tempCtx绘制到画布上 - config.index = 0; - var _drawNext = function () { - if (config.index >= config.blocks.length) return false; - var block = config.blocks[config.index++]; - if (block != null) { - // It works, why? - const scale = config.isHD ? - devicePixelRatio * core.domStyle.scale : - 1; - ctx.restore(); - ctx.save(); //保存设置 - if (core.domStyle.isVertical) { - ctx.translate(1248, 0); //重新定位右上角为基准 - ctx.rotate(Math.PI / 2); //旋转90度 - } - ctx.drawImage( - tempCtx.canvas, - block.left * scale, - block.top * scale, - block.width * scale, - block.height * scale, - config.left + block.left + block.marginLeft, - config.top + block.top + block.marginTop, - block.width, - block.height - ); - ctx.restore(); - } - return true; - }; + // Step 2: 从tempCtx绘制到画布上 + config.index = 0; + var _drawNext = function () { + if (config.index >= config.blocks.length) return false; + var block = config.blocks[config.index++]; + if (block != null) { + // It works, why? + const scale = config.isHD + ? devicePixelRatio * core.domStyle.scale + : 1; + ctx.restore(); + ctx.save(); //保存设置 + if (core.domStyle.isVertical) { + ctx.translate(1248, 0); //重新定位右上角为基准 + ctx.rotate(Math.PI / 2); //旋转90度 + } + ctx.drawImage( + tempCtx.canvas, + block.left * scale, + block.top * scale, + block.width * scale, + block.height * scale, + config.left + block.left + block.marginLeft, + config.top + block.top + block.marginTop, + block.width, + block.height + ); + ctx.restore(); + } + return true; + }; - if (config.time == 0) { - while (_drawNext()); + if (config.time == 0) { + while (_drawNext()); - if ( - (auto && !core.ui.cgText.WindowSkin && !core.ui.cgText.sound) || - (core.ui.cgText.sound && !core.musicStatus.soundStatus) - ) { - setTimeout(() => { - if (auto) { - cg.style.display = "none"; - core.ui._animateUI("hide", null, () => { - core.doAction(); - }); - } - }, core.ui.cgText.wait); - } - } else { - clearInterval(core.status.event.interval); - core.status.event.interval = setInterval(function () { - if (!_drawNext()) { - clearInterval(core.status.event.interval); - core.status.event.interval = null; + if ( + (auto && !core.ui.cgText.WindowSkin && !core.ui.cgText.sound) || + (core.ui.cgText.sound && !core.musicStatus.soundStatus) + ) { + setTimeout(() => { + if (auto) { + cg.style.display = "none"; + core.ui._animateUI("hide", null, () => { + core.doAction(); + }); + } + }, core.ui.cgText.wait); + } + } else { + clearInterval(core.status.event.interval); + core.status.event.interval = setInterval(function () { + if (!_drawNext()) { + clearInterval(core.status.event.interval); + core.status.event.interval = null; - if ( - (auto && !core.ui.cgText.WindowSkin && !core.ui.cgText.sound) || - (core.ui.cgText.sound && !core.musicStatus.soundStatus) - ) - setTimeout(() => { - if (auto) { - cg.style.display = "none"; - core.ui._animateUI("hide", null, () => { - core.doAction(); - }); - } - }, core.ui.cgText.wait); - } - }, config.time); - } + if ( + (auto && !core.ui.cgText.WindowSkin && !core.ui.cgText.sound) || + (core.ui.cgText.sound && !core.musicStatus.soundStatus) + ) + setTimeout(() => { + if (auto) { + cg.style.display = "none"; + core.ui._animateUI("hide", null, () => { + core.doAction(); + }); + } + }, core.ui.cgText.wait); + } + }, config.time); + } - return config; - } + return config; + } - update() { - this.background(); - if (this.log) this.logdraw(this.page); - } - logdraw(page) { - if (core.domStyle.isVertical) { - logctx.canvas.width = 1248; - logctx.canvas.height = 2028; - logctx.save(); //保存设置 - logctx.translate(1248, 0); //重新定位右上角为基准 - logctx.rotate(Math.PI / 2); //旋转90度 - } else { - logctx.canvas.width = 2028; - logctx.canvas.height = 1248; - } - core.fillRect(logctx, 0, 0, 2028, 1248, "rgba(0,0,0,0.5)"); - core.setTextAlign(logctx, "center"); - core.fillBoldText1( - logctx, - "◀离开", - 110, - 100, - "#FFFFFF", - "#000000", - 6, - core.ui._buildFont(66, true) - ); - logctx.strokeStyle = "#FFFFFF"; - logctx.lineWidth = 3; - logctx.beginPath(); - logctx.moveTo(100, 150); - logctx.lineTo(1928, 150); + update() { + this.background(); + if (this.log) this.logdraw(this.page); + } + logdraw(page) { + if (core.domStyle.isVertical) { + logctx.canvas.width = 1248; + logctx.canvas.height = 2028; + logctx.save(); //保存设置 + logctx.translate(1248, 0); //重新定位右上角为基准 + logctx.rotate(Math.PI / 2); //旋转90度 + } else { + logctx.canvas.width = 2028; + logctx.canvas.height = 1248; + } + core.fillRect(logctx, 0, 0, 2028, 1248, "rgba(0,0,0,0.5)"); + core.setTextAlign(logctx, "center"); + core.fillBoldText1( + logctx, + "◀离开", + 110, + 100, + "#FFFFFF", + "#000000", + 6, + core.ui._buildFont(66, true) + ); + logctx.strokeStyle = "#FFFFFF"; + logctx.lineWidth = 3; + logctx.beginPath(); + logctx.moveTo(100, 150); + logctx.lineTo(1928, 150); - logctx.stroke(); - let posy = 150; - const indexList = this.textList; - core.setTextAlign(logctx, "left"); - for ( - let i = (page - 1) * 6; i <= Math.min(this.index, page * 6 - 1); i++ - ) { - const text = this.textList[i][1].replaceAll( - /(\\(d|e|f|g|i|n|r|b|c|t|z))(\[.*?\])?/g, - "" - ); //取消打字机 - const name = this.textList[i][0] ? - "【" + this.textList[i][0] + "】" : - ""; - if (name) { - core.fillBoldText1( - logctx, - name, - 150, - posy + 50, - "#FFFFFF", - "#000000", - 6, - core.ui._buildFont(42, true) - ); - } - if (text.length < 30) { - core.fillBoldText1( - logctx, - text, - 650, - posy + 50, - "#FFFFFF", - "#000000", - 6, - core.ui._buildFont(42, true) - ); - } else { - let text1 = text.slice(0, 30); - core.fillBoldText1( - logctx, - text1, - 650, - posy + 50, - "#FFFFFF", - "#000000", - 6, - core.ui._buildFont(42, true) - ); - if (text.length > 60) { - let text2 = text.slice(30, 60); - let text3 = text.slice(60); - core.fillBoldText1( - logctx, - text2, - 650, - posy + 100, - "#FFFFFF", - "#000000", - 6, - core.ui._buildFont(42, true) - ); - core.fillBoldText1( - logctx, - text3, - 650, - posy + 150, - "#FFFFFF", - "#000000", - 6, - core.ui._buildFont(42, true) - ); - } else { - let text2 = text.slice(30); - core.fillBoldText1( - logctx, - text2, - 650, - posy + 100, - "#FFFFFF", - "#000000", - 6, - core.ui._buildFont(42, true) - ); - } - } + logctx.stroke(); + let posy = 150; + const indexList = this.textList; + core.setTextAlign(logctx, "left"); + for ( + let i = (page - 1) * 6; + i <= Math.min(this.index, page * 6 - 1); + i++ + ) { + const text = this.textList[i][1].replaceAll( + /(\\(d|e|f|g|i|n|r|b|c|t|z))(\[.*?\])?/g, + "" + ); //取消打字机 + const name = this.textList[i][0] + ? "【" + this.textList[i][0] + "】" + : ""; + if (name) { + core.fillBoldText1( + logctx, + name, + 150, + posy + 50, + "#FFFFFF", + "#000000", + 6, + core.ui._buildFont(42, true) + ); + } + if (text.length < 30) { + core.fillBoldText1( + logctx, + text, + 650, + posy + 50, + "#FFFFFF", + "#000000", + 6, + core.ui._buildFont(42, true) + ); + } else { + let text1 = text.slice(0, 30); + core.fillBoldText1( + logctx, + text1, + 650, + posy + 50, + "#FFFFFF", + "#000000", + 6, + core.ui._buildFont(42, true) + ); + if (text.length > 60) { + let text2 = text.slice(30, 60); + let text3 = text.slice(60); + core.fillBoldText1( + logctx, + text2, + 650, + posy + 100, + "#FFFFFF", + "#000000", + 6, + core.ui._buildFont(42, true) + ); + core.fillBoldText1( + logctx, + text3, + 650, + posy + 150, + "#FFFFFF", + "#000000", + 6, + core.ui._buildFont(42, true) + ); + } else { + let text2 = text.slice(30); + core.fillBoldText1( + logctx, + text2, + 650, + posy + 100, + "#FFFFFF", + "#000000", + 6, + core.ui._buildFont(42, true) + ); + } + } - logctx.strokeStyle = "#FFFFFF"; - logctx.lineWidth = 3; - logctx.beginPath(); - logctx.moveTo(100, posy); - logctx.lineTo(1928, posy); - logctx.stroke(); + logctx.strokeStyle = "#FFFFFF"; + logctx.lineWidth = 3; + logctx.beginPath(); + logctx.moveTo(100, posy); + logctx.lineTo(1928, posy); + logctx.stroke(); - posy += 160; - } - logctx.beginPath(); - logctx.moveTo(100, 1120); - logctx.lineTo(1928, 1120); - logctx.moveTo(100, 1110); - logctx.lineTo(1928, 1110); - logctx.stroke(); - core.fillBoldText1( - logctx, - "上一页", - 300, - 1200, - page === 1 ? "#444444" : "#FFFFFF", - "#000000", - 6, - core.ui._buildFont(66, true) - ); + posy += 160; + } + logctx.beginPath(); + logctx.moveTo(100, 1120); + logctx.lineTo(1928, 1120); + logctx.moveTo(100, 1110); + logctx.lineTo(1928, 1110); + logctx.stroke(); + core.fillBoldText1( + logctx, + "上一页", + 300, + 1200, + page === 1 ? "#444444" : "#FFFFFF", + "#000000", + 6, + core.ui._buildFont(66, true) + ); - core.fillBoldText1( - logctx, - page + "/" + this.overpage, - 1000, - 1200, - "#FFFFFF", - "#000000", - 6, - core.ui._buildFont(66, true) - ); - core.fillBoldText1( - logctx, - "下一页", - 1500, - 1200, - page === this.overpage ? "#444444" : "#FFFFFF", - "#000000", - 6, - core.ui._buildFont(66, true) - ); - } - background() { - const img = core.material.images.images?.[this.image]; + core.fillBoldText1( + logctx, + page + "/" + this.overpage, + 1000, + 1200, + "#FFFFFF", + "#000000", + 6, + core.ui._buildFont(66, true) + ); + core.fillBoldText1( + logctx, + "下一页", + 1500, + 1200, + page === this.overpage ? "#444444" : "#FFFFFF", + "#000000", + 6, + core.ui._buildFont(66, true) + ); + } + background() { + const img = core.material.images.images?.[this.image]; - if (core.domStyle.isVertical) { - ctx.canvas.width = 1248; - ctx.canvas.height = 2028; - ctx.save(); //保存设置 - ctx.translate(1248, 0); //重新定位右上角为基准 - ctx.rotate(Math.PI / 2); //旋转90度 - } else { - ctx.canvas.width = 2028; - ctx.canvas.height = 1248; - } + if (core.domStyle.isVertical) { + ctx.canvas.width = 1248; + ctx.canvas.height = 2028; + ctx.save(); //保存设置 + ctx.translate(1248, 0); //重新定位右上角为基准 + ctx.rotate(Math.PI / 2); //旋转90度 + } else { + ctx.canvas.width = 2028; + ctx.canvas.height = 1248; + } - if (img) { - //绘制背景 - if (this.memory) ctx.filter = "sepia(50%)"; - ctx.drawImage(img, 0, 0, 2028, 1248); - ctx.filter = "none"; - } else { - core.fillRect(ctx, 0, 0, 2028, 1248); - } - this.bodyList.forEach((v) => { - //绘制立绘 - const body = core.material.images.images?.[v.name]; - if (v.filter) ctx.filter = "brightness(50%)"; - if (body) { - if (!v.w && !v.h && !v.scale) v.scale = 1.7; - if (!v.w && !v.h) { - ctx.drawImage( - body, - 0, - 0, - body.width, - body.height, - v.px, - 1248 - body.height * v.scale, - body.width * v.scale, - body.height * v.scale - ); - } else { - ctx.drawImage( - body, - 0, - 0, - body.width, - body.height, - v.px, - 1248 - (v.h ?? body.height), - v.w ?? body.width, - v.h ?? body.height - ); - } - } - ctx.filter = "none"; - }); - if (core.isPlaying() && !this.WindowSkin) - core.drawWindowSkin( - "winskin.webp", - ctx, - 30, - 780, - 1968, - 436, - null, - null, - null, - 3 - ); //绘制对话框 - const head = core.material.images.images?.[this.head.name]; - if (head) { - //绘制头像 - ctx.drawImage( - head, - 0, - 0, - head.width, - head.height, - this.head.px, - 1248 - head.height * 2.2, - head.width * 2.2, - head.height * 2.2 - ); - } - if (core.isPlaying() && !this.WindowSkin) { - core.drawWindowSkin( - "winskin.webp", - ctx, - 1700, - 800, - 192, - 96, - null, - null, - null, - 3 - ); - core.fillBoldText1( - ctx, - "记 录", - 1736, - 866, - "#FFFFFF", - "#000000", - 6, - "bold 48px Verdana" - ); - core.drawWindowSkin( - "winskin.webp", - ctx, - 1700, - 1100, - 192, - 96, - null, - null, - null, - 3 - ); - core.fillBoldText1( - ctx, - "存 档", - 1736, - 1166, - "#FFFFFF", - "#000000", - 6, - "bold 48px Verdana" - ); - core.drawWindowSkin( - "winskin.webp", - ctx, - 1700, - 1000, - 192, - 96, - null, - null, - null, - 3 - ); - core.fillBoldText1( - ctx, - "▶▶", - 1756, - 1066, - "#FFFFFF", - "#000000", - 6, - "bold 48px Verdana" - ); - core.drawWindowSkin( - "winskin.webp", - ctx, - 1700, - 900, - 192, - 96, - null, - null, - null, - 3 - ); - let autoText = "AUTO"; - if (auto) autoText = "STOP"; - core.fillBoldText1( - ctx, - autoText, - 1722, - 966, - "#FFFFFF", - "#000000", - 6, - "bold 48px Verdana" - ); - } - if (this.name) - core.fillBoldText1( - ctx, - `【${this.name}】`, - 550, - 880, - "#FFFFFF", - "#000000", - 6, - "bold 48px Verdana" - ); //绘制名字 + if (img) { + //绘制背景 + if (this.memory) ctx.filter = "sepia(50%)"; + ctx.drawImage(img, 0, 0, 2028, 1248); + ctx.filter = "none"; + } else { + core.fillRect(ctx, 0, 0, 2028, 1248); + } + this.bodyList.forEach((v) => { + //绘制立绘 + const body = core.material.images.images?.[v.name]; + if (v.filter) ctx.filter = "brightness(50%)"; + if (body) { + if (!v.w && !v.h && !v.scale) v.scale = 1.7; + if (!v.w && !v.h) { + ctx.drawImage( + body, + 0, + 0, + body.width, + body.height, + v.px, + 1248 - body.height * v.scale, + body.width * v.scale, + body.height * v.scale + ); + } else { + ctx.drawImage( + body, + 0, + 0, + body.width, + body.height, + v.px, + 1248 - (v.h ?? body.height), + v.w ?? body.width, + v.h ?? body.height + ); + } + } + ctx.filter = "none"; + }); + if (core.isPlaying() && !this.WindowSkin) + core.drawWindowSkin( + "winskin.webp", + ctx, + 30, + 780, + 1968, + 436, + null, + null, + null, + 3 + ); //绘制对话框 + const head = core.material.images.images?.[this.head.name]; + if (head) { + //绘制头像 + ctx.drawImage( + head, + 0, + 0, + head.width, + head.height, + this.head.px, + 1248 - head.height * 2.2, + head.width * 2.2, + head.height * 2.2 + ); + } + if (core.isPlaying() && !this.WindowSkin) { + core.drawWindowSkin( + "winskin.webp", + ctx, + 1700, + 800, + 192, + 96, + null, + null, + null, + 3 + ); + core.fillBoldText1( + ctx, + "记 录", + 1736, + 866, + "#FFFFFF", + "#000000", + 6, + "bold 48px Verdana" + ); + core.drawWindowSkin( + "winskin.webp", + ctx, + 1700, + 1100, + 192, + 96, + null, + null, + null, + 3 + ); + core.fillBoldText1( + ctx, + "存 档", + 1736, + 1166, + "#FFFFFF", + "#000000", + 6, + "bold 48px Verdana" + ); + core.drawWindowSkin( + "winskin.webp", + ctx, + 1700, + 1000, + 192, + 96, + null, + null, + null, + 3 + ); + core.fillBoldText1( + ctx, + "▶▶", + 1756, + 1066, + "#FFFFFF", + "#000000", + 6, + "bold 48px Verdana" + ); + core.drawWindowSkin( + "winskin.webp", + ctx, + 1700, + 900, + 192, + 96, + null, + null, + null, + 3 + ); + let autoText = "AUTO"; + if (auto) autoText = "STOP"; + core.fillBoldText1( + ctx, + autoText, + 1722, + 966, + "#FFFFFF", + "#000000", + 6, + "bold 48px Verdana" + ); + } + if (this.name) + core.fillBoldText1( + ctx, + `【${this.name}】`, + 550, + 880, + "#FFFFFF", + "#000000", + 6, + "bold 48px Verdana" + ); //绘制名字 - if ( - this.sound && - core.sounds && - !core.getFlag("skip", false) && - core.musicStatus.soundStatus - ) { - this.beforeSound = core.playSound(this.sound, null, () => { - if ( - this.sound && - auto && - !this.WindowSkin && - core.musicStatus.soundStatus - ) { - setTimeout(() => { - if (auto) { - cg.style.display = "none"; - core.ui._animateUI("hide", null, () => { - core.doAction(); - }); - } - }, this.wait); - } - }); - } - if (this.text && !core.getFlag("skip", false)) { - //绘制对话 - this.drawTextContent(ctx, this.text, { - left: 550, - top: 950, - bold: true, - color: "#FFFFFF", - align: "left", - fontSize: 48, - time: this.time || 0, - font: "Verdana", - maxWidth: 1000, - }); - } + if ( + this.sound && + core.sounds && + !core.getFlag("skip", false) && + core.musicStatus.soundStatus + ) { + this.beforeSound = core.playSound(this.sound, null, () => { + if ( + this.sound && + auto && + !this.WindowSkin && + core.musicStatus.soundStatus + ) { + setTimeout(() => { + if (auto) { + cg.style.display = "none"; + core.ui._animateUI("hide", null, () => { + core.doAction(); + }); + } + }, this.wait); + } + }); + } + if (this.text && !core.getFlag("skip", false)) { + //绘制对话 + this.drawTextContent(ctx, this.text, { + left: 550, + top: 950, + bold: true, + color: "#FFFFFF", + align: "left", + fontSize: 48, + time: this.time || 0, + font: "Verdana", + maxWidth: 1000, + }); + } - ctx.restore(); - } - } - core.ui.cgText = new cgText(); -}, + ctx.restore(); + } + } + core.ui.cgText = new cgText(); + }, "旁白": function () { // 在此增加新插件 const over = document.createElement("canvas"); //over画布设置 @@ -18096,7 +17875,6 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 = music.loop = "loop"; core.material.bgms[name] = music;*/ }; - }, "横屏切换": function () { // 在此增加新插件 @@ -18168,210 +17946,214 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 = }; }, "帧动画特效(游戏界面)": function () { - // 在此增加新插件 - const animate2 = document.createElement("canvas"); //画布设置 - animate2.style.zIndex = 91; - animate2.id = "animate2"; - animate2.classList.add("gameCanvas", "anti-aliasing"); - animate2.style.display = "block"; - animate2.width = 416; - animate2.height = 416; - animate2.style.width = core.__PIXELS__ * core.domStyle.scale + "px"; - animate2.style.height = core.__PIXELS__ * core.domStyle.scale + "px"; - main.dom.animate2 = animate2; - const anctx = animate2.getContext("2d"); - - main.dom.gameDraw.appendChild(animate2); - - core.plugin.playing = new Set(); - - this.setanimate = function ( - name, - px, - py, - width, - height, - allFarme, - imageList, - soundList - ) { - const data = { - px: px, - py: py, - width: width, - height: height, - allFarme: allFarme, - imageList: imageList, - soundList: soundList, - }; - core.setFlag("animate_" + name, data); - }; - this.deleteanimate = function (name) { - core.setFlag("animate_" + name); - }; - let thistime = 0; - this.playanimate = function (name, x, y, hero, scalex, scaley) { - const data = { - name: name, - x: x, - y: y, - hero: hero, - scalex: scalex, - scaley: scaley, - farme: 0, - }; - - core.plugin.playing.add(data); - }; - core.registerAnimationFrame("animateonmap", true, function (timestamp) { - if (timestamp - thistime > 1000 / 60) { - thistime = timestamp; - core.clearMap(anctx); - core.plugin.playing.forEach((one) => { - const data = flags["animate_" + one.name]; - if (!data) { - core.plugin.playing.delete(one); - } else { - data.imageList.forEach(function (image) { - if ( - one.farme >= (image.beforefarme ?? 0) && - one.farme <= (image.afterfarme ?? data.allFarme) - ) { - const img = core.material.images.images?.[image.image]; - if (img) { - const gla = image.globalAlpha ?? 100; - const agla = image.aglobalAlpha ?? gla, - beforefarme = image.beforefarme ?? 0; - const afterfarme = image.afterfarme ?? data.allFarme; - - anctx.globalAlpha = - (gla + - ((agla - gla) * (one.farme - beforefarme)) / - (afterfarme - beforefarme || 1)) / - 100; - - const cx = - (image.cx ?? 0) + - (((image.acx ?? 0) - (image.cx ?? 0)) * - (one.farme - beforefarme)) / - (afterfarme - beforefarme || 1), - cy = - (image.cy ?? 0) + - (((image.acy ?? 0) - (image.cy ?? 0)) * - (one.farme - beforefarme)) / - (afterfarme - beforefarme || 1), - cw = - (image.cw ?? img.width) + - (((image.acw ?? img.width) - (image.cw ?? img.width)) * - (one.farme - beforefarme)) / - (afterfarme - beforefarme || 1), - ch = - (image.ch ?? img.height) + - (((image.acw ?? img.height) - (image.cw ?? img.height)) * - (one.farme - beforefarme)) / - (afterfarme - beforefarme || 1), - x = - (image.x ?? 0) + - (((image.ax ?? 0) - (image.x ?? 0)) * - (one.farme - beforefarme)) / - (afterfarme - beforefarme || 1), - y = - (image.y ?? 0) + - (((image.ay ?? 0) - (image.y ?? 0)) * - (one.farme - beforefarme)) / - (afterfarme - beforefarme || 1), - w = - (image.w ?? one.width) + - (((image.aw ?? one.width) - (image.w ?? one.width)) * - (one.farme - beforefarme)) / - (afterfarme - beforefarme || 1), - h = - (image.h ?? one.height) + - (((image.aw ?? one.height) - (image.w ?? one.height)) * - (one.farme - beforefarme)) / - (afterfarme - beforefarme || 1), - angle = - (Math.PI * - ((image.image.angle ?? 0) + - (((image.aangle ?? 0) - (image.image.angle ?? 0)) * - (one.farme - beforefarme)) / - (afterfarme - beforefarme || 1))) / - 180; - - if (one.hero) { - let sx, sy; - if (core.status.heroMoving < 0) { - sx = 0; - sy = 0; - } else { - sx = - core.utils.scan[core.status.hero.loc.direction].x * - 4 * - core.status.heroMoving; - sy = - core.utils.scan[core.status.hero.loc.direction].y * - 4 * - core.status.heroMoving; - } - const herox = core.status.hero.loc.x * 32 + 16 + sx; - const heroy = core.status.hero.loc.y * 32 + 16 + sy; - core.drawImage( - anctx, - img, - cx, - cy, - cw, - ch, - herox + (x - data.px) * one.scalex, - heroy + (y - data.py) * one.scaley, - w * one.scalex, - h * one.scaley, - angle - ); - } else { - core.drawImage( - anctx, - img, - cx, - cy, - cw, - ch, - one.x + (x - data.px) * one.scalex, - one.y + (y - data.py) * one.scaley, - w * one.scalex, - h * one.scaley, - angle - ); - } - } - } - }); - data.soundList.forEach(function (sound) { - const lisen = - sound.sound && - core.sounds[sound.sound] && - core.musicStatus.soundStatus; - if (one.farme == sound.startfarme && lisen) { - if (sound.stopbefore) core.stopSound(); - core.playSound(sound.sound); - } - }); - one.farme++; - if (one.farme > data.allFarme) core.plugin.playing.delete(one); - } - }); - } - }); - }, - "intro&loop": function () { // 在此增加新插件 - this.introAndLoop = function (intro, time, loop) { - core.playBgm(intro); - setTimeout(() => { - core.playBgm(loop); - }, time * 1000); + const animate2 = document.createElement("canvas"); //画布设置 + animate2.style.zIndex = 91; + animate2.id = "animate2"; + animate2.classList.add("gameCanvas", "anti-aliasing"); + animate2.style.display = "block"; + animate2.width = 416; + animate2.height = 416; + animate2.style.width = core.__PIXELS__ * core.domStyle.scale + "px"; + animate2.style.height = core.__PIXELS__ * core.domStyle.scale + "px"; + main.dom.animate2 = animate2; + const anctx = animate2.getContext("2d"); + + main.dom.gameDraw.appendChild(animate2); + + core.plugin.playing = new Set(); + + this.setanimate = function ( + name, + px, + py, + width, + height, + allFarme, + imageList, + soundList + ) { + const data = { + px: px, + py: py, + width: width, + height: height, + allFarme: allFarme, + imageList: imageList, + soundList: soundList, + }; + core.setFlag("animate_" + name, data); }; + this.deleteanimate = function (name) { + core.setFlag("animate_" + name); + }; + let thistime = 0; + this.playanimate = function (name, x, y, hero, scalex, scaley, callback) { + const data = { + name: name, + x: x, + y: y, + hero: hero, + scalex: scalex, + scaley: scaley, + farme: 0, + callback + }; + + core.plugin.playing.add(data); + }; + core.registerAnimationFrame("animateonmap", true, function (timestamp) { + if (timestamp - thistime > 1000 / 60) { + thistime = timestamp; + core.clearMap(anctx); + core.plugin.playing.forEach((one) => { + const data = flags["animate_" + one.name]; + if (!data) { + core.plugin.playing.delete(one); + } else { + data.imageList.forEach(function (image) { + if ( + one.farme >= (image.beforefarme ?? 0) && + one.farme <= (image.afterfarme ?? data.allFarme) + ) { + const img = core.material.images.images?.[image.image]; + if (img) { + const gla = image.globalAlpha ?? 100; + const agla = image.aglobalAlpha ?? gla, + beforefarme = image.beforefarme ?? 0; + const afterfarme = image.afterfarme ?? data.allFarme; + + anctx.globalAlpha = + (gla + + ((agla - gla) * (one.farme - beforefarme)) / + (afterfarme - beforefarme || 1)) / + 100; + + const cx = + (image.cx ?? 0) + + (((image.acx ?? 0) - (image.cx ?? 0)) * + (one.farme - beforefarme)) / + (afterfarme - beforefarme || 1), + cy = + (image.cy ?? 0) + + (((image.acy ?? 0) - (image.cy ?? 0)) * + (one.farme - beforefarme)) / + (afterfarme - beforefarme || 1), + cw = + (image.cw ?? img.width) + + (((image.acw ?? img.width) - (image.cw ?? img.width)) * + (one.farme - beforefarme)) / + (afterfarme - beforefarme || 1), + ch = + (image.ch ?? img.height) + + (((image.acw ?? img.height) - (image.cw ?? img.height)) * + (one.farme - beforefarme)) / + (afterfarme - beforefarme || 1), + x = + (image.x ?? 0) + + (((image.ax ?? 0) - (image.x ?? 0)) * + (one.farme - beforefarme)) / + (afterfarme - beforefarme || 1), + y = + (image.y ?? 0) + + (((image.ay ?? 0) - (image.y ?? 0)) * + (one.farme - beforefarme)) / + (afterfarme - beforefarme || 1), + w = + (image.w ?? one.width) + + (((image.aw ?? one.width) - (image.w ?? one.width)) * + (one.farme - beforefarme)) / + (afterfarme - beforefarme || 1), + h = + (image.h ?? one.height) + + (((image.aw ?? one.height) - (image.w ?? one.height)) * + (one.farme - beforefarme)) / + (afterfarme - beforefarme || 1), + angle = + (Math.PI * + ((image.image.angle ?? 0) + + (((image.aangle ?? 0) - (image.image.angle ?? 0)) * + (one.farme - beforefarme)) / + (afterfarme - beforefarme || 1))) / + 180; + + if (one.hero) { + let sx, sy; + if (core.status.heroMoving < 0) { + sx = 0; + sy = 0; + } else { + sx = + core.utils.scan[core.status.hero.loc.direction].x * + 4 * + core.status.heroMoving; + sy = + core.utils.scan[core.status.hero.loc.direction].y * + 4 * + core.status.heroMoving; + } + const herox = core.status.hero.loc.x * 32 + 16 + sx; + const heroy = core.status.hero.loc.y * 32 + 16 + sy; + core.drawImage( + anctx, + img, + cx, + cy, + cw, + ch, + herox + (x - data.px) * one.scalex, + heroy + (y - data.py) * one.scaley, + w * one.scalex, + h * one.scaley, + angle + ); + } else { + core.drawImage( + anctx, + img, + cx, + cy, + cw, + ch, + one.x + (x - data.px) * one.scalex, + one.y + (y - data.py) * one.scaley, + w * one.scalex, + h * one.scaley, + angle + ); + } + } + } + }); + data.soundList.forEach(function (sound) { + const lisen = + sound.sound && + core.sounds[sound.sound] && + core.musicStatus.soundStatus; + if (one.farme == sound.startfarme && lisen) { + if (sound.stopbefore) core.stopSound(); + core.playSound(sound.sound); + } + }); + one.farme++; + if (one.farme > data.allFarme) { + core.plugin.playing.delete(one) + if (one.callback) { one.callback() } + }; + } + }); + } + }); }, + "intro&loop": function () { + // 在此增加新插件 + this.introAndLoop = function (intro, time, loop) { + core.playBgm(intro); + setTimeout(() => { + core.playBgm(loop); + }, time * 1000); + }; + }, "开局选项悬停": function () { // 在此增加新插件 @@ -18728,8 +18510,13 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 = oneTurn, enemyInfo, equipInfo, - farme + farme, + damageInfo ) { + let attack = false + if (heroInfo.isAttack) attack = true + if (enemyInfo.isAttack) attack = true + equipInfo.forEach(function (v) { if (v.isAttack) attack = true }) core.clearMap(ctx); let animate = Math.floor(farme / 30); core.fillRect(ctx, 64, 64, 288, 288, "rgba(0,0,0,0.5)"); @@ -18739,46 +18526,49 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 = ctx, hero.name, 127, - 123, + 128, "#FFFFFF", "#000000", - 'bold 14px pala' + "bold 14px pala" ); core.setTextAlign(ctx, "left"); - core.drawIcon(ctx, 'hp', 70, 190, 16, 16) - core.drawIcon(ctx, 'atk', 70, 210, 16, 16) - core.drawIcon(ctx, 'def', 70, 230, 16, 16) - core.drawIcon(ctx, 'I374', 70, 250, 16, 16) - core.drawIcon(ctx, 'I375', 70, 270, 16, 16) - core.drawIcon(ctx, 'mdef', 70, 290, 16, 16) - core.drawIcon(ctx, 'amulet', 70, 310, 16, 16) - core.drawIcon(ctx, 'jumpShoes', 70, 330, 16, 16) + core.drawIcon(ctx, "hp", 70, 190, 16, 16); + core.drawIcon(ctx, "atk", 70, 210, 16, 16); + core.drawIcon(ctx, "def", 70, 230, 16, 16); + core.drawIcon(ctx, "I374", 70, 250, 16, 16); + core.drawIcon(ctx, "I375", 70, 270, 16, 16); + core.drawIcon(ctx, "mdef", 70, 290, 16, 16); + core.drawIcon(ctx, "amulet", 70, 310, 16, 16); + core.drawIcon(ctx, "jumpShoes", 70, 330, 16, 16); core.fillBoldText( ctx, - '生命 ' + core.formatBigNumber(heroInfo.hp, true) + " / " + core.formatBigNumber(heroInfo.hpmax, true), + "生命 " + + core.formatBigNumber(heroInfo.hp, true) + + " / " + + core.formatBigNumber(heroInfo.hpmax, true), 90, 205, "#FFFFFF", "#000000", - 'bold 14px pala' + "bold 14px pala" ); core.fillBoldText( ctx, - '攻击 ' + core.formatBigNumber(heroInfo.atk), + "攻击 " + core.formatBigNumber(heroInfo.atk), 90, 225, "#FFFFFF", "#000000", - 'bold 14px pala' + "bold 14px pala" ); core.fillBoldText( ctx, - '防御 ' + core.formatBigNumber(heroInfo.def), + "防御 " + core.formatBigNumber(heroInfo.def), 90, 245, "#FFFFFF", "#000000", - 'bold 14px pala' + "bold 14px pala" ); core.fillBoldText( ctx, @@ -18787,43 +18577,51 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 = 265, "#FFFFFF", "#000000", - 'bold 14px pala' + "bold 14px pala" ); core.fillBoldText( ctx, - "法攻 " + core.formatBigNumber(heroInfo.matk / 100 * heroInfo.spell) + "(" + heroInfo.matk + "%)", + "法攻 " + + core.formatBigNumber((heroInfo.matk / 100) * heroInfo.spell) + + "(" + + heroInfo.matk + + "%)", 90, 285, "#FFFFFF", "#000000", - 'bold 14px pala' + "bold 14px pala" ); core.fillBoldText( ctx, - '护盾 ' + core.formatBigNumber(heroInfo.mdef / 100 * heroInfo.spell) + "(" + heroInfo.mdef + "%)", + "护盾 " + + core.formatBigNumber((heroInfo.mhp / 100) * heroInfo.spell) + + "(" + + heroInfo.mhp + + "%)", 90, 305, "#FFFFFF", "#000000", - 'bold 14px pala' + "bold 14px pala" ); core.fillBoldText( ctx, - '法抗 ' + heroInfo.spelldef + "%", + "法抗 " + heroInfo.mdef + "%", 90, 325, "#FFFFFF", "#000000", - 'bold 14px pala' + "bold 14px pala" ); core.fillBoldText( ctx, - '速度 ' + core.formatBigNumber(heroInfo.speed), + "速度 " + core.formatBigNumber(heroInfo.speed), 90, 345, "#FFFFFF", "#000000", - 'bold 14px pala' + "bold 14px pala" ); core.strokeRect(ctx, 112, 139, 32, 48, "rgba(255,255,255,1)", 1); @@ -18840,17 +18638,17 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 = 48 ); - core.setTextAlign(ctx, "center"); core.fillBoldText( ctx, enemyInfo.name, 289, - 123, + 128, "#FFFFFF", "#000000", - 'bold 14px pala' + "bold 14px pala" ); + core.setTextAlign(ctx, "right"); if (enemyInfo.cls === "enemys") { core.strokeRect(ctx, 272, 155, 32, 32, "rgba(255,255,255,1)", 1); @@ -18883,37 +18681,37 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 = 48 ); } - core.drawIcon(ctx, 'hp', 330, 190, 16, 16) - core.drawIcon(ctx, 'atk', 330, 210, 16, 16) - core.drawIcon(ctx, 'def', 330, 230, 16, 16) - core.drawIcon(ctx, 'amulet', 330, 250, 16, 16) - core.drawIcon(ctx, 'jumpShoes', 330, 270, 16, 16) + core.drawIcon(ctx, "hp", 330, 190, 16, 16); + core.drawIcon(ctx, "atk", 330, 210, 16, 16); + core.drawIcon(ctx, "def", 330, 230, 16, 16); + core.drawIcon(ctx, "amulet", 330, 250, 16, 16); + core.drawIcon(ctx, "jumpShoes", 330, 270, 16, 16); core.fillBoldText( ctx, - core.formatBigNumber(enemyInfo.hp, true) + ' 生命', + core.formatBigNumber(enemyInfo.hp, true) + " 生命", 330, 205, "#FFFFFF", "#000000", - 'bold 14px pala' + "bold 14px pala" ); core.fillBoldText( ctx, - core.formatBigNumber(enemyInfo.atk) + ' 攻击', + core.formatBigNumber(enemyInfo.atk) + " 攻击", 330, 225, "#FFFFFF", "#000000", - 'bold 14px pala' + "bold 14px pala" ); core.fillBoldText( ctx, - core.formatBigNumber(enemyInfo.def) + ' 防御', + core.formatBigNumber(enemyInfo.def) + " 防御", 330, 245, "#FFFFFF", "#000000", - 'bold 14px pala' + "bold 14px pala" ); core.fillBoldText( @@ -18923,7 +18721,7 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 = 265, "#FFFFFF", "#000000", - 'bold 14px pala' + "bold 14px pala" ); core.fillBoldText( ctx, @@ -18932,24 +18730,147 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 = 285, "#FFFFFF", "#000000", - 'bold 14px pala' + "bold 14px pala" ); - core.fillBoldText(ctx, + core.fillBoldText( + ctx, "V", 219, 163, "#FFFFFF", "#000000", - 'bold 48px pala') - core.fillBoldText(ctx, + "bold 48px pala" + ); + core.fillBoldText( + ctx, "s", 231, 163, "#FFFFFF", "#000000", - 'bold 36px pala') + "bold 36px pala" + ); + + if (!attack) enemyInfo.now += enemyInfo.speed / oneTurn * 215 + let enemynow = Math.min(100 + enemyInfo.now, 315) + ctx.fillStyle = "#FFFFFF" + ctx.beginPath() + ctx.moveTo(enemynow, 100) + ctx.lineTo(enemynow + 3, 90) + ctx.lineTo(enemynow - 3, 90) + ctx.closePath() + ctx.fill() + + if (enemyInfo.cls === "enemys") { + + + core.drawImage( + ctx, + core.getBlockInfo(enemyInfo.id).image, + 32, + core.getBlockInfo(enemyInfo.id).posY * 32, + 32, + 32, + enemynow - 16, + 64, + 32, + 32 + ); + } else { + + + core.drawImage( + ctx, + core.getBlockInfo(enemyInfo.id).image, + 32, + core.getBlockInfo(enemyInfo.id).posY * 48, + 32, + 19, + enemynow - 16, + 70, + 32, + 19 + ); + } + core.drawLine(ctx, 100, 105, 315, 105, '#FFFFFF', 5) + equipInfo.forEach(function (v) { + if (!attack) v.now += v.speed / oneTurn * 215 + let vnow = Math.min(100 + v.now, 315) + ctx.beginPath() + ctx.moveTo(vnow, 100) + ctx.lineTo(vnow + 3, 90) + ctx.lineTo(vnow - 3, 90) + ctx.closePath() + + ctx.fill() + + core.drawIcon(ctx, + v.id, + vnow - 16, + 64, + 32, + 32) + + }) + if (!attack) heroInfo.now += heroInfo.speed / oneTurn * 215 + let heronow = Math.min(100 + heroInfo.now, 315) + ctx.beginPath() + ctx.moveTo(heronow, 100) + ctx.lineTo(heronow + 3, 90) + ctx.lineTo(heronow - 3, 90) + ctx.closePath() + + ctx.fill() + console.log(heronow) + core.drawImage(ctx, + "hero.webp", + 0, + 0, + 32, + 19, + heronow - 16, + 70, + 32, + 19) + + if (heroInfo.now >= 215) { + heroInfo.isAttack = true; + animateOnAttack("sword", true, () => { + heroInfo.now -= 215 + heroInfo.isAttack = false + + }) + + } + if (enemyInfo.now >= 215) { + enemyInfo.isAttack = true + animateOnAttack("sword", false, () => { + enemyInfo.now -= 215 + enemyInfo.isAttack = false + + }) + } + equipInfo.forEach(v => { + if (v.now >= 215) { + v.isAttack = true + + animateOnAttack("sword", true, () => { + v.now -= 215 + v.isAttack = false + + }) + } + }) }; + function animateOnAttack(name, onenemy, callback) { + if (onenemy) { + core.playanimate(name, 290, 160, null, 1, 1, callback) + } else { + core.playanimate(name, 130, 160, null, 1, 1, callback) + } + } + this.attackAnimate = function ( enemyId, enemyInfo, @@ -18964,36 +18885,43 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 = hero_atk = core.getRealStatusOrDefault(hero, "atk"), hero_def = core.getRealStatusOrDefault(hero, "def"), hero_spell = core.getRealStatusOrDefault(hero, "spell"), - hero_matk = core.getRealStatusOrDefault(hero, "mdef"), + hero_matk = core.getRealStatusOrDefault(hero, "matk"), hero_mdef = core.getRealStatusOrDefault(hero, "mdef"), hero_speed = core.getRealStatusOrDefault(hero, "speed"), hero_hpmax = core.getRealStatusOrDefault(hero, "hpmax"), - hero_spelldef = core.getRealStatusOrDefault(hero, "spelldef"); + hero_mhp = core.getRealStatusOrDefault(hero, "mhp"); const heroInfo = { hp: hero_hp, hpmax: hero_hpmax, atk: hero_atk, def: hero_def, spell: hero_spell, - spelldef: hero_spelldef, + mhp: hero_mhp, matk: hero_matk, mdef: hero_mdef, speed: hero_speed, now: 0, + isAttack: false }; enemyInfo.id = enemyId; enemyInfo.cls = core.getClsFromId(enemyId); enemyInfo.name = core.material.enemys[enemyId].name; - + enemyInfo.now = 0; + enemyInfo.isAttack = false let oneTurn = heroInfo.speed + enemyInfo.speed; if (equipInfo.length > 0) { for (let i; i < equipInfo.length - 1; i++) { + equipInfo[i].now = 0 + equipInfo[i].isAttack = false oneTurn += equipInfo[i].speed; } } - oneTurn *= 100; + oneTurn *= 25; let time = 0, farme = 0; + + + core.registerAnimationFrame("attackAnimate", true, (temptime) => { if (temptime - time > 1000 / 60) { time = temptime; @@ -19002,7 +18930,8 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 = oneTurn, enemyInfo, equipInfo, - farme + farme, + damageInfo ); farme++; } @@ -19010,574 +18939,574 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 = }; }, "剧情内容": function () { - // 在此增加新插件 - // 每项为一个数组,第一项是名字,第二项是对话内容 - // 回放只会在同一个this下回放,进入剧情前请以事件块声明进入哪个剧情数组 - // 可以自由添加,但不能与已有插件及函数名相同,可以使用中文。 - this.chapter0 = [ - ["", "这些天,街道不曾下雨。"], - ["", "所以,那浸湿地面的,定是那些女孩们流落的鲜血无疑。"], - ["", "我蹲在充斥着铁锈味般恶臭的小巷中,悠闲地如是想着。"], - ["", "扑哧。"], - ["", "耳旁再次响起象征着某个女孩子死去的声音。"], - ["", "再一次——"], - ["", "再一次。"], - ["", "女子们被肢解成单纯的肉块。"], - ["", "我任由流下的血浸满全身,屏住自己的呼吸。"], - ["", "祈求自己能拥有从猎人手中逃脱的幸运。"], - ["", "扑哧。"], - ["", "直到刚才,我们还坐在去往娼馆的马车的路上。"], - ["", "而在这之中的某些人,已经不在这个世上了。"], - ["", "不,应该把“某些”换成“几乎所有”才更为恰当吧。"], - ["", "恐怕,不久之后我也会变成小巷中血腥的装饰品。"], - ["", "我是为了得到这种死法,才辛苦苟活至今的吗?"], - ["", "来个人告诉我啊——"], - ["", "谁都好。"], - ["", "来人啊!!"], - ["少女", "「呃······!?」"], - ["", "漆黑的物体充斥了我的整个视野"], - ["", "我很快意识到,那是只很大的脚。"], - ["", "必须要出声求救。"], - ["", "可是,耳中却只能听到自己的牙关不停交战的声音。"], - ["", "我是如此的无助。"], - ["", "逃跑也好,道歉也罢。"], - ["", "就连抬头看一眼将要杀掉我的人的面孔都做不到。"], - ["少女", "「······被杀」"], - ["", "会被杀。"], - ["", "会被杀!!"], - ["", "来自内心深处的冰冷预感,渐渐地在体内蔓延开来。"], - ["少女", "「不,不要······」"], - ["", "浮游都市,《诺瓦斯·艾蒂尔》。"], - ["", "《特别受灾地区》——"], - ["", "通称,《牢狱》"], - ["", "是被险峻的峭壁环绕,与世隔绝的,都市的最底部。"], - ["年轻人", "「放开我!」"], - ["年轻人", "「我只是在帮那个女人而已!」"], - ["年轻人", "「你们没听到吗!?」"], - ["年轻人", "「她是被受骗才会被卖到娼馆来的」"], - ["年轻人", "「用肮脏的手段把钱借给她父母的,就是你们这些家伙吧!?」"], - ["年轻人", "「给我说些什么啊」"], - ["凯伊姆", "「这些话等到了娼馆再说吧」"], - ["凯伊姆", "「我来抓你,只是受雇于人而已」"], - ["", "我走进娼馆《莉莉乌姆》的接待室。"], - ["", "正在桌旁整理账簿的奥兹停下手头的工作,抬起头向我看来。"], - ["奥兹", "「这不是凯伊姆先生吗,辛苦了」"], - ["奥兹", "「委托已经完成了吗?」"], - ["凯伊姆", "「啊啊,是这家伙没错吧」"], - ["", "奥兹用只要接触到就能杀人般的眼神在男人脸上搜过。"], - ["奥兹", "「没错,就是这个人」"], - ["凯伊姆", "「是么」"], - ["年轻人", "「你,你们要对我做什么」"], - ["奥兹", "「······」"], - ["", "奥兹用一个眼神,就让男人闭上了嘴。"], - ["", "然后,向我这边转过身来。"], - ["奥兹", "「抱歉啊,总是麻烦你去做这些无聊的事」"], - ["奥兹", "「都怪我们这边的年轻人太没用」"], - ["凯伊姆", "「客套话就免了」"], - ["奥兹", "「这还真是失礼了」"], - ["奥兹", "「喂,来个人」"], - ["光头男人", "「是」"], - ["奥兹", "「凯伊姆先生做完工作回来了」"], - ["光头男人", "「是,是,那个······」"], - ["奥兹", "「我是要你拿些酒来,这个蠢材!」"], - ["", "喀!"], - ["", "奥兹扔出的烟灰缸砸中了手下的额头。"], - ["", "鲜血四溅。"], - ["凯伊姆", "「不用这么麻烦」"], - ["凯伊姆", "「我接下来要去《菲诺列塔》」"], - ["奥兹", "「喔唷」"], - ["奥兹", "「既然如此,我就不留您在这里喝难饮的劣质酒了」"], - ["", "奥兹斜眼看着正捂住额头呻吟的手下,轻描淡写地说道。"], - ["凯伊姆", "「用这些钱去买药」"], - ["", "我将几枚铜钱仍在那个手下的身前。"], - ["奥兹", "「凯伊姆先生,不用对他们这么好」"], - ["凯伊姆", "「无妨」"], - ["凯伊姆", "「话说回来,那个要落跑的女人呢?」"], - ["奥兹", "「我把她交给那些年轻人了,现在应该正在体会人生的严苛吧」"], - ["奥兹", "「正好,趁此机会凯伊姆先生也来享受一番如何?」"], - ["年轻人", "「你,你们这些家伙,要对她做什么!?」"], - ["", "咣!"], - ["", "奥兹给了他一拳。"], - ["", "一击即倒。"], - ["", "喀,咚,咯!"], - ["", "奥兹毫不留情地向男人的脸上踩去。"], - ["年轻人", "「咕······呃咳······」"], - ["", "折断的牙齿伴着血泡被吐出。"], - ["", "这份白色在鲜红色的液体中格外显眼。"], - ["年轻人", "「你们以为做出这种事······卫兵会坐视不理吗······」"], - ["奥兹", "「啊啊,不会坐视不理的」"], - ["奥兹", "「应该会拿出你的钱包,和我们商量如何瓜分吧」"], - ["年轻人", "「那,那种事······」"], - ["", "这在牢狱是理所当然的事。"], - ["奥兹", "「怎么,头一回来牢狱么?」"], - ["", "男人点了点头。"], - ["奥兹", "「为了被骗的女人而来到牢狱,真是个规矩人啊」"], - ["奥兹", "「······前提是,被骗的人不是你」"], - ["年轻人", "「你说······我被骗了?」"], - ["年轻人", "「那,那是怎么回事!?」"], - ["奥兹", "「不用急,今天晚上会好好告诉你的」"], - ["", "奥兹抓起男人的脸。"], - ["", "为引诱客人的怜悯之心而装纯,是娼妇的惯用手段。"], - ["", "双亲被骗而借钱,结果作为抵押而将自己卖到这里,这是典型的说法。"], - [ - "", - "如果只是头脑发热而成为常客也就罢了,这次的男人热血过头,居然想出了要带女人私奔的计划。", - ], - [ - "", - "虽然女人半开玩笑地予以拒绝,但不知天高地厚的这家伙还是拉着她逃跑了。", - ], - ["", "不过,想要逃脱追击本来就是不可能的任务。"], - ["", "但即便如此,这种事情还是会一再的出现。"], - ["", "说谎的女人和被骗的男人。"], - ["", "在娼馆街,这是令人看到生厌的日常的风景。"], - ["凯伊姆", "「我要走了」"], - ["奥兹", "「好的,下次再麻烦您」"], - ["奥兹", "「之后吉克先生会将谢礼交给您的」"], - ["凯伊姆", "「啊啊」"], - ["", "我背向奥兹走出娼馆。"], - ["凯伊姆", "「······?」"], - ["", "从远方传来微弱的歌声。"], - ["", "是关卡广场的方向。"], - ["", "对了。"], - ["", "今天有觐见圣女的仪式。"], - ["", "当代的圣女伊莲——"], - ["", "俗称《盲眼之圣女》,据说即使在历代的圣女中,人气也是数一数二的。"], - ["", "广场上的人估计相当多吧。"], - ["", "虽然我也想去看看她长什么样,不过要在人潮中挤来挤去就免了。"], - ["", "还是老老实实去菲诺列塔喝烧酒吧。"], - ["", "正当我这样想着的时候,一个身影自小巷的那头走来。"], - ["凯伊姆", "「艾莉斯」"], - ]; - this.chapter01 = [ - ["艾莉斯", "「啊,凯伊姆」"], - ["艾莉斯", "「正好,我还想要去找你呢」"], - ["艾莉斯", "「没想到凯伊姆会主动出现······这是命运吗?」"], - ["凯伊姆", "「显然不是吧」"], - ["艾莉斯", "「啊,是么」"], - ["", "艾莉斯挑了挑整齐的双眉,微微地哼了一声。"], - [ - "", - "虽然是个相当引人注目的美人,但她这个将亲切儿子丢入无底深渊的性格,为自己扣了不少的分", - ], - ["", "给人印象最深的,就是那潭水般的双瞳。"], - ["", "在漆黑的瞳孔中,完全看不出感情的波动。"], - ["艾莉斯", "「喜欢我的眼睛吗?」"], - ["艾莉斯", "「如果想要的话就给你吧?」"], - ["凯伊姆", "「用不着」"], - ["艾莉斯", "「阿拉,可惜」"], - ["凯伊姆", "「那么,找我有什么事」"], - ["艾莉斯", "「梅尔特的钱好像被偷了」"], - ["凯伊姆", "「钱被偷了?都几岁了还这么没用」"], - ["艾莉斯", "「不要对我说啊」"], - ["凯伊姆", "「那家伙,该不会说要让我去抓那个小偷吧?」"], - ["艾莉斯", "「就是这样」"], - ["凯伊姆", "「笨蛋吗」"], - ["凯伊姆", "「如果是小钱的话,就当做是买个教训吧」"], - ["艾莉斯", "「说起来,被盗的是这个月的上纳金」"], - ["凯伊姆", "「你说什么?」"], - ["艾莉斯", "「用这些钱买教训,也太过奢侈了呢」"], - ["凯伊姆", "「知道了,我去找」"], - ["凯伊姆", "「小偷的特征呢」"], - ["艾莉斯", "「男孩子」"], - ["艾莉斯", "「······而且,背后有翅膀」"], - ["艾莉斯", "「虽然姑且是藏在身后,但是仔细观察的话是很明显的」"], - ["凯伊姆", "「羽化病吗」"], - [ - "艾莉斯", - "「那些人可是毫不留情的,所以即使是为了那个孩子,也要赶快抓到他」", - ], - ["凯伊姆", "「注意到他逃窜的方向了吗?」"], - ["艾莉斯", "「广场那边」"], - ["艾莉斯", "「虽然刚才《不蚀金锁》的人去追了,不过多半是······」"], - ["凯伊姆", "「偏偏还是广场吗」"], - ["艾莉斯", "「今天是觐见圣女大人的日子」"], - ["凯伊姆", "「我知道」"], - ["凯伊姆", "「尽量找找看就好」"], - ]; - this.chapter02 = [ - ["不蚀金锁成员", "「凯伊姆先生,凯伊姆先生」"], - ["不蚀金锁成员", "「您已经和艾莉斯大夫见过面了吗?」"], - ["凯伊姆", "「啊啊,所以才会追过来的」"], - ["凯伊姆", "「看到小偷了吗?」"], - [ - "不蚀金锁成员", - "「没有,他向广场那边逃了过去,今天这么拥挤,我们也只能放弃了」", - ], - [ - "不蚀金锁成员", - "「不过,我也只是刚好在店里所以才追了过去,并不是受人所托」", - ], - ["不蚀金锁成员", "「我已经准备撤退了」"], - ["不蚀金锁成员", "「凯伊姆先生还要继续追吗?」"], - ["凯伊姆", "「啊啊」"], - ["", "做完情报交换之后,我跟男人道别。"], - ["凯伊姆", "「和我想的一样啊······」"], - ["", "在牢狱中最大的广场上,聚集着看不到尽头的人群。"], - ["", "就算是来参见圣女祈祷,这人数也太多了点吧。"], - ["", "自然,我也找不到逃跑的孩子。"], - ["", "是混杂到人群中了吧。"], - ["", "如果已经从广场上脱身了的话,就更难发现了。"], - ["", "只好赌他还在这里了。"], - ["", "我先移动到了一个视野良好的地方。"], - ["", "从这里,一眼就可以看到人群的变化。"], - ["", "广场还是沸腾起来。"], - ["", "抬头望去,原来是在天台之上出现了一个人影"], - ["", "但是,与周围的期待不同,现身的是一名中年的神官。"], - ["", "骂声四溢。"], - ["", "神官则是笑着摆正衣领"], - ["神官", "「从现在开始,举行谒见的仪式」"], - [ - "神官", - "「在参见那位大人之前,我希望牢狱的诸位再次思考这个《诺瓦斯·艾蒂尔》存在的意义······」", - ], - [ - "神官", - "「初代圣女伊莲大人,便是也难怪这崇高的祈祷之力,令《诺瓦斯·艾蒂尔》浮在空中,拯救了我们的祖先」", - ], - [ - "神官", - "「这之后的几百年来,传承了初代大人力量的历代圣女伊莲大人,让这里留在了空中」", - ], - [ - "神官", - "「这座都市是被圣女大人守护的人类最后的圣域,而我们则是被选召的虔诚的信徒」", - ], - ["神官", "「怀着对圣女的感激祈祷吧,感谢圣女伊莲吧!并献上祈祷!」"], - ["圣女", "「不忘感谢与祈祷,神才会拯救我们」"], - ["圣女", "「与我一起,向神虔诚地祈祷吧」"], - ["", "广场上欢声雷动。"], - ["", "圣女没有回应喧嚣的人声,而是静静地合上双眼面向广场。"], - ["", "虽然感觉有些冷淡,但总比像个傻瓜似的笑着向这群人挥手要强。"], - ["", "她掌握着这条街道,还有在这条街上生活的人的命运。"], - ["", "比起揽得人气,她更想要为了街道的继续存在而献出全力。"], - ["", "也是为了不让《大崩落》的惨剧再度发生。"], - ["", "十几年前的那场悲剧。"], - [ - "", - "虽然在我脑海中的记忆已经相当模糊,但哪怕只是稍有触及,不快的感觉都会在胸口蔓延开。", - ], - ["凯伊姆", "「······」"], - ["", "这时我才想起,现在不是我在这里看圣女的时候。"], - ["女声", "「——っ!?」"], - ["围观的女人", "「羽,羽化病人!?」"], - ["围观的中年人", "「喂,谁去叫下羽狩」"], - ["惊慌的观众", "「你这家伙不要靠近我,要是传染了可怎么办」"], - ["粗鲁的观众", "「你这小鬼赶快滚开」"], - ["凯伊姆", "「接下来」"], - ["圣女", "「发生什么事了?看上去似乎很嘈杂」"], - ["随从", "「似乎是某个人逃跑了······具体的我也不是很清楚」"], - ["神官", "「圣女大人,继续待在天台上可能会出事,请您先回到室内吧」"], - ["圣女", "「不用在意我,比起那个,我更关心究竟发生了什么事」"], - ["神官", "「对不起,我真的不知道」"], - ["圣女", "「······是吗」"], - ["男", "「恕我僭越,请准许我说明情况」"], - ["男", "「在来觐见的人群中出现了《羽化病》的患者」"], - ["男", "「围观的人群因而产生了骚动」"], - [ - "男", - "「现在,《防疫局》已经派遣了部队。我想不久之后,他们就会安静下来了」", - ], - ["圣女", "「羽化病······」"], - ["男", "「怎么了?」"], - ["圣女", "「没什么」"], - ["圣女", "「辛苦了,你的名字是?」"], - ["男", "「属下是在防疫局任职的,鲁基乌斯· 迪斯·米利尤」"], - ["神官", "「噢噢,阁下就是鲁基乌斯卿吗,我听说过你的传闻」"], - ["神官", "「阁下是在工作上相当出色的人呢」"], - ["鲁基乌斯", "「不敢当」"], - [ - "鲁基乌斯", - "「话说回来,这次是属下警备工作的失职。让圣女大人见到这不成体统的一面,请您见谅」", - ], - [ - "圣女", - "「即使是目不见物的我,也能感受到聚集于此的民众数量之多。警备工作难以展开也在情理之中」", - ], - ["鲁基乌斯", "「属下不胜惶恐」"], - ["鲁基乌斯", "「接下来属下还要回到工作岗位上,在这里就先告退了」"], - ["圣女", "「鲁基乌斯先生」"], - ["鲁基乌斯", "「属下在」"], - ["圣女", "「你是怎样看待羽狩的工作的呢?」"], - ["神官", "「圣,圣女大人」"], - [ - "鲁基乌斯", - "「防疫局的工作是国王陛下赐予的重要职务。属下非常荣幸能够为这个都市的繁荣尽一份微薄之力」", - ], - ["神官", "「不,不亏是鲁基乌斯卿,相当优秀的想法」"], - ["圣女", "「是吗。辛苦你了」"], - ["随从", "「圣女大人······」"], - ["鲁基乌斯", "「······」"], - ["鲁基乌斯", "「那么,属下就回岗位去了」"], - ]; - this.chapter03 = [ - ["", "从羽化病的少年纷乱的足音中,可以听得出相当的疲劳。"], - ["", "显然,他并没有想到我会捷足先登吧。"], - ["", "少年惶恐地回头看了一眼后,微微露出安心的表情,双手拄在膝盖上。。"], - ["凯伊姆", "「辛苦你了」"], - ["羽化病患少年", "「稀!?」"], - ["凯伊姆", "「逃到贫民区是个不错的想法」"], - ["羽化病患少年", "「你,你是,羽狩吗?」"], - ["凯伊姆", "「不是」"], - ["羽化病患少年", "「什,什么啊······混蛋,不要吓我啊」"], - ["凯伊姆", "「我对令你受惊这件事致以歉意」"], - ["凯伊姆", "「作为回报,麻烦你把从店里偷的钱交出来吧」"], - ["羽化病患少年", "「钱?你在说什么」"], - ["凯伊姆", "「你要找的腰上的东西,掉在你身后了」"], - ["羽化病患少年", "「哎?」"], - ["羽化病患少年", "「呃呀」"], - ["羽化病患少年", "「你······你这混蛋」"], - ["凯伊姆", "「······」"], - ["凯伊姆", "「把偷的钱交出来」"], - ["羽化病患少年", "「我不知道你在······咕」"], - ["羽化病患少年", "「你,你说是我偷的······有什么证据吗」"], - ["凯伊姆", "「你还挺倔的啊」"], - ["凯伊姆", "「不过,给我听好了」"], - ["凯伊姆", "「你偷的那些钱,是要上缴给《不蚀金锁》的上纳金」"], - ["凯伊姆", "「而且,钱的主人是从前和吉克颇有渊源的女人」"], - ["羽化病患少年", "「吉克?」"], - ["凯伊姆", "「他是《不蚀金锁》的主人,这么说你就明白了吧」"], - ["羽化病患少年", "「哎?哎?怎么会······」"], - ["凯伊姆", "「再问你一遍,钱在哪里?」"], - ["羽化病患少年", "「是,是,是,在我的怀里」"], - ["凯伊姆", "「你没有擅自拿掉一部分吧」"], - ["羽化病患少年", "「是,是的」"], - ["羽化病患少年", "「那,那个,您是《不蚀金锁》的人吗?」"], - ["凯伊姆", "「算是吧」"], - ["羽化病患少年", "「我什么都可以做,请您一定要帮帮我」"], - ["凯伊姆", "「抱歉,我并没有兴趣去帮助他人」"], - ["羽化病患少年", "「我什么······什么,都会做的······」"], - ["羽化病患少年", "「我一直都是生活在下层的」"], - [ - "羽化病患少年", - "「可是,不知何时染上了羽化病······背后长出了翅膀······」", - ], - ["羽化病患少年", "「被寄宿工作的店赶了出来,只得流落到牢狱这里」"], - ["羽化病患少年", "「因为独自实在是饿的不行了,所以才会偷这些钱的」"], - [ - "羽化病患少年", - "「我明明没有做任何坏事······为什么······会遇到这种事······」", - ], - ["凯伊姆", "「谁知道」"], - ["羽化病患少年", "「呜······呜呜······接下来,要对我做什么?」"], - ["凯伊姆", "「我要把你带到组织那里」"], - ["羽化病患少年", "「怎,怎么这样」"], - ["凯伊姆", "「不过,那样做的前提是你不是羽化病人」"], - ["凯伊姆", "「组织也没有笨到把羽化病人招待到家里的程度」"], - ["羽化病患少年", "「那么,是要放我逃走吗?」"], - ["凯伊姆", "「我要让你学到教训」"], - ["凯伊姆", "「如果换做是组织的制裁,至少要有断条胳膊的觉悟」"], - ["凯伊姆", "「你的运气不错」"], - ["羽化病患少年", "「唔······啊,是的······」"], - ["凯伊姆", "「滚」"], - ["羽化病患少年", "「非常感谢」"], - ["羽化病患少年", "「唔啊!?」"], - ["男", "「到这里就结束了,羽化病人」"], - ["男", "「确认他的翅膀」"], - ["", "趁还没有被卷入麻烦的事情之前,赶快离开这里吧"], - ["羽狩的队长", "「那边的那个人」"], - ["凯伊姆", "「······有什么事?」"], - ["羽狩的队长", "「可以稍微让我问几句话吗」"], - ["凯伊姆", "「······」"], - ["凯伊姆", "「啊啊,无妨」"], - ["羽狩的队长", "「感谢您的合作」"], - ["", "队长殷勤地致以谢礼。"], - ["", "而在他的眼前,少年的衣服已经被他的补下们扯破。"], - ["", "在瘦骨嶙峋的裸露后背上,长有纯白的羽翼。"], - ["红发的羽狩", "「副队长,确认翅膀的持有了」"], - ["羽狩的副队长", "「保护他」"], - ["羽化病患少年", "「不要······请原谅,我······」"], - [ - "羽狩的副队长", - "「我们只是要带你去治愈院治疗羽化病,不是什么应该感到害怕的事情」", - ], - ["羽化病患少年", "「可是,可是」"], - ["羽狩的副队长", "「没关系的」"], - ["羽化病患少年", "「······哥,哥哥」"], - ["羽狩的副队长", "「你是羽化病人的亲属吗?」"], - ["凯伊姆", "「只是路人而已」"], - ["凯伊姆", "「顺带一提,我也没有打算找你们的麻烦」"], - [ - "羽狩的副队长", - "「前几天,有个和你说了同样的话的人,在我们背向他的瞬间对我们发动了袭击」", - ], - ["羽狩的副队长", "「我的一个部下就此永久失去了半截胳膊」"], - ["凯伊姆", "「我表示同情」"], - ["凯伊姆", "「我马上就会消失的,这样就没问题了吧?」"], - ["羽狩的副队长", "「嘛,不要这么慌张」"], - ["", "副队长看着羽化的少年。"], - ["羽狩的副队长", "「你与这个人是什么关系?没有被他殴打吗?」"], - ["羽化病患少年", "「没,没有」"], - [ - "羽狩的副队长", - "「如何对我们保持合作,你就可以在治愈院得到优先的治疗」", - ], - ["羽化病患少年", "「······」"], - ["羽化病患少年", "「那个人,是《不蚀金锁》的组织成员······」"], - ["羽化病患少年", "「突然说让我拿出钱来,我刚一拒绝他就打我」"], - ["羽狩的副队长", "「原来如此······」"], - [ - "羽狩的副队长", - "「那位少年说你是《不蚀金锁》的一员,不知此事是否属实?」", - ], - ["凯伊姆", "「当然不是」"], - ["凯伊姆", "「我只是从那里接受工作而已,并不是他们的成员」"], - ["羽狩的副队长", "「你的意思是说,少年在说谎吗?」"], - ["凯伊姆", "「啊啊」"], - [ - "凯伊姆", - "「如果你们和组织有关系的话,只要问问我是不是那里的成员就能明白事实了吧」", - ], - ["羽狩的副队长", "「就算我去询问,也无法从他们那里得到事实」"], - [ - "羽狩的副队长", - "「《不蚀金锁》的那些人一向都不对我们合作,我对此深感困扰」", - ], - ["凯伊姆", "「真是辛苦啊」"], - ["羽狩的副队长", "「说的是啊」"], - ["羽狩的副队长", "「其实,砍下我部下胳膊的似乎也是组织的成员呢」"], - [ - "羽狩的副队长", - "「无需如此警戒,我只是想在看守所向你咨询一些事情而已」", - ], - [ - "羽狩的副队长", - "「如果能够知晓牢狱与组织的事情,我们也可以尽可能地对更多的羽化病人进行保护」", - ], - ["羽狩的副队长", "「那和整条街道的和平也是紧密相关的吧?」"], - ["凯伊姆", "「我知道,你们有逮捕干扰狩猎羽化病人的权力」"], - [ - "凯伊姆", - "「但是,我没有对你们做出任何干扰,为什么要对我如此纠缠不休呢」", - ], - ["羽狩的副队长", "「那些话,我们会在看守所对你详细说明的」"], - ["凯伊姆", "「······」"], - ["", "在这里起争执的话,就会被羽狩加害。"], - ["", "就算能从这里脱身,今后只要碰面就会产生纠纷也是摆明的事情。"], - ["", "就算逃跑,也没有好的结果。"], - ["", "正当我想要打圆场的时候,刚才的气氛一瞬间产生了转变。"], - ["", "发生了什么事······"], - ["???", "「我认为,那位先生是正确的」"], - ["", "羽狩们一起回头。"], - ["", "而在他们视线的焦点处,"], - ["", "伫立着一位女性。"], - ["", "在端正的容颜下,代表着强烈意志的双眉十分显眼。"], - ["", "身体的柔软与紧紧包裹在其身上的羽狩制服,两者显得十分的不搭配。"], - ["", "我还是第一次看到女性的羽狩。"], - ["羽狩的副队长", "「队长,这是获得《不蚀金锁》情报的好机会」"], - [ - "羽狩的队长", - "「兰格副队长,就算是为了获得情报,也不能做出恫吓的发言啊」", - ], - ["兰格副队长", "「我并没有打算去恫吓他······」"], - ["羽狩的队长", "「告诉我那个被砍掉胳膊的队员的名字」"], - ["羽狩的队长", "「我会去探望他的」"], - ["兰格副队长", "「那个是······」"], - ["羽狩的队长", "「我知道,你一直在为有所收获而努力工作」"], - ["羽狩的队长", "「但是,正因为我们的工作是为民众提供帮助」"], - ["羽狩的队长", "「所以就更不能损害人与人之间的信赖」"], - ["兰格副队长", "「我会铭记在心」"], - ["羽狩的队长", "「这位先生,我的部下失礼了」"], - ["凯伊姆", "「只要不对我再来一次就好」"], - ["羽狩的队长", "「请稍等」"], - ["凯伊姆", "「有什么事?」"], - ["羽狩的队长", "「我想确认一件事」"], - ["羽狩的队长", "「你真的不是《不蚀金锁》的成员吗?」"], - ["凯伊姆", "「真的」"], - ["凯伊姆", "「如果我说是的话,你有什么打算?」"], - ["羽狩的队长", "「我听过传闻,说他们是用依靠暴力而得的钱在生活」"], - ["凯伊姆", "「······这样啊」"], - ["凯伊姆", "「如果能有收获就好了啊」"], - ]; - this.chapter04 = [ - ["梅尔特", "「欢迎光临」"], - ["梅尔特", "「辛苦了」"], - ["梅尔特", "「抱歉,又拜托给你了个这么麻烦的工作」"], - ["凯伊姆", "「没什么,比想象中完成的更容易」"], - ["梅尔特", "「那就好」"], - ["梅尔特", "「这是我的一点谢意」"], - ["凯伊姆", "「味道有些变化啊」"], - ["梅尔特", "「啊,被发现了?」"], - ["梅尔特", "「最近,没能到手什么好的原料呢」"], - ["凯伊姆", "「去拜托吉克如何?」"], - [ - "梅尔特", - "「话是这么说,但是总不能用店里采购的这种小事去麻烦他吧······」", - ], - ["凯伊姆", "「那希望你也不要来麻烦我」"], - ["梅尔特", "「那 是 两 码 事」"], - ["梅尔特", "「再说,凯伊姆是靠着工作来生活的吧」"], - [ - "梅尔特", - "「而且,自己的钱被偷了这么害羞的事,向凯伊姆意外的其他人都说不出口」", - ], - ["凯伊姆", "「反正,也已经传到吉克的耳朵里了」"], - ["梅尔特", "「这是面子问题啊,面子问题」"], - ["凯伊姆", "「嘛,算了」"], - ["凯伊姆", "「这样就好了吧?」"], - ["梅尔特", "「这是钱包呢」"], - ["梅尔特", "「嗯,东西没少」"], - ["梅尔特", "「太好啦—这个月的上纳金,我可全部都放在里面了呢」"], - ["梅尔特", "「如果没有找到的话,说不定就又会被送到娼馆里了呢」"], - ["凯伊姆", "「在那边不是来钱更快吗?」"], - ["梅尔特", "「阿拉,你是在说我还能有魅力吗?」"], - ["凯伊姆", "「这是客套话而已」"], - ["梅尔特", "「欺负人」"], - ["梅尔特", "「总而言之,今天帮大忙了」"], - ["梅尔特", "「谢礼嘛······」"], - ["凯伊姆", "「就记在账单上吧」"], - ["梅尔特", "「了解—盛谢惠顾了哦?」"], - ["", "喀啷喀啷"], - ["", "门铃响起"], - ["", "喧哗瞬间安静下来。"], - ["", "进来的人是吉克。"], - ["", "是掌控着牢狱的组织之一,《不蚀金锁》的头目。"], - ["", "不仅组织的成员,就连店内一般的客人也对他以注目礼表示敬意。"], - ["吉克", "「各位继续吧」"], - ["", "仿佛停滞的时钟重新转动了一般,店内恢复了热闹的气氛。"], - ["吉克", "「抱歉,今天拜托你去做了无聊的工作」。"], - ["凯伊姆", "「不用介意」"], - ["", "吉克轻轻点了点头,在我右边坐了下来"], - ["凯伊姆", "「逃跑的男人怎么样了?」"], - ["吉克", "「嗯?已经不在这个世上了」。"], - ["吉克", "「有什么想要知道的事吗?」"], - ["凯伊姆", "「不,没什么」"], - ["吉克", "「那个无聊的家伙,完全没有趣味呢」"], - ["吉克", "「真希望他也替我负责清扫的部下也考虑考虑」"], - ["凯伊姆", "「真是灾难啊」"], - ["吉克", "「比起那个,我听说了哦。你去追羽化病人了啊」"], - ["凯伊姆", "「消息真灵通」"], - ["吉克", "「梅尔特也注意点」"], - ["吉克", "「你丢钱已经不是一回两回了」"], - ["梅尔特", "「好的—我会注意的。」"], - ["梅尔特", "「吉克还是平常的点单吧」"], - ["梅尔特", "「凯伊姆要再来一杯吗?」"], - ["", "我们用眼神点头示意后,梅尔特开始准备起酒来。"], - ["", "悠然地吐出眼圈后,吉克取出一个纸包放在柜台上。"], - ["吉克", "「这是抓捕逃跑男人的报酬」"], - ["凯伊姆", "「下次有什么事再告诉我」"], - ["梅尔特", "「来,久等了」"], - ["凯伊姆", "「话说回来梅尔特,为什么会被那种孩子偷到钱?」"], - ["吉克", "「让我猜猜看」"], - ["吉克", "「是那个吧,看某个特立独行的男人入迷了,所以就有了空隙?」"], - ["梅尔特", "「可惜—」"], - ["梅尔特", "「事实恰恰相反,是那家伙一直在纠缠我」"], - ["凯伊姆", "「完全把你当成新进的女佣了么」"], - ["梅尔特", "「我从前可是很有名的,不会被当成这种下人吧」"], - ["梅尔特", "「······而且,我没法对对我这么钟情的人发火啊」"], - ["凯伊姆&吉克", "「你傻啊」"], - ["梅尔特", "「异口同声呢,不亏是兄弟」"], - ["凯伊姆", "「别用这种称呼,怪恶心的」"], - ["吉克", "「说得没错」"], - ["吉克", "「······说起来······」"], - ["梅尔特", "「怎么了?」"], - ["吉克", "「有件事我一直很在意,我和凯伊姆,哪个是哥哥啊?」"], - ["凯伊姆", "「你也说这么无聊的话题」"], - ["吉克", "「不,这是很重要的事情」"], - ["吉克", "「梅尔特,事实是怎么样的?」"], - ["梅尔特", "「啊~是怎么样的呢~」"], - ["梅尔特", "「我忘记了」"], - ["吉克", "「骗人」"], - ]; -} + // 在此增加新插件 + // 每项为一个数组,第一项是名字,第二项是对话内容 + // 回放只会在同一个this下回放,进入剧情前请以事件块声明进入哪个剧情数组 + // 可以自由添加,但不能与已有插件及函数名相同,可以使用中文。 + this.chapter0 = [ + ["", "这些天,街道不曾下雨。"], + ["", "所以,那浸湿地面的,定是那些女孩们流落的鲜血无疑。"], + ["", "我蹲在充斥着铁锈味般恶臭的小巷中,悠闲地如是想着。"], + ["", "扑哧。"], + ["", "耳旁再次响起象征着某个女孩子死去的声音。"], + ["", "再一次——"], + ["", "再一次。"], + ["", "女子们被肢解成单纯的肉块。"], + ["", "我任由流下的血浸满全身,屏住自己的呼吸。"], + ["", "祈求自己能拥有从猎人手中逃脱的幸运。"], + ["", "扑哧。"], + ["", "直到刚才,我们还坐在去往娼馆的马车的路上。"], + ["", "而在这之中的某些人,已经不在这个世上了。"], + ["", "不,应该把“某些”换成“几乎所有”才更为恰当吧。"], + ["", "恐怕,不久之后我也会变成小巷中血腥的装饰品。"], + ["", "我是为了得到这种死法,才辛苦苟活至今的吗?"], + ["", "来个人告诉我啊——"], + ["", "谁都好。"], + ["", "来人啊!!"], + ["少女", "「呃······!?」"], + ["", "漆黑的物体充斥了我的整个视野"], + ["", "我很快意识到,那是只很大的脚。"], + ["", "必须要出声求救。"], + ["", "可是,耳中却只能听到自己的牙关不停交战的声音。"], + ["", "我是如此的无助。"], + ["", "逃跑也好,道歉也罢。"], + ["", "就连抬头看一眼将要杀掉我的人的面孔都做不到。"], + ["少女", "「······被杀」"], + ["", "会被杀。"], + ["", "会被杀!!"], + ["", "来自内心深处的冰冷预感,渐渐地在体内蔓延开来。"], + ["少女", "「不,不要······」"], + ["", "浮游都市,《诺瓦斯·艾蒂尔》。"], + ["", "《特别受灾地区》——"], + ["", "通称,《牢狱》"], + ["", "是被险峻的峭壁环绕,与世隔绝的,都市的最底部。"], + ["年轻人", "「放开我!」"], + ["年轻人", "「我只是在帮那个女人而已!」"], + ["年轻人", "「你们没听到吗!?」"], + ["年轻人", "「她是被受骗才会被卖到娼馆来的」"], + ["年轻人", "「用肮脏的手段把钱借给她父母的,就是你们这些家伙吧!?」"], + ["年轻人", "「给我说些什么啊」"], + ["凯伊姆", "「这些话等到了娼馆再说吧」"], + ["凯伊姆", "「我来抓你,只是受雇于人而已」"], + ["", "我走进娼馆《莉莉乌姆》的接待室。"], + ["", "正在桌旁整理账簿的奥兹停下手头的工作,抬起头向我看来。"], + ["奥兹", "「这不是凯伊姆先生吗,辛苦了」"], + ["奥兹", "「委托已经完成了吗?」"], + ["凯伊姆", "「啊啊,是这家伙没错吧」"], + ["", "奥兹用只要接触到就能杀人般的眼神在男人脸上搜过。"], + ["奥兹", "「没错,就是这个人」"], + ["凯伊姆", "「是么」"], + ["年轻人", "「你,你们要对我做什么」"], + ["奥兹", "「······」"], + ["", "奥兹用一个眼神,就让男人闭上了嘴。"], + ["", "然后,向我这边转过身来。"], + ["奥兹", "「抱歉啊,总是麻烦你去做这些无聊的事」"], + ["奥兹", "「都怪我们这边的年轻人太没用」"], + ["凯伊姆", "「客套话就免了」"], + ["奥兹", "「这还真是失礼了」"], + ["奥兹", "「喂,来个人」"], + ["光头男人", "「是」"], + ["奥兹", "「凯伊姆先生做完工作回来了」"], + ["光头男人", "「是,是,那个······」"], + ["奥兹", "「我是要你拿些酒来,这个蠢材!」"], + ["", "喀!"], + ["", "奥兹扔出的烟灰缸砸中了手下的额头。"], + ["", "鲜血四溅。"], + ["凯伊姆", "「不用这么麻烦」"], + ["凯伊姆", "「我接下来要去《菲诺列塔》」"], + ["奥兹", "「喔唷」"], + ["奥兹", "「既然如此,我就不留您在这里喝难饮的劣质酒了」"], + ["", "奥兹斜眼看着正捂住额头呻吟的手下,轻描淡写地说道。"], + ["凯伊姆", "「用这些钱去买药」"], + ["", "我将几枚铜钱仍在那个手下的身前。"], + ["奥兹", "「凯伊姆先生,不用对他们这么好」"], + ["凯伊姆", "「无妨」"], + ["凯伊姆", "「话说回来,那个要落跑的女人呢?」"], + ["奥兹", "「我把她交给那些年轻人了,现在应该正在体会人生的严苛吧」"], + ["奥兹", "「正好,趁此机会凯伊姆先生也来享受一番如何?」"], + ["年轻人", "「你,你们这些家伙,要对她做什么!?」"], + ["", "咣!"], + ["", "奥兹给了他一拳。"], + ["", "一击即倒。"], + ["", "喀,咚,咯!"], + ["", "奥兹毫不留情地向男人的脸上踩去。"], + ["年轻人", "「咕······呃咳······」"], + ["", "折断的牙齿伴着血泡被吐出。"], + ["", "这份白色在鲜红色的液体中格外显眼。"], + ["年轻人", "「你们以为做出这种事······卫兵会坐视不理吗······」"], + ["奥兹", "「啊啊,不会坐视不理的」"], + ["奥兹", "「应该会拿出你的钱包,和我们商量如何瓜分吧」"], + ["年轻人", "「那,那种事······」"], + ["", "这在牢狱是理所当然的事。"], + ["奥兹", "「怎么,头一回来牢狱么?」"], + ["", "男人点了点头。"], + ["奥兹", "「为了被骗的女人而来到牢狱,真是个规矩人啊」"], + ["奥兹", "「······前提是,被骗的人不是你」"], + ["年轻人", "「你说······我被骗了?」"], + ["年轻人", "「那,那是怎么回事!?」"], + ["奥兹", "「不用急,今天晚上会好好告诉你的」"], + ["", "奥兹抓起男人的脸。"], + ["", "为引诱客人的怜悯之心而装纯,是娼妇的惯用手段。"], + ["", "双亲被骗而借钱,结果作为抵押而将自己卖到这里,这是典型的说法。"], + [ + "", + "如果只是头脑发热而成为常客也就罢了,这次的男人热血过头,居然想出了要带女人私奔的计划。", + ], + [ + "", + "虽然女人半开玩笑地予以拒绝,但不知天高地厚的这家伙还是拉着她逃跑了。", + ], + ["", "不过,想要逃脱追击本来就是不可能的任务。"], + ["", "但即便如此,这种事情还是会一再的出现。"], + ["", "说谎的女人和被骗的男人。"], + ["", "在娼馆街,这是令人看到生厌的日常的风景。"], + ["凯伊姆", "「我要走了」"], + ["奥兹", "「好的,下次再麻烦您」"], + ["奥兹", "「之后吉克先生会将谢礼交给您的」"], + ["凯伊姆", "「啊啊」"], + ["", "我背向奥兹走出娼馆。"], + ["凯伊姆", "「······?」"], + ["", "从远方传来微弱的歌声。"], + ["", "是关卡广场的方向。"], + ["", "对了。"], + ["", "今天有觐见圣女的仪式。"], + ["", "当代的圣女伊莲——"], + ["", "俗称《盲眼之圣女》,据说即使在历代的圣女中,人气也是数一数二的。"], + ["", "广场上的人估计相当多吧。"], + ["", "虽然我也想去看看她长什么样,不过要在人潮中挤来挤去就免了。"], + ["", "还是老老实实去菲诺列塔喝烧酒吧。"], + ["", "正当我这样想着的时候,一个身影自小巷的那头走来。"], + ["凯伊姆", "「艾莉斯」"], + ]; + this.chapter01 = [ + ["艾莉斯", "「啊,凯伊姆」"], + ["艾莉斯", "「正好,我还想要去找你呢」"], + ["艾莉斯", "「没想到凯伊姆会主动出现······这是命运吗?」"], + ["凯伊姆", "「显然不是吧」"], + ["艾莉斯", "「啊,是么」"], + ["", "艾莉斯挑了挑整齐的双眉,微微地哼了一声。"], + [ + "", + "虽然是个相当引人注目的美人,但她这个将亲切儿子丢入无底深渊的性格,为自己扣了不少的分", + ], + ["", "给人印象最深的,就是那潭水般的双瞳。"], + ["", "在漆黑的瞳孔中,完全看不出感情的波动。"], + ["艾莉斯", "「喜欢我的眼睛吗?」"], + ["艾莉斯", "「如果想要的话就给你吧?」"], + ["凯伊姆", "「用不着」"], + ["艾莉斯", "「阿拉,可惜」"], + ["凯伊姆", "「那么,找我有什么事」"], + ["艾莉斯", "「梅尔特的钱好像被偷了」"], + ["凯伊姆", "「钱被偷了?都几岁了还这么没用」"], + ["艾莉斯", "「不要对我说啊」"], + ["凯伊姆", "「那家伙,该不会说要让我去抓那个小偷吧?」"], + ["艾莉斯", "「就是这样」"], + ["凯伊姆", "「笨蛋吗」"], + ["凯伊姆", "「如果是小钱的话,就当做是买个教训吧」"], + ["艾莉斯", "「说起来,被盗的是这个月的上纳金」"], + ["凯伊姆", "「你说什么?」"], + ["艾莉斯", "「用这些钱买教训,也太过奢侈了呢」"], + ["凯伊姆", "「知道了,我去找」"], + ["凯伊姆", "「小偷的特征呢」"], + ["艾莉斯", "「男孩子」"], + ["艾莉斯", "「······而且,背后有翅膀」"], + ["艾莉斯", "「虽然姑且是藏在身后,但是仔细观察的话是很明显的」"], + ["凯伊姆", "「羽化病吗」"], + [ + "艾莉斯", + "「那些人可是毫不留情的,所以即使是为了那个孩子,也要赶快抓到他」", + ], + ["凯伊姆", "「注意到他逃窜的方向了吗?」"], + ["艾莉斯", "「广场那边」"], + ["艾莉斯", "「虽然刚才《不蚀金锁》的人去追了,不过多半是······」"], + ["凯伊姆", "「偏偏还是广场吗」"], + ["艾莉斯", "「今天是觐见圣女大人的日子」"], + ["凯伊姆", "「我知道」"], + ["凯伊姆", "「尽量找找看就好」"], + ]; + this.chapter02 = [ + ["不蚀金锁成员", "「凯伊姆先生,凯伊姆先生」"], + ["不蚀金锁成员", "「您已经和艾莉斯大夫见过面了吗?」"], + ["凯伊姆", "「啊啊,所以才会追过来的」"], + ["凯伊姆", "「看到小偷了吗?」"], + [ + "不蚀金锁成员", + "「没有,他向广场那边逃了过去,今天这么拥挤,我们也只能放弃了」", + ], + [ + "不蚀金锁成员", + "「不过,我也只是刚好在店里所以才追了过去,并不是受人所托」", + ], + ["不蚀金锁成员", "「我已经准备撤退了」"], + ["不蚀金锁成员", "「凯伊姆先生还要继续追吗?」"], + ["凯伊姆", "「啊啊」"], + ["", "做完情报交换之后,我跟男人道别。"], + ["凯伊姆", "「和我想的一样啊······」"], + ["", "在牢狱中最大的广场上,聚集着看不到尽头的人群。"], + ["", "就算是来参见圣女祈祷,这人数也太多了点吧。"], + ["", "自然,我也找不到逃跑的孩子。"], + ["", "是混杂到人群中了吧。"], + ["", "如果已经从广场上脱身了的话,就更难发现了。"], + ["", "只好赌他还在这里了。"], + ["", "我先移动到了一个视野良好的地方。"], + ["", "从这里,一眼就可以看到人群的变化。"], + ["", "广场还是沸腾起来。"], + ["", "抬头望去,原来是在天台之上出现了一个人影"], + ["", "但是,与周围的期待不同,现身的是一名中年的神官。"], + ["", "骂声四溢。"], + ["", "神官则是笑着摆正衣领"], + ["神官", "「从现在开始,举行谒见的仪式」"], + [ + "神官", + "「在参见那位大人之前,我希望牢狱的诸位再次思考这个《诺瓦斯·艾蒂尔》存在的意义······」", + ], + [ + "神官", + "「初代圣女伊莲大人,便是也难怪这崇高的祈祷之力,令《诺瓦斯·艾蒂尔》浮在空中,拯救了我们的祖先」", + ], + [ + "神官", + "「这之后的几百年来,传承了初代大人力量的历代圣女伊莲大人,让这里留在了空中」", + ], + [ + "神官", + "「这座都市是被圣女大人守护的人类最后的圣域,而我们则是被选召的虔诚的信徒」", + ], + ["神官", "「怀着对圣女的感激祈祷吧,感谢圣女伊莲吧!并献上祈祷!」"], + ["圣女", "「不忘感谢与祈祷,神才会拯救我们」"], + ["圣女", "「与我一起,向神虔诚地祈祷吧」"], + ["", "广场上欢声雷动。"], + ["", "圣女没有回应喧嚣的人声,而是静静地合上双眼面向广场。"], + ["", "虽然感觉有些冷淡,但总比像个傻瓜似的笑着向这群人挥手要强。"], + ["", "她掌握着这条街道,还有在这条街上生活的人的命运。"], + ["", "比起揽得人气,她更想要为了街道的继续存在而献出全力。"], + ["", "也是为了不让《大崩落》的惨剧再度发生。"], + ["", "十几年前的那场悲剧。"], + [ + "", + "虽然在我脑海中的记忆已经相当模糊,但哪怕只是稍有触及,不快的感觉都会在胸口蔓延开。", + ], + ["凯伊姆", "「······」"], + ["", "这时我才想起,现在不是我在这里看圣女的时候。"], + ["女声", "「——っ!?」"], + ["围观的女人", "「羽,羽化病人!?」"], + ["围观的中年人", "「喂,谁去叫下羽狩」"], + ["惊慌的观众", "「你这家伙不要靠近我,要是传染了可怎么办」"], + ["粗鲁的观众", "「你这小鬼赶快滚开」"], + ["凯伊姆", "「接下来」"], + ["圣女", "「发生什么事了?看上去似乎很嘈杂」"], + ["随从", "「似乎是某个人逃跑了······具体的我也不是很清楚」"], + ["神官", "「圣女大人,继续待在天台上可能会出事,请您先回到室内吧」"], + ["圣女", "「不用在意我,比起那个,我更关心究竟发生了什么事」"], + ["神官", "「对不起,我真的不知道」"], + ["圣女", "「······是吗」"], + ["男", "「恕我僭越,请准许我说明情况」"], + ["男", "「在来觐见的人群中出现了《羽化病》的患者」"], + ["男", "「围观的人群因而产生了骚动」"], + [ + "男", + "「现在,《防疫局》已经派遣了部队。我想不久之后,他们就会安静下来了」", + ], + ["圣女", "「羽化病······」"], + ["男", "「怎么了?」"], + ["圣女", "「没什么」"], + ["圣女", "「辛苦了,你的名字是?」"], + ["男", "「属下是在防疫局任职的,鲁基乌斯· 迪斯·米利尤」"], + ["神官", "「噢噢,阁下就是鲁基乌斯卿吗,我听说过你的传闻」"], + ["神官", "「阁下是在工作上相当出色的人呢」"], + ["鲁基乌斯", "「不敢当」"], + [ + "鲁基乌斯", + "「话说回来,这次是属下警备工作的失职。让圣女大人见到这不成体统的一面,请您见谅」", + ], + [ + "圣女", + "「即使是目不见物的我,也能感受到聚集于此的民众数量之多。警备工作难以展开也在情理之中」", + ], + ["鲁基乌斯", "「属下不胜惶恐」"], + ["鲁基乌斯", "「接下来属下还要回到工作岗位上,在这里就先告退了」"], + ["圣女", "「鲁基乌斯先生」"], + ["鲁基乌斯", "「属下在」"], + ["圣女", "「你是怎样看待羽狩的工作的呢?」"], + ["神官", "「圣,圣女大人」"], + [ + "鲁基乌斯", + "「防疫局的工作是国王陛下赐予的重要职务。属下非常荣幸能够为这个都市的繁荣尽一份微薄之力」", + ], + ["神官", "「不,不亏是鲁基乌斯卿,相当优秀的想法」"], + ["圣女", "「是吗。辛苦你了」"], + ["随从", "「圣女大人······」"], + ["鲁基乌斯", "「······」"], + ["鲁基乌斯", "「那么,属下就回岗位去了」"], + ]; + this.chapter03 = [ + ["", "从羽化病的少年纷乱的足音中,可以听得出相当的疲劳。"], + ["", "显然,他并没有想到我会捷足先登吧。"], + ["", "少年惶恐地回头看了一眼后,微微露出安心的表情,双手拄在膝盖上。。"], + ["凯伊姆", "「辛苦你了」"], + ["羽化病患少年", "「稀!?」"], + ["凯伊姆", "「逃到贫民区是个不错的想法」"], + ["羽化病患少年", "「你,你是,羽狩吗?」"], + ["凯伊姆", "「不是」"], + ["羽化病患少年", "「什,什么啊······混蛋,不要吓我啊」"], + ["凯伊姆", "「我对令你受惊这件事致以歉意」"], + ["凯伊姆", "「作为回报,麻烦你把从店里偷的钱交出来吧」"], + ["羽化病患少年", "「钱?你在说什么」"], + ["凯伊姆", "「你要找的腰上的东西,掉在你身后了」"], + ["羽化病患少年", "「哎?」"], + ["羽化病患少年", "「呃呀」"], + ["羽化病患少年", "「你······你这混蛋」"], + ["凯伊姆", "「······」"], + ["凯伊姆", "「把偷的钱交出来」"], + ["羽化病患少年", "「我不知道你在······咕」"], + ["羽化病患少年", "「你,你说是我偷的······有什么证据吗」"], + ["凯伊姆", "「你还挺倔的啊」"], + ["凯伊姆", "「不过,给我听好了」"], + ["凯伊姆", "「你偷的那些钱,是要上缴给《不蚀金锁》的上纳金」"], + ["凯伊姆", "「而且,钱的主人是从前和吉克颇有渊源的女人」"], + ["羽化病患少年", "「吉克?」"], + ["凯伊姆", "「他是《不蚀金锁》的主人,这么说你就明白了吧」"], + ["羽化病患少年", "「哎?哎?怎么会······」"], + ["凯伊姆", "「再问你一遍,钱在哪里?」"], + ["羽化病患少年", "「是,是,是,在我的怀里」"], + ["凯伊姆", "「你没有擅自拿掉一部分吧」"], + ["羽化病患少年", "「是,是的」"], + ["羽化病患少年", "「那,那个,您是《不蚀金锁》的人吗?」"], + ["凯伊姆", "「算是吧」"], + ["羽化病患少年", "「我什么都可以做,请您一定要帮帮我」"], + ["凯伊姆", "「抱歉,我并没有兴趣去帮助他人」"], + ["羽化病患少年", "「我什么······什么,都会做的······」"], + ["羽化病患少年", "「我一直都是生活在下层的」"], + [ + "羽化病患少年", + "「可是,不知何时染上了羽化病······背后长出了翅膀······」", + ], + ["羽化病患少年", "「被寄宿工作的店赶了出来,只得流落到牢狱这里」"], + ["羽化病患少年", "「因为独自实在是饿的不行了,所以才会偷这些钱的」"], + [ + "羽化病患少年", + "「我明明没有做任何坏事······为什么······会遇到这种事······」", + ], + ["凯伊姆", "「谁知道」"], + ["羽化病患少年", "「呜······呜呜······接下来,要对我做什么?」"], + ["凯伊姆", "「我要把你带到组织那里」"], + ["羽化病患少年", "「怎,怎么这样」"], + ["凯伊姆", "「不过,那样做的前提是你不是羽化病人」"], + ["凯伊姆", "「组织也没有笨到把羽化病人招待到家里的程度」"], + ["羽化病患少年", "「那么,是要放我逃走吗?」"], + ["凯伊姆", "「我要让你学到教训」"], + ["凯伊姆", "「如果换做是组织的制裁,至少要有断条胳膊的觉悟」"], + ["凯伊姆", "「你的运气不错」"], + ["羽化病患少年", "「唔······啊,是的······」"], + ["凯伊姆", "「滚」"], + ["羽化病患少年", "「非常感谢」"], + ["羽化病患少年", "「唔啊!?」"], + ["男", "「到这里就结束了,羽化病人」"], + ["男", "「确认他的翅膀」"], + ["", "趁还没有被卷入麻烦的事情之前,赶快离开这里吧"], + ["羽狩的队长", "「那边的那个人」"], + ["凯伊姆", "「······有什么事?」"], + ["羽狩的队长", "「可以稍微让我问几句话吗」"], + ["凯伊姆", "「······」"], + ["凯伊姆", "「啊啊,无妨」"], + ["羽狩的队长", "「感谢您的合作」"], + ["", "队长殷勤地致以谢礼。"], + ["", "而在他的眼前,少年的衣服已经被他的补下们扯破。"], + ["", "在瘦骨嶙峋的裸露后背上,长有纯白的羽翼。"], + ["红发的羽狩", "「副队长,确认翅膀的持有了」"], + ["羽狩的副队长", "「保护他」"], + ["羽化病患少年", "「不要······请原谅,我······」"], + [ + "羽狩的副队长", + "「我们只是要带你去治愈院治疗羽化病,不是什么应该感到害怕的事情」", + ], + ["羽化病患少年", "「可是,可是」"], + ["羽狩的副队长", "「没关系的」"], + ["羽化病患少年", "「······哥,哥哥」"], + ["羽狩的副队长", "「你是羽化病人的亲属吗?」"], + ["凯伊姆", "「只是路人而已」"], + ["凯伊姆", "「顺带一提,我也没有打算找你们的麻烦」"], + [ + "羽狩的副队长", + "「前几天,有个和你说了同样的话的人,在我们背向他的瞬间对我们发动了袭击」", + ], + ["羽狩的副队长", "「我的一个部下就此永久失去了半截胳膊」"], + ["凯伊姆", "「我表示同情」"], + ["凯伊姆", "「我马上就会消失的,这样就没问题了吧?」"], + ["羽狩的副队长", "「嘛,不要这么慌张」"], + ["", "副队长看着羽化的少年。"], + ["羽狩的副队长", "「你与这个人是什么关系?没有被他殴打吗?」"], + ["羽化病患少年", "「没,没有」"], + [ + "羽狩的副队长", + "「如何对我们保持合作,你就可以在治愈院得到优先的治疗」", + ], + ["羽化病患少年", "「······」"], + ["羽化病患少年", "「那个人,是《不蚀金锁》的组织成员······」"], + ["羽化病患少年", "「突然说让我拿出钱来,我刚一拒绝他就打我」"], + ["羽狩的副队长", "「原来如此······」"], + [ + "羽狩的副队长", + "「那位少年说你是《不蚀金锁》的一员,不知此事是否属实?」", + ], + ["凯伊姆", "「当然不是」"], + ["凯伊姆", "「我只是从那里接受工作而已,并不是他们的成员」"], + ["羽狩的副队长", "「你的意思是说,少年在说谎吗?」"], + ["凯伊姆", "「啊啊」"], + [ + "凯伊姆", + "「如果你们和组织有关系的话,只要问问我是不是那里的成员就能明白事实了吧」", + ], + ["羽狩的副队长", "「就算我去询问,也无法从他们那里得到事实」"], + [ + "羽狩的副队长", + "「《不蚀金锁》的那些人一向都不对我们合作,我对此深感困扰」", + ], + ["凯伊姆", "「真是辛苦啊」"], + ["羽狩的副队长", "「说的是啊」"], + ["羽狩的副队长", "「其实,砍下我部下胳膊的似乎也是组织的成员呢」"], + [ + "羽狩的副队长", + "「无需如此警戒,我只是想在看守所向你咨询一些事情而已」", + ], + [ + "羽狩的副队长", + "「如果能够知晓牢狱与组织的事情,我们也可以尽可能地对更多的羽化病人进行保护」", + ], + ["羽狩的副队长", "「那和整条街道的和平也是紧密相关的吧?」"], + ["凯伊姆", "「我知道,你们有逮捕干扰狩猎羽化病人的权力」"], + [ + "凯伊姆", + "「但是,我没有对你们做出任何干扰,为什么要对我如此纠缠不休呢」", + ], + ["羽狩的副队长", "「那些话,我们会在看守所对你详细说明的」"], + ["凯伊姆", "「······」"], + ["", "在这里起争执的话,就会被羽狩加害。"], + ["", "就算能从这里脱身,今后只要碰面就会产生纠纷也是摆明的事情。"], + ["", "就算逃跑,也没有好的结果。"], + ["", "正当我想要打圆场的时候,刚才的气氛一瞬间产生了转变。"], + ["", "发生了什么事······"], + ["???", "「我认为,那位先生是正确的」"], + ["", "羽狩们一起回头。"], + ["", "而在他们视线的焦点处,"], + ["", "伫立着一位女性。"], + ["", "在端正的容颜下,代表着强烈意志的双眉十分显眼。"], + ["", "身体的柔软与紧紧包裹在其身上的羽狩制服,两者显得十分的不搭配。"], + ["", "我还是第一次看到女性的羽狩。"], + ["羽狩的副队长", "「队长,这是获得《不蚀金锁》情报的好机会」"], + [ + "羽狩的队长", + "「兰格副队长,就算是为了获得情报,也不能做出恫吓的发言啊」", + ], + ["兰格副队长", "「我并没有打算去恫吓他······」"], + ["羽狩的队长", "「告诉我那个被砍掉胳膊的队员的名字」"], + ["羽狩的队长", "「我会去探望他的」"], + ["兰格副队长", "「那个是······」"], + ["羽狩的队长", "「我知道,你一直在为有所收获而努力工作」"], + ["羽狩的队长", "「但是,正因为我们的工作是为民众提供帮助」"], + ["羽狩的队长", "「所以就更不能损害人与人之间的信赖」"], + ["兰格副队长", "「我会铭记在心」"], + ["羽狩的队长", "「这位先生,我的部下失礼了」"], + ["凯伊姆", "「只要不对我再来一次就好」"], + ["羽狩的队长", "「请稍等」"], + ["凯伊姆", "「有什么事?」"], + ["羽狩的队长", "「我想确认一件事」"], + ["羽狩的队长", "「你真的不是《不蚀金锁》的成员吗?」"], + ["凯伊姆", "「真的」"], + ["凯伊姆", "「如果我说是的话,你有什么打算?」"], + ["羽狩的队长", "「我听过传闻,说他们是用依靠暴力而得的钱在生活」"], + ["凯伊姆", "「······这样啊」"], + ["凯伊姆", "「如果能有收获就好了啊」"], + ]; + this.chapter04 = [ + ["梅尔特", "「欢迎光临」"], + ["梅尔特", "「辛苦了」"], + ["梅尔特", "「抱歉,又拜托给你了个这么麻烦的工作」"], + ["凯伊姆", "「没什么,比想象中完成的更容易」"], + ["梅尔特", "「那就好」"], + ["梅尔特", "「这是我的一点谢意」"], + ["凯伊姆", "「味道有些变化啊」"], + ["梅尔特", "「啊,被发现了?」"], + ["梅尔特", "「最近,没能到手什么好的原料呢」"], + ["凯伊姆", "「去拜托吉克如何?」"], + [ + "梅尔特", + "「话是这么说,但是总不能用店里采购的这种小事去麻烦他吧······」", + ], + ["凯伊姆", "「那希望你也不要来麻烦我」"], + ["梅尔特", "「那 是 两 码 事」"], + ["梅尔特", "「再说,凯伊姆是靠着工作来生活的吧」"], + [ + "梅尔特", + "「而且,自己的钱被偷了这么害羞的事,向凯伊姆意外的其他人都说不出口」", + ], + ["凯伊姆", "「反正,也已经传到吉克的耳朵里了」"], + ["梅尔特", "「这是面子问题啊,面子问题」"], + ["凯伊姆", "「嘛,算了」"], + ["凯伊姆", "「这样就好了吧?」"], + ["梅尔特", "「这是钱包呢」"], + ["梅尔特", "「嗯,东西没少」"], + ["梅尔特", "「太好啦—这个月的上纳金,我可全部都放在里面了呢」"], + ["梅尔特", "「如果没有找到的话,说不定就又会被送到娼馆里了呢」"], + ["凯伊姆", "「在那边不是来钱更快吗?」"], + ["梅尔特", "「阿拉,你是在说我还能有魅力吗?」"], + ["凯伊姆", "「这是客套话而已」"], + ["梅尔特", "「欺负人」"], + ["梅尔特", "「总而言之,今天帮大忙了」"], + ["梅尔特", "「谢礼嘛······」"], + ["凯伊姆", "「就记在账单上吧」"], + ["梅尔特", "「了解—盛谢惠顾了哦?」"], + ["", "喀啷喀啷"], + ["", "门铃响起"], + ["", "喧哗瞬间安静下来。"], + ["", "进来的人是吉克。"], + ["", "是掌控着牢狱的组织之一,《不蚀金锁》的头目。"], + ["", "不仅组织的成员,就连店内一般的客人也对他以注目礼表示敬意。"], + ["吉克", "「各位继续吧」"], + ["", "仿佛停滞的时钟重新转动了一般,店内恢复了热闹的气氛。"], + ["吉克", "「抱歉,今天拜托你去做了无聊的工作」。"], + ["凯伊姆", "「不用介意」"], + ["", "吉克轻轻点了点头,在我右边坐了下来"], + ["凯伊姆", "「逃跑的男人怎么样了?」"], + ["吉克", "「嗯?已经不在这个世上了」。"], + ["吉克", "「有什么想要知道的事吗?」"], + ["凯伊姆", "「不,没什么」"], + ["吉克", "「那个无聊的家伙,完全没有趣味呢」"], + ["吉克", "「真希望他也替我负责清扫的部下也考虑考虑」"], + ["凯伊姆", "「真是灾难啊」"], + ["吉克", "「比起那个,我听说了哦。你去追羽化病人了啊」"], + ["凯伊姆", "「消息真灵通」"], + ["吉克", "「梅尔特也注意点」"], + ["吉克", "「你丢钱已经不是一回两回了」"], + ["梅尔特", "「好的—我会注意的。」"], + ["梅尔特", "「吉克还是平常的点单吧」"], + ["梅尔特", "「凯伊姆要再来一杯吗?」"], + ["", "我们用眼神点头示意后,梅尔特开始准备起酒来。"], + ["", "悠然地吐出眼圈后,吉克取出一个纸包放在柜台上。"], + ["吉克", "「这是抓捕逃跑男人的报酬」"], + ["凯伊姆", "「下次有什么事再告诉我」"], + ["梅尔特", "「来,久等了」"], + ["凯伊姆", "「话说回来梅尔特,为什么会被那种孩子偷到钱?」"], + ["吉克", "「让我猜猜看」"], + ["吉克", "「是那个吧,看某个特立独行的男人入迷了,所以就有了空隙?」"], + ["梅尔特", "「可惜—」"], + ["梅尔特", "「事实恰恰相反,是那家伙一直在纠缠我」"], + ["凯伊姆", "「完全把你当成新进的女佣了么」"], + ["梅尔特", "「我从前可是很有名的,不会被当成这种下人吧」"], + ["梅尔特", "「······而且,我没法对对我这么钟情的人发火啊」"], + ["凯伊姆&吉克", "「你傻啊」"], + ["梅尔特", "「异口同声呢,不亏是兄弟」"], + ["凯伊姆", "「别用这种称呼,怪恶心的」"], + ["吉克", "「说得没错」"], + ["吉克", "「······说起来······」"], + ["梅尔特", "「怎么了?」"], + ["吉克", "「有件事我一直很在意,我和凯伊姆,哪个是哥哥啊?」"], + ["凯伊姆", "「你也说这么无聊的话题」"], + ["吉克", "「不,这是很重要的事情」"], + ["吉克", "「梅尔特,事实是怎么样的?」"], + ["梅尔特", "「啊~是怎么样的呢~」"], + ["梅尔特", "「我忘记了」"], + ["吉克", "「骗人」"], + ]; + } } \ No newline at end of file diff --git a/styles.css b/styles.css index e7ba189..e300825 100644 --- a/styles.css +++ b/styles.css @@ -544,9 +544,9 @@ p#name { } /* 注释下面这三行以开启抗锯齿 */ -.anti-aliasing { +/* .anti-aliasing { image-rendering: pixelated; -} +} */ .warning { transition: left cubic-bezier(0, 0.9, 1, 0.1) 2.5s; From 3f53086c9fd6bba51dc7c200305cc06f5d09fa57 Mon Sep 17 00:00:00 2001 From: strawberry42271 <2806566736@qq.com> Date: Sat, 1 Feb 2025 00:31:19 +0800 Subject: [PATCH 3/5] =?UTF-8?q?=E5=BE=AA=E7=8E=AF=E6=88=98=E6=96=97?= =?UTF-8?q?=E5=8A=A8=E7=94=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- project/plugins.js | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/project/plugins.js b/project/plugins.js index 64da3ac..146dd94 100644 --- a/project/plugins.js +++ b/project/plugins.js @@ -18821,7 +18821,6 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 = ctx.closePath() ctx.fill() - console.log(heronow) core.drawImage(ctx, "hero.webp", 0, @@ -18833,7 +18832,7 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 = 32, 19) - if (heroInfo.now >= 215) { + if (heroInfo.now >= 215 && !heroInfo.isAttack) { heroInfo.isAttack = true; animateOnAttack("sword", true, () => { heroInfo.now -= 215 @@ -18842,7 +18841,7 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 = }) } - if (enemyInfo.now >= 215) { + if (enemyInfo.now >= 215 && !enemyInfo.isAttack) { enemyInfo.isAttack = true animateOnAttack("sword", false, () => { enemyInfo.now -= 215 @@ -18851,7 +18850,7 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 = }) } equipInfo.forEach(v => { - if (v.now >= 215) { + if (v.now >= 215 && !v.isAttack) { v.isAttack = true animateOnAttack("sword", true, () => { From eb19824d5053a0e523c1d6b572c8f0b8285501d9 Mon Sep 17 00:00:00 2001 From: strawberry42271 <2806566736@qq.com> Date: Sat, 1 Feb 2025 09:23:06 +0800 Subject: [PATCH 4/5] =?UTF-8?q?cg=E9=9F=B3=E9=A2=91=E9=87=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- project/plugins.js | 2227 ++++++++++++++++++++++---------------------- 1 file changed, 1113 insertions(+), 1114 deletions(-) diff --git a/project/plugins.js b/project/plugins.js index 146dd94..27f0ea5 100644 --- a/project/plugins.js +++ b/project/plugins.js @@ -1,264 +1,262 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 = { "init": function () { - this._afterLoadResources = function () { - // 本函数将在所有资源加载完毕后,游戏开启前被执行 - core.ui.statusBar.init(); - core.dom.playGame.style.fontFamily = "pala"; - core.dom.loadGame.style.fontFamily = "pala"; - core.dom.CGMode.style.fontFamily = "pala"; - core.dom.musicMode.style.fontFamily = "pala"; - core.dom.replayGame.style.fontFamily = "pala"; - core.registerEvent("changeMouse", function (data) { - if (!main.replayChecking && !core.isReplaying()) - core.changeMouse( - data.icon, - data.div, - data.translate[0], - data.translate[1], - data.scale[0], - data.scale[1], - data.angel, - data.px, - data.py - ); - core.doAction(); - }); - core.registerEvent("removeMouse", function (data) { - if (!main.replayChecking && !core.isReplaying()) - core.removeMouse(data.div); - core.doAction(); - }); - core.registerEvent("addPop", function (data) { - if (!main.replayChecking && !core.isReplaying()) { - data.value = core.replaceText(data.value); - core.addPop( - data.value, - data.px, - data.py, - data.color, - data.boldColor, - data.left, - data.jump, - data.time, - data.show, - data.font, - data.speed - ); - } - core.doAction(); - }); - core.registerEvent("drawWarning", function (data) { - if (!main.replayChecking && !core.isReplaying()) { - data.text = core.replaceText(data.text); - data.text2 = core.replaceText(data.text2); - core.drawWarning( - data.x, - data.y, - data?.text, - data?.text2, - data?.warning, - data.large, - data.size - ); + this._afterLoadResources = function () { + // 本函数将在所有资源加载完毕后,游戏开启前被执行 + core.ui.statusBar.init(); + core.dom.playGame.style.fontFamily = "pala"; + core.dom.loadGame.style.fontFamily = "pala"; + core.dom.CGMode.style.fontFamily = "pala"; + core.dom.musicMode.style.fontFamily = "pala"; + core.dom.replayGame.style.fontFamily = "pala"; + core.registerEvent("changeMouse", function (data) { + if (!main.replayChecking && !core.isReplaying()) + core.changeMouse( + data.icon, + data.div, + data.translate[0], + data.translate[1], + data.scale[0], + data.scale[1], + data.angel, + data.px, + data.py + ); + core.doAction(); + }); + core.registerEvent("removeMouse", function (data) { + if (!main.replayChecking && !core.isReplaying()) + core.removeMouse(data.div); + core.doAction(); + }); + core.registerEvent("addPop", function (data) { + if (!main.replayChecking && !core.isReplaying()) { + data.value = core.replaceText(data.value); + core.addPop( + data.value, + data.px, + data.py, + data.color, + data.boldColor, + data.left, + data.jump, + data.time, + data.show, + data.font, + data.speed + ); + } + core.doAction(); + }); + core.registerEvent("drawWarning", function (data) { + if (!main.replayChecking && !core.isReplaying()) { + data.text = core.replaceText(data.text); + data.text2 = core.replaceText(data.text2); + core.drawWarning( + data.x, + data.y, + data?.text, + data?.text2, + data?.warning, + data.large, + data.size + ); - setTimeout(() => core.doAction(), 3100); - } else { - core.doAction(); - } - }); + setTimeout(() => core.doAction(), 3100); + } else { + core.doAction(); + } + }); - core.registerEvent("over", function (data) { - let image = data.image ?? ""; - let time = data.time ?? 3000; - let sound = data.sound ?? ""; - let textColor = data.textColor ?? "#FFFFFF"; - let boldColor = data.boldColor ?? "#000000"; - let font = data.font ?? "bold 48px Verdana"; - let text = data.text ?? ""; - let hidetime = data.hidetime ?? 100; - if (!main.replayChecking && !core.isReplaying()) { - core.over( - image, - data.memory, - time, - hidetime, - sound, - textColor, - boldColor, - font, - text - ); - } else { - core.doAction(); - } - }); - core.registerEvent("changebg", function (data) { - if (!main.replayChecking && !core.isReplaying()) { - core.changebg( - data.img1, - data.memory1, - data.img2, - data.memory2, - data.time, - data.style - ); - } else { - core.doAction(); - } - }); - core.registerEvent("overlist", function (data) { - if (!main.replayChecking && !core.isReplaying()) { - core.overlist( - data.image, - data.memory, - data.hidetime || 30, - data.list || [ - { - text: "", - sound: "", - time: 50, - textColor: "#FFFFFF", - boldColor: "#000000", - font: "bold 48px Verdana", - frame: 0, - }, - ] - ); - } else { - core.doAction(); - } - }); - core.registerEvent("op", function (data) { - if (!main.replayChecking && !core.isReplaying()) { - core.openvideo(); - } else { - core.doAction(); - } - }); - core.registerEvent("animationDrawable", function (data) { - if (!main.replayChecking && !core.isReplaying()) { - core.animationDrawable( - data.allFarme, - data.color, - data.globalAlpha, - data.imageList, - data.soundList - ); - } else { - core.doAction(); - } - }); - core.registerEvent("setanimate", function (data) { - data.px = data.px ?? 0; - data.py = data.py ?? 0; - core.setanimate( - data.name, - data.px, - data.py, - data.width, - data.height, - data.allFarme, - data.imageList, - data.soundList - ); - core.doAction(); - }); - core.registerEvent("clearanimate", function (data) { - core.plugin.playing.clear(); + core.registerEvent("over", function (data) { + let image = data.image ?? ""; + let time = data.time ?? 3000; + let sound = data.sound ?? ""; + let textColor = data.textColor ?? "#FFFFFF"; + let boldColor = data.boldColor ?? "#000000"; + let font = data.font ?? "bold 48px Verdana"; + let text = data.text ?? ""; + let hidetime = data.hidetime ?? 100; + if (!main.replayChecking && !core.isReplaying()) { + core.over( + image, + data.memory, + time, + hidetime, + sound, + textColor, + boldColor, + font, + text + ); + } else { + core.doAction(); + } + }); + core.registerEvent("changebg", function (data) { + if (!main.replayChecking && !core.isReplaying()) { + core.changebg( + data.img1, + data.memory1, + data.img2, + data.memory2, + data.time, + data.style + ); + } else { + core.doAction(); + } + }); + core.registerEvent("overlist", function (data) { + if (!main.replayChecking && !core.isReplaying()) { + core.overlist( + data.image, + data.memory, + data.hidetime || 30, + data.list || [{ + text: "", + sound: "", + time: 50, + textColor: "#FFFFFF", + boldColor: "#000000", + font: "bold 48px Verdana", + frame: 0, + }, ] + ); + } else { + core.doAction(); + } + }); + core.registerEvent("op", function (data) { + if (!main.replayChecking && !core.isReplaying()) { + core.openvideo(); + } else { + core.doAction(); + } + }); + core.registerEvent("animationDrawable", function (data) { + if (!main.replayChecking && !core.isReplaying()) { + core.animationDrawable( + data.allFarme, + data.color, + data.globalAlpha, + data.imageList, + data.soundList + ); + } else { + core.doAction(); + } + }); + core.registerEvent("setanimate", function (data) { + data.px = data.px ?? 0; + data.py = data.py ?? 0; + core.setanimate( + data.name, + data.px, + data.py, + data.width, + data.height, + data.allFarme, + data.imageList, + data.soundList + ); + core.doAction(); + }); + core.registerEvent("clearanimate", function (data) { + core.plugin.playing.clear(); - core.doAction(); - }); - core.registerEvent("deleteanimate", function (data) { - core.deleteanimate(data.name); - core.doAction(); - }); - core.registerEvent("playanimate", function (data) { - if (!main.replayChecking && !core.isReplaying()) { - data.x = data.x ?? 0; - data.y = data.y ?? 0; - data.scalex = data.scalex ?? 1; - data.scaley = data.scaley ?? 1; - core.playanimate( - data.name, - data.x, - data.y, - data.hero, - data.scalex, - data.scaley - ); - core.doAction(); - } else { - core.doAction(); - } - }); - core.registerEvent("cgtextList", function (data) { - core.ui.cgText.textList = core.plugin[data.textList]; - core.doAction(); - }); - core.registerEvent("cgtext", function (data) { - if (!main.replayChecking && !core.isReplaying()) { - core.ui.cgText.image = data.bg; - core.ui.cgText.memory = data.memory; - core.ui.cgText.head = core.clone(data.head); - core.ui.cgText.index = data.index; - core.ui.cgText.name = core.ui.cgText.textList[data.index][0]; - core.ui.cgText.text = data.text - ? data.text - : core.ui.cgText.textList[data.index][1]; - core.ui.cgText.time = data.time; - core.ui.cgText.wait = data.wait; - core.ui.cgText.WindowSkin = data.WindowSkin; - core.ui.cgText.sound = data.sound || ""; - core.ui.cgText.bodyList = core.clone(data.bodyList); - main.dom.cgText.style.display = "block"; - core.ui.cgText.update(); - } else { - core.doAction(); - } - }); - core.registerEvent("introAndLoop", function (data) { - if (!main.replayChecking && !core.isReplaying()) { - core.plugin.introAndLoop(data.intro, data.time, data.loop); - core.doAction(); - } else { - core.doAction(); - } - }); - core.registerEvent("setq", function (data) { - core.setFlag("任务地点", data.id); + core.doAction(); + }); + core.registerEvent("deleteanimate", function (data) { + core.deleteanimate(data.name); + core.doAction(); + }); + core.registerEvent("playanimate", function (data) { + if (!main.replayChecking && !core.isReplaying()) { + data.x = data.x ?? 0; + data.y = data.y ?? 0; + data.scalex = data.scalex ?? 1; + data.scaley = data.scaley ?? 1; + core.playanimate( + data.name, + data.x, + data.y, + data.hero, + data.scalex, + data.scaley + ); + core.doAction(); + } else { + core.doAction(); + } + }); + core.registerEvent("cgtextList", function (data) { + core.ui.cgText.textList = core.plugin[data.textList]; + core.doAction(); + }); + core.registerEvent("cgtext", function (data) { + if (!main.replayChecking && !core.isReplaying()) { + core.ui.cgText.image = data.bg; + core.ui.cgText.memory = data.memory; + core.ui.cgText.head = core.clone(data.head); + core.ui.cgText.index = data.index; + core.ui.cgText.name = core.ui.cgText.textList[data.index][0]; + core.ui.cgText.text = data.text ? + data.text : + core.ui.cgText.textList[data.index][1]; + core.ui.cgText.time = data.time; + core.ui.cgText.wait = data.wait; + core.ui.cgText.WindowSkin = data.WindowSkin; + core.ui.cgText.sound = data.sound === "" ? data.sound : core.ui.cgText.textList[data.index][3] || ""; + core.ui.cgText.bodyList = core.clone(data.bodyList); + main.dom.cgText.style.display = "block"; + core.ui.cgText.update(); + } else { + core.doAction(); + } + }); + core.registerEvent("introAndLoop", function (data) { + if (!main.replayChecking && !core.isReplaying()) { + core.plugin.introAndLoop(data.intro, data.time, data.loop); + core.doAction(); + } else { + core.doAction(); + } + }); + core.registerEvent("setq", function (data) { + core.setFlag("任务地点", data.id); - core.doAction(); - }); + core.doAction(); + }); - core.registerEvent("setmusics", function (data) { - if ( - (core.getLocalStorage("musics") && - core.getLocalStorage("musics").length === 0) || - !core.getLocalStorage("musics") - ) - core.setLocalStorage("musics", ["theme.mp3"]); - let a = core.getLocalStorage("musics"); - if (!data.bgm) { - core.setLocalStorage("musics", ["theme.mp3"]); - } else { - if (!a.includes(data.bgm)) a.push(data.bgm); - core.setLocalStorage("musics", a); - } - core.doAction(); - }); - core.registerEvent("setcgs", function (data) { - if (!data.img) { - core.setLocalStorage("cgs", []); - } else { - let a = core.getLocalStorage("cgs") ?? []; - if (!a.includes(data.img)) a.push(data.img); - core.setLocalStorage("cgs", a); - } - core.doAction(); - }); - }; - }, + core.registerEvent("setmusics", function (data) { + if ( + (core.getLocalStorage("musics") && + core.getLocalStorage("musics").length === 0) || + !core.getLocalStorage("musics") + ) + core.setLocalStorage("musics", ["theme.mp3"]); + let a = core.getLocalStorage("musics"); + if (!data.bgm) { + core.setLocalStorage("musics", ["theme.mp3"]); + } else { + if (!a.includes(data.bgm)) a.push(data.bgm); + core.setLocalStorage("musics", a); + } + core.doAction(); + }); + core.registerEvent("setcgs", function (data) { + if (!data.img) { + core.setLocalStorage("cgs", []); + } else { + let a = core.getLocalStorage("cgs") ?? []; + if (!a.includes(data.img)) a.push(data.img); + core.setLocalStorage("cgs", a); + } + core.doAction(); + }); + }; +}, "drawLight": function () { // 绘制灯光/漆黑层效果。调用方式 core.plugin.drawLight(...) // 【参数说明】 @@ -14994,901 +14992,902 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 = }; }, "剧情cg": function () { - // 在此增加新插件 - // 在此增加新插件 - const cg = document.createElement("canvas"); //cg画布设置 - cg.style.position = "absolute"; - cg.style.zIndex = 300; - cg.style.display = "none"; - cg.id = "cgText"; - main.dom.gameGroup.insertAdjacentElement("afterend", cg); - cg.style.top = "50%"; - cg.style.left = "50%"; - cg.style.transform = "translate(-50%,-50%)"; - const ctx = cg.getContext("2d"); - main.dom.cgText = cg; - const logcanvas = document.createElement("canvas"); //cg画布设置 - logcanvas.style.position = "absolute"; - logcanvas.style.zIndex = 301; - logcanvas.style.display = "none"; - logcanvas.id = "cgText"; - main.dom.gameGroup.insertAdjacentElement("afterend", logcanvas); - logcanvas.style.top = "50%"; - logcanvas.style.left = "50%"; - logcanvas.style.transform = "translate(-50%,-50%)"; - const logctx = logcanvas.getContext("2d"); - main.dom.logcanvas = logcanvas; - logcanvas.onmouseup = function (e) { - //鼠标抬起 + // 在此增加新插件 + // 在此增加新插件 + const cg = document.createElement("canvas"); //cg画布设置 + cg.style.position = "absolute"; + cg.style.zIndex = 300; + cg.style.display = "none"; + cg.id = "cgText"; + main.dom.gameGroup.insertAdjacentElement("afterend", cg); + cg.style.top = "50%"; + cg.style.left = "50%"; + cg.style.transform = "translate(-50%,-50%)"; + const ctx = cg.getContext("2d"); + main.dom.cgText = cg; + const logcanvas = document.createElement("canvas"); //cg画布设置 + logcanvas.style.position = "absolute"; + logcanvas.style.zIndex = 301; + logcanvas.style.display = "none"; + logcanvas.id = "cgText"; + main.dom.gameGroup.insertAdjacentElement("afterend", logcanvas); + logcanvas.style.top = "50%"; + logcanvas.style.left = "50%"; + logcanvas.style.transform = "translate(-50%,-50%)"; + const logctx = logcanvas.getContext("2d"); + main.dom.logcanvas = logcanvas; + logcanvas.onmouseup = function (e) { + //鼠标抬起 - try { - if (!core.isPlaying()) return false; - core.unregisterAnimationFrame("skip"); - let a = core.getFlag("skip", false); - core.setFlag("skip", false); - if (a) { - const data = core.clone(core.status.event.data.current); + try { + if (!core.isPlaying()) return false; + core.unregisterAnimationFrame("skip"); + let a = core.getFlag("skip", false); + core.setFlag("skip", false); + if (a) { + const data = core.clone(core.status.event.data.current); - core.insertAction(data); - core.doAction(); - } - } catch (ee) { - console.error(ee); - } - }; - logcanvas.onmousedown = function (e) { - //鼠标按下 - try { - if (!core.isPlaying()) return false; - const left = core.dom.gameGroup.offsetLeft; - const top = core.dom.gameGroup.offsetTop; - const px = Math.floor((e.clientX - left) / core.domStyle.scale), - py = Math.floor((e.clientY - top) / core.domStyle.scale); - core.ui.cgText.click(px * 3, py * 3); - } catch (ee) { - main.log(ee); - } - }; - logcanvas.ontouchend = function (e) { - //触摸抬起 + core.insertAction(data); + core.doAction(); + } + } catch (ee) { + console.error(ee); + } + }; + logcanvas.onmousedown = function (e) { + //鼠标按下 + try { + if (!core.isPlaying()) return false; + const left = core.dom.gameGroup.offsetLeft; + const top = core.dom.gameGroup.offsetTop; + const px = Math.floor((e.clientX - left) / core.domStyle.scale), + py = Math.floor((e.clientY - top) / core.domStyle.scale); + core.ui.cgText.click(px * 3, py * 3); + } catch (ee) { + main.log(ee); + } + }; + logcanvas.ontouchend = function (e) { + //触摸抬起 - try { - if (!core.isPlaying()) return false; - core.unregisterAnimationFrame("skip"); - core.setFlag("skip", false); - let a = core.getFlag("skip", false); - core.setFlag("skip", false); - if (a) { - const data = core.clone(core.status.event.data.current); + try { + if (!core.isPlaying()) return false; + core.unregisterAnimationFrame("skip"); + core.setFlag("skip", false); + let a = core.getFlag("skip", false); + core.setFlag("skip", false); + if (a) { + const data = core.clone(core.status.event.data.current); - core.insertAction(data); - core.doAction(); - } - } catch (ee) {} - }; - logcanvas.ontouchstart = function (e) { - //触摸按下 - try { - if (!core.isPlaying()) return false; - const left = core.dom.gameGroup.offsetLeft; - const top = core.dom.gameGroup.offsetTop; - const px = Math.floor( - (e.targetTouches[0].clientX - left) / core.domStyle.scale - ), - py = Math.floor( - (e.targetTouches[0].clientY - top) / core.domStyle.scale - ); - core.ui.cgText.click(px * 3, py * 3); - } catch (ee) { - main.log(ee); - } - }; - cg.onmouseup = function (e) { - //鼠标抬起 + core.insertAction(data); + core.doAction(); + } + } catch (ee) {} + }; + logcanvas.ontouchstart = function (e) { + //触摸按下 + try { + if (!core.isPlaying()) return false; + const left = core.dom.gameGroup.offsetLeft; + const top = core.dom.gameGroup.offsetTop; + const px = Math.floor( + (e.targetTouches[0].clientX - left) / core.domStyle.scale + ), + py = Math.floor( + (e.targetTouches[0].clientY - top) / core.domStyle.scale + ); + core.ui.cgText.click(px * 3, py * 3); + } catch (ee) { + main.log(ee); + } + }; + cg.onmouseup = function (e) { + //鼠标抬起 - try { - if (!core.isPlaying()) return false; - core.unregisterAnimationFrame("skip"); - let a = core.getFlag("skip", false); - core.setFlag("skip", false); - if (a) { - const data = core.clone(core.status.event.data.current); + try { + if (!core.isPlaying()) return false; + core.unregisterAnimationFrame("skip"); + let a = core.getFlag("skip", false); + core.setFlag("skip", false); + if (a) { + const data = core.clone(core.status.event.data.current); - core.insertAction(data); - core.doAction(); - } - } catch (ee) { - console.error(ee); - } - }; - cg.onmousedown = function (e) { - //鼠标按下 - try { - if (!core.isPlaying()) return false; - const left = core.dom.gameGroup.offsetLeft; - const top = core.dom.gameGroup.offsetTop; - const px = Math.floor((e.clientX - left) / core.domStyle.scale), - py = Math.floor((e.clientY - top) / core.domStyle.scale); - core.ui.cgText.click(px * 3, py * 3); - } catch (ee) { - main.log(ee); - } - }; - cg.ontouchend = function (e) { - //触摸抬起 + core.insertAction(data); + core.doAction(); + } + } catch (ee) { + console.error(ee); + } + }; + cg.onmousedown = function (e) { + //鼠标按下 + try { + if (!core.isPlaying()) return false; + const left = core.dom.gameGroup.offsetLeft; + const top = core.dom.gameGroup.offsetTop; + const px = Math.floor((e.clientX - left) / core.domStyle.scale), + py = Math.floor((e.clientY - top) / core.domStyle.scale); + core.ui.cgText.click(px * 3, py * 3); + } catch (ee) { + main.log(ee); + } + }; + cg.ontouchend = function (e) { + //触摸抬起 - try { - if (!core.isPlaying()) return false; - core.unregisterAnimationFrame("skip"); - core.setFlag("skip", false); - let a = core.getFlag("skip", false); - core.setFlag("skip", false); - if (a) { - const data = core.clone(core.status.event.data.current); + try { + if (!core.isPlaying()) return false; + core.unregisterAnimationFrame("skip"); + core.setFlag("skip", false); + let a = core.getFlag("skip", false); + core.setFlag("skip", false); + if (a) { + const data = core.clone(core.status.event.data.current); - core.insertAction(data); - core.doAction(); - } - } catch (ee) { - console.error(ee); - } - }; - cg.ontouchstart = function (e) { - //触摸按下 - try { - if (!core.isPlaying()) return false; - const left = core.dom.gameGroup.offsetLeft; - const top = core.dom.gameGroup.offsetTop; - const px = Math.floor( - (e.targetTouches[0].clientX - left) / core.domStyle.scale - ), - py = Math.floor( - (e.targetTouches[0].clientY - top) / core.domStyle.scale - ); - core.ui.cgText.click(px * 3, py * 3); - } catch (ee) { - main.log(ee); - } - }; - let auto = false; + core.insertAction(data); + core.doAction(); + } + } catch (ee) { + console.error(ee); + } + }; + cg.ontouchstart = function (e) { + //触摸按下 + try { + if (!core.isPlaying()) return false; + const left = core.dom.gameGroup.offsetLeft; + const top = core.dom.gameGroup.offsetTop; + const px = Math.floor( + (e.targetTouches[0].clientX - left) / core.domStyle.scale + ), + py = Math.floor( + (e.targetTouches[0].clientY - top) / core.domStyle.scale + ); + core.ui.cgText.click(px * 3, py * 3); + } catch (ee) { + main.log(ee); + } + }; + let auto = false; - class cgText { - constructor() { - //绘制需要的变量 - this.image = ""; - this.head = { name: "face_050445.webp", px: -300 }; - this.bodyList = [ - { name: "tati_050145a.webp", px: 100, filter: false }, - { name: "tati_120124.webp", px: 1100, filter: true }, - ]; - this.name = ""; - this.text = ""; - this.time = 0; - this.WindowSkin = false; - this.sound = ""; - this.beforeSound = 0; - this.wait = 1000; - this.memory = false; - this.textList = []; - this.page = 1; - this.overpage = 1; - this.log = false; - this.index = 0; - } - click(px, py) { - //点击效果 + class cgText { + constructor() { + //绘制需要的变量 + this.image = ""; + this.head = { name: "face_050445.webp", px: -300 }; + this.bodyList = [ + { name: "tati_050145a.webp", px: 100, filter: false }, + { name: "tati_120124.webp", px: 1100, filter: true }, + ]; + this.name = ""; + this.text = ""; + this.time = 0; + this.WindowSkin = false; + this.sound = ""; + this.beforeSound = 0; + this.wait = 1000; + this.memory = false; + this.textList = []; + this.page = 1; + this.overpage = 1; + this.log = false; + this.index = 0; + } + click(px, py) { + //点击效果 - const makeBox = ([x, y], [w, h]) => { - return [ - [x, y], - [x + w, y + h], - ]; - }; - const inRect = ([x, y], [[sx, sy], [dx, dy]]) => { - return sx <= x && x <= dx && sy <= y && y <= dy; - }; - const pos = [px, py]; - const savebox = makeBox([1700, 1100], [192, 96]); - const saveboxVertical = makeBox([52, 1700], [96, 192]); - const skipbox = makeBox([1700, 1000], [192, 96]); - const skipboxVertical = makeBox([152, 1700], [96, 192]); - const autobox = makeBox([1700, 900], [192, 96]); - const autoboxVertical = makeBox([252, 1700], [96, 192]); - const textbox = makeBox([1700, 800], [192, 96]); - const textboxVertical = makeBox([352, 1700], [96, 192]); - const backbox = makeBox([15, 35], [210, 90]); - const backboxVertical = makeBox([1123, 15], [90, 210]); - const pageupbox = makeBox([300, 1130], [200, 100]); - const pageupboxVertical = makeBox([18, 300], [100, 200]); - const pagedownbox = makeBox([1500, 1130], [200, 100]); - const pagedownboxVertical = makeBox([18, 1500], [100, 200]); - if (this.log) { - if ( - (core.domStyle.isVertical && inRect(pos, backboxVertical)) || - (!core.domStyle.isVertical && inRect(pos, backbox)) - ) { - core.clearMap(logctx); - main.dom.logcanvas.style.display = "none"; - this.log = false; - } else if ( - (core.domStyle.isVertical && inRect(pos, pageupboxVertical)) || - (!core.domStyle.isVertical && inRect(pos, pageupbox)) - ) { - core.clearMap(logctx); - if (this.page > 1) this.page--; - this.logdraw(this.page); - } else if ( - (core.domStyle.isVertical && inRect(pos, pagedownboxVertical)) || - (!core.domStyle.isVertical && inRect(pos, pagedownbox)) - ) { - core.clearMap(logctx); - if (this.page < this.overpage) this.page++; - this.logdraw(this.page); - } - } else { - if ( - (core.domStyle.isVertical && - inRect(pos, skipboxVertical) && - !this.WindowSkin) || - (!core.domStyle.isVertical && - !this.WindowSkin && - inRect(pos, skipbox)) - ) { - auto = false; - let time = 0; - core.stopSound(this.beforeSound); - core.registerAnimationFrame("skip", true, (timestamp) => { - if (timestamp > time + 50) { - time = timestamp; - if ( - core.status.event.id == "action" && - core.status.event.data.type == "cgtext" - ) { - core.setFlag("skip", true); - main.dom.cgText.style.display = "none"; - core.doAction(); - } - } - }); - } else if ( - (core.domStyle.isVertical && - inRect(pos, textboxVertical) && - !this.WindowSkin) || - (!core.domStyle.isVertical && - !this.WindowSkin && - inRect(pos, textbox)) - ) { - auto = false; - this.log = true; - this.overpage = Math.floor(this.index / 6) + 1; - this.page = this.overpage; - logcanvas.style.display = "block"; - const data = core.clone(core.status.event.data.current); - data.showAll = true; - data.time = 0; - data.text = this.text.replaceAll(/(\\(z))(\[.*?\])?/g, ""); //去除打字机暂停效果 - data.sound = ""; - core.insertAction(data); - core.doAction(); - this.logdraw(this.page); - } else if ( - (core.domStyle.isVertical && - inRect(pos, autoboxVertical) && - !this.WindowSkin) || - (!core.domStyle.isVertical && - !this.WindowSkin && - inRect(pos, autobox)) - ) { - auto = !auto; + const makeBox = ([x, y], [w, h]) => { + return [ + [x, y], + [x + w, y + h], + ]; + }; + const inRect = ([x, y], [ + [sx, sy], + [dx, dy] + ]) => { + return sx <= x && x <= dx && sy <= y && y <= dy; + }; + const pos = [px, py]; + const savebox = makeBox([1700, 1100], [192, 96]); + const saveboxVertical = makeBox([52, 1700], [96, 192]); + const skipbox = makeBox([1700, 1000], [192, 96]); + const skipboxVertical = makeBox([152, 1700], [96, 192]); + const autobox = makeBox([1700, 900], [192, 96]); + const autoboxVertical = makeBox([252, 1700], [96, 192]); + const textbox = makeBox([1700, 800], [192, 96]); + const textboxVertical = makeBox([352, 1700], [96, 192]); + const backbox = makeBox([15, 35], [210, 90]); + const backboxVertical = makeBox([1123, 15], [90, 210]); + const pageupbox = makeBox([300, 1130], [200, 100]); + const pageupboxVertical = makeBox([18, 300], [100, 200]); + const pagedownbox = makeBox([1500, 1130], [200, 100]); + const pagedownboxVertical = makeBox([18, 1500], [100, 200]); + if (this.log) { + if ( + (core.domStyle.isVertical && inRect(pos, backboxVertical)) || + (!core.domStyle.isVertical && inRect(pos, backbox)) + ) { + core.clearMap(logctx); + main.dom.logcanvas.style.display = "none"; + this.log = false; + } else if ( + (core.domStyle.isVertical && inRect(pos, pageupboxVertical)) || + (!core.domStyle.isVertical && inRect(pos, pageupbox)) + ) { + core.clearMap(logctx); + if (this.page > 1) this.page--; + this.logdraw(this.page); + } else if ( + (core.domStyle.isVertical && inRect(pos, pagedownboxVertical)) || + (!core.domStyle.isVertical && inRect(pos, pagedownbox)) + ) { + core.clearMap(logctx); + if (this.page < this.overpage) this.page++; + this.logdraw(this.page); + } + } else { + if ( + (core.domStyle.isVertical && + inRect(pos, skipboxVertical) && + !this.WindowSkin) || + (!core.domStyle.isVertical && + !this.WindowSkin && + inRect(pos, skipbox)) + ) { + auto = false; + let time = 0; + core.stopSound(this.beforeSound); + core.registerAnimationFrame("skip", true, (timestamp) => { + if (timestamp > time + 50) { + time = timestamp; + if ( + core.status.event.id == "action" && + core.status.event.data.type == "cgtext" + ) { + core.setFlag("skip", true); + main.dom.cgText.style.display = "none"; + core.doAction(); + } + } + }); + } else if ( + (core.domStyle.isVertical && + inRect(pos, textboxVertical) && + !this.WindowSkin) || + (!core.domStyle.isVertical && + !this.WindowSkin && + inRect(pos, textbox)) + ) { + auto = false; + this.log = true; + this.overpage = Math.floor(this.index / 6) + 1; + this.page = this.overpage; + logcanvas.style.display = "block"; + const data = core.clone(core.status.event.data.current); + data.showAll = true; + data.time = 0; + data.text = this.text.replaceAll(/(\\(z))(\[.*?\])?/g, ""); //去除打字机暂停效果 + data.sound = ""; + core.insertAction(data); + core.doAction(); + this.logdraw(this.page); + } else if ( + (core.domStyle.isVertical && + inRect(pos, autoboxVertical) && + !this.WindowSkin) || + (!core.domStyle.isVertical && + !this.WindowSkin && + inRect(pos, autobox)) + ) { + auto = !auto; - const data = core.clone(core.status.event.data.current); - data.showAll = true; - data.time = 0; - data.text = this.text.replaceAll(/(\\(z))(\[.*?\])?/g, ""); //去除打字机暂停效果 - data.sound = ""; - core.insertAction(data); - core.doAction(); - } else if ( - (core.domStyle.isVertical && - inRect(pos, saveboxVertical) && - !this.WindowSkin) || - (!core.domStyle.isVertical && - !this.WindowSkin && - inRect(pos, savebox)) - ) { - //存档 - auto = false; - if (core.status.event.animateUI) return; - if (core.status.event.interval != null) return; - const current = core.clone(core.status.event.data.current); - current.showAll = true; - current.time = 0; - current.sound = ""; - current.text = this.text.replaceAll(/(\\(z))(\[.*?\])?/g, ""); //去除当前事件所有打字机效果 - cg.style.display = "none"; - const data = [{ type: "callSave" }, current]; //插入存档事件 - core.insertAction(data); + const data = core.clone(core.status.event.data.current); + data.showAll = true; + data.time = 0; + data.text = this.text.replaceAll(/(\\(z))(\[.*?\])?/g, ""); //去除打字机暂停效果 + data.sound = ""; + core.insertAction(data); + core.doAction(); + } else if ( + (core.domStyle.isVertical && + inRect(pos, saveboxVertical) && + !this.WindowSkin) || + (!core.domStyle.isVertical && + !this.WindowSkin && + inRect(pos, savebox)) + ) { + //存档 + auto = false; + if (core.status.event.animateUI) return; + if (core.status.event.interval != null) return; + const current = core.clone(core.status.event.data.current); + current.showAll = true; + current.time = 0; + current.sound = ""; + current.text = this.text.replaceAll(/(\\(z))(\[.*?\])?/g, ""); //去除当前事件所有打字机效果 + cg.style.display = "none"; + const data = [{ type: "callSave" }, current]; //插入存档事件 + core.insertAction(data); - core.doAction(); - } else if (!core.status.event.data) { - cg.style.display = "none"; - core.ui._animateUI("hide", null, () => { - core.doAction(); - }); - } else { - // 正在淡入淡出的话不执行 - if (core.status.event.animateUI) return; - auto = false; + core.doAction(); + } else if (!core.status.event.data) { + cg.style.display = "none"; + core.ui._animateUI("hide", null, () => { + core.doAction(); + }); + } else { + // 正在淡入淡出的话不执行 + if (core.status.event.animateUI) return; + auto = false; - // 打字机效果显示全部文字 - if (core.status.event.interval != null) { - const data = core.clone(core.status.event.data?.current); - data.showAll = true; - data.time = 0; - data.text = this.text.replaceAll(/(\\(z))(\[.*?\])?/g, ""); //去除打字机暂停效果 - data.sound = ""; - core.insertAction(data); - core.doAction(); - return; - } else { - core.stopSound(this.beforeSound); - } + // 打字机效果显示全部文字 + if (core.status.event.interval != null) { + const data = core.clone(core.status.event.data?.current); + data.showAll = true; + data.time = 0; + data.text = this.text.replaceAll(/(\\(z))(\[.*?\])?/g, ""); //去除打字机暂停效果 + data.sound = ""; + core.insertAction(data); + core.doAction(); + return; + } else { + core.stopSound(this.beforeSound); + } - cg.style.display = "none"; - core.ui._animateUI("hide", null, () => { - core.doAction(); - }); - } - } - } + cg.style.display = "none"; + core.ui._animateUI("hide", null, () => { + core.doAction(); + }); + } + } + } - drawTextContent(ctx, content, config) { - //绘制多行文字并执行打字机效果 + drawTextContent(ctx, content, config) { + //绘制多行文字并执行打字机效果 - ctx = core.getContextByName(ctx); - // 设置默认配置项 - var textAttribute = - core.status.textAttribute || core.initStatus.textAttribute; - var globalAttribute = - core.status.globalAttribute || core.initStatus.globalAttribute; - config = core.clone(config || {}); - config.left = config.left || 0; - config.right = - config.left + (config.maxWidth == null ? core._PX_ : config.maxWidth); - config.top = config.top || 0; - config.color = core.arrayToRGBA(config.color || textAttribute.text); - if (config.bold == null) config.bold = textAttribute.bold; - config.italic = config.italic || false; - config.align = config.align || textAttribute.align || "left"; - config.fontSize = config.fontSize || textAttribute.textfont; - config.lineHeight = config.lineHeight || config.fontSize * 1.3; - config.defaultFont = config.font = config.font || globalAttribute.font; - config.time = config.time || 0; - config.letterSpacing = - config.letterSpacing == null - ? textAttribute.letterSpacing || 0 - : config.letterSpacing; + ctx = core.getContextByName(ctx); + // 设置默认配置项 + var textAttribute = + core.status.textAttribute || core.initStatus.textAttribute; + var globalAttribute = + core.status.globalAttribute || core.initStatus.globalAttribute; + config = core.clone(config || {}); + config.left = config.left || 0; + config.right = + config.left + (config.maxWidth == null ? core._PX_ : config.maxWidth); + config.top = config.top || 0; + config.color = core.arrayToRGBA(config.color || textAttribute.text); + if (config.bold == null) config.bold = textAttribute.bold; + config.italic = config.italic || false; + config.align = config.align || textAttribute.align || "left"; + config.fontSize = config.fontSize || textAttribute.textfont; + config.lineHeight = config.lineHeight || config.fontSize * 1.3; + config.defaultFont = config.font = config.font || globalAttribute.font; + config.time = config.time || 0; + config.letterSpacing = + config.letterSpacing == null ? + textAttribute.letterSpacing || 0 : + config.letterSpacing; - config.index = 0; - config.currcolor = config.color; - config.currfont = config.fontSize; - config.lineMargin = Math.max( - Math.round(config.fontSize / 4), - config.lineHeight - config.fontSize - ); - config.topMargin = parseInt(config.lineMargin / 2); - config.lineMaxHeight = config.lineMargin + config.fontSize; - config.offsetX = 0; - config.offsetY = 0; - config.line = 0; - config.blocks = []; - config.isHD = ctx == null || ctx.canvas.hasAttribute("isHD"); + config.index = 0; + config.currcolor = config.color; + config.currfont = config.fontSize; + config.lineMargin = Math.max( + Math.round(config.fontSize / 4), + config.lineHeight - config.fontSize + ); + config.topMargin = parseInt(config.lineMargin / 2); + config.lineMaxHeight = config.lineMargin + config.fontSize; + config.offsetX = 0; + config.offsetY = 0; + config.line = 0; + config.blocks = []; + config.isHD = ctx == null || ctx.canvas.hasAttribute("isHD"); - // 创建一个新的临时画布 - var tempCtx = document.createElement("canvas").getContext("2d"); - if (config.isHD && ctx) { - core.maps._setHDCanvasSize( - tempCtx, - ctx.canvas.width, - ctx.canvas.height - ); - } else { - tempCtx.canvas.width = ctx == null ? 1 : ctx.canvas.width; - tempCtx.canvas.height = ctx == null ? 1 : ctx.canvas.height; - } + // 创建一个新的临时画布 + var tempCtx = document.createElement("canvas").getContext("2d"); + if (config.isHD && ctx) { + core.maps._setHDCanvasSize( + tempCtx, + ctx.canvas.width, + ctx.canvas.height + ); + } else { + tempCtx.canvas.width = ctx == null ? 1 : ctx.canvas.width; + tempCtx.canvas.height = ctx == null ? 1 : ctx.canvas.height; + } - tempCtx.textBaseline = "top"; - tempCtx.font = core.ui._buildFont( - config.fontSize, - config.bold, - config.italic, - config.font - ); - tempCtx.fillStyle = config.color; - config = this._drawTextContent_draw(ctx, tempCtx, content, config); - return config; - } - _drawTextContent_draw(ctx, tempCtx, content, config) { - // Step 1: 绘制到tempCtx上,并记录下图块信息 - while (core.ui._drawTextContent_next(tempCtx, content, config)); + tempCtx.textBaseline = "top"; + tempCtx.font = core.ui._buildFont( + config.fontSize, + config.bold, + config.italic, + config.font + ); + tempCtx.fillStyle = config.color; + config = this._drawTextContent_draw(ctx, tempCtx, content, config); + return config; + } + _drawTextContent_draw(ctx, tempCtx, content, config) { + // Step 1: 绘制到tempCtx上,并记录下图块信息 + while (core.ui._drawTextContent_next(tempCtx, content, config)); - if (ctx == null) return config; + if (ctx == null) return config; - // Step 2: 从tempCtx绘制到画布上 - config.index = 0; - var _drawNext = function () { - if (config.index >= config.blocks.length) return false; - var block = config.blocks[config.index++]; - if (block != null) { - // It works, why? - const scale = config.isHD - ? devicePixelRatio * core.domStyle.scale - : 1; - ctx.restore(); - ctx.save(); //保存设置 - if (core.domStyle.isVertical) { - ctx.translate(1248, 0); //重新定位右上角为基准 - ctx.rotate(Math.PI / 2); //旋转90度 - } - ctx.drawImage( - tempCtx.canvas, - block.left * scale, - block.top * scale, - block.width * scale, - block.height * scale, - config.left + block.left + block.marginLeft, - config.top + block.top + block.marginTop, - block.width, - block.height - ); - ctx.restore(); - } - return true; - }; + // Step 2: 从tempCtx绘制到画布上 + config.index = 0; + var _drawNext = function () { + if (config.index >= config.blocks.length) return false; + var block = config.blocks[config.index++]; + if (block != null) { + // It works, why? + const scale = config.isHD ? + devicePixelRatio * core.domStyle.scale : + 1; + ctx.restore(); + ctx.save(); //保存设置 + if (core.domStyle.isVertical) { + ctx.translate(1248, 0); //重新定位右上角为基准 + ctx.rotate(Math.PI / 2); //旋转90度 + } + ctx.drawImage( + tempCtx.canvas, + block.left * scale, + block.top * scale, + block.width * scale, + block.height * scale, + config.left + block.left + block.marginLeft, + config.top + block.top + block.marginTop, + block.width, + block.height + ); + ctx.restore(); + } + return true; + }; - if (config.time == 0) { - while (_drawNext()); + if (config.time == 0) { + while (_drawNext()); - if ( - (auto && !core.ui.cgText.WindowSkin && !core.ui.cgText.sound) || - (core.ui.cgText.sound && !core.musicStatus.soundStatus) - ) { - setTimeout(() => { - if (auto) { - cg.style.display = "none"; - core.ui._animateUI("hide", null, () => { - core.doAction(); - }); - } - }, core.ui.cgText.wait); - } - } else { - clearInterval(core.status.event.interval); - core.status.event.interval = setInterval(function () { - if (!_drawNext()) { - clearInterval(core.status.event.interval); - core.status.event.interval = null; + if ( + (auto && !core.ui.cgText.WindowSkin && !core.ui.cgText.sound) || + (core.ui.cgText.sound && !core.musicStatus.soundStatus) + ) { + setTimeout(() => { + if (auto) { + cg.style.display = "none"; + core.ui._animateUI("hide", null, () => { + core.doAction(); + }); + } + }, core.ui.cgText.wait); + } + } else { + clearInterval(core.status.event.interval); + core.status.event.interval = setInterval(function () { + if (!_drawNext()) { + clearInterval(core.status.event.interval); + core.status.event.interval = null; - if ( - (auto && !core.ui.cgText.WindowSkin && !core.ui.cgText.sound) || - (core.ui.cgText.sound && !core.musicStatus.soundStatus) - ) - setTimeout(() => { - if (auto) { - cg.style.display = "none"; - core.ui._animateUI("hide", null, () => { - core.doAction(); - }); - } - }, core.ui.cgText.wait); - } - }, config.time); - } + if ( + (auto && !core.ui.cgText.WindowSkin && !core.ui.cgText.sound) || + (core.ui.cgText.sound && !core.musicStatus.soundStatus) + ) + setTimeout(() => { + if (auto) { + cg.style.display = "none"; + core.ui._animateUI("hide", null, () => { + core.doAction(); + }); + } + }, core.ui.cgText.wait); + } + }, config.time); + } - return config; - } + return config; + } - update() { - this.background(); - if (this.log) this.logdraw(this.page); - } - logdraw(page) { - if (core.domStyle.isVertical) { - logctx.canvas.width = 1248; - logctx.canvas.height = 2028; - logctx.save(); //保存设置 - logctx.translate(1248, 0); //重新定位右上角为基准 - logctx.rotate(Math.PI / 2); //旋转90度 - } else { - logctx.canvas.width = 2028; - logctx.canvas.height = 1248; - } - core.fillRect(logctx, 0, 0, 2028, 1248, "rgba(0,0,0,0.5)"); - core.setTextAlign(logctx, "center"); - core.fillBoldText1( - logctx, - "◀离开", - 110, - 100, - "#FFFFFF", - "#000000", - 6, - core.ui._buildFont(66, true) - ); - logctx.strokeStyle = "#FFFFFF"; - logctx.lineWidth = 3; - logctx.beginPath(); - logctx.moveTo(100, 150); - logctx.lineTo(1928, 150); + update() { + this.background(); + if (this.log) this.logdraw(this.page); + } + logdraw(page) { + if (core.domStyle.isVertical) { + logctx.canvas.width = 1248; + logctx.canvas.height = 2028; + logctx.save(); //保存设置 + logctx.translate(1248, 0); //重新定位右上角为基准 + logctx.rotate(Math.PI / 2); //旋转90度 + } else { + logctx.canvas.width = 2028; + logctx.canvas.height = 1248; + } + core.fillRect(logctx, 0, 0, 2028, 1248, "rgba(0,0,0,0.5)"); + core.setTextAlign(logctx, "center"); + core.fillBoldText1( + logctx, + "◀离开", + 110, + 100, + "#FFFFFF", + "#000000", + 6, + core.ui._buildFont(66, true) + ); + logctx.strokeStyle = "#FFFFFF"; + logctx.lineWidth = 3; + logctx.beginPath(); + logctx.moveTo(100, 150); + logctx.lineTo(1928, 150); - logctx.stroke(); - let posy = 150; - const indexList = this.textList; - core.setTextAlign(logctx, "left"); - for ( - let i = (page - 1) * 6; - i <= Math.min(this.index, page * 6 - 1); - i++ - ) { - const text = this.textList[i][1].replaceAll( - /(\\(d|e|f|g|i|n|r|b|c|t|z))(\[.*?\])?/g, - "" - ); //取消打字机 - const name = this.textList[i][0] - ? "【" + this.textList[i][0] + "】" - : ""; - if (name) { - core.fillBoldText1( - logctx, - name, - 150, - posy + 50, - "#FFFFFF", - "#000000", - 6, - core.ui._buildFont(42, true) - ); - } - if (text.length < 30) { - core.fillBoldText1( - logctx, - text, - 650, - posy + 50, - "#FFFFFF", - "#000000", - 6, - core.ui._buildFont(42, true) - ); - } else { - let text1 = text.slice(0, 30); - core.fillBoldText1( - logctx, - text1, - 650, - posy + 50, - "#FFFFFF", - "#000000", - 6, - core.ui._buildFont(42, true) - ); - if (text.length > 60) { - let text2 = text.slice(30, 60); - let text3 = text.slice(60); - core.fillBoldText1( - logctx, - text2, - 650, - posy + 100, - "#FFFFFF", - "#000000", - 6, - core.ui._buildFont(42, true) - ); - core.fillBoldText1( - logctx, - text3, - 650, - posy + 150, - "#FFFFFF", - "#000000", - 6, - core.ui._buildFont(42, true) - ); - } else { - let text2 = text.slice(30); - core.fillBoldText1( - logctx, - text2, - 650, - posy + 100, - "#FFFFFF", - "#000000", - 6, - core.ui._buildFont(42, true) - ); - } - } + logctx.stroke(); + let posy = 150; + const indexList = this.textList; + core.setTextAlign(logctx, "left"); + for ( + let i = (page - 1) * 6; i <= Math.min(this.index, page * 6 - 1); i++ + ) { + const text = this.textList[i][1].replaceAll( + /(\\(d|e|f|g|i|n|r|b|c|t|z))(\[.*?\])?/g, + "" + ); //取消打字机 + const name = this.textList[i][0] ? + "【" + this.textList[i][0] + "】" : + ""; + if (name) { + core.fillBoldText1( + logctx, + name, + 150, + posy + 50, + "#FFFFFF", + "#000000", + 6, + core.ui._buildFont(42, true) + ); + } + if (text.length < 30) { + core.fillBoldText1( + logctx, + text, + 650, + posy + 50, + "#FFFFFF", + "#000000", + 6, + core.ui._buildFont(42, true) + ); + } else { + let text1 = text.slice(0, 30); + core.fillBoldText1( + logctx, + text1, + 650, + posy + 50, + "#FFFFFF", + "#000000", + 6, + core.ui._buildFont(42, true) + ); + if (text.length > 60) { + let text2 = text.slice(30, 60); + let text3 = text.slice(60); + core.fillBoldText1( + logctx, + text2, + 650, + posy + 100, + "#FFFFFF", + "#000000", + 6, + core.ui._buildFont(42, true) + ); + core.fillBoldText1( + logctx, + text3, + 650, + posy + 150, + "#FFFFFF", + "#000000", + 6, + core.ui._buildFont(42, true) + ); + } else { + let text2 = text.slice(30); + core.fillBoldText1( + logctx, + text2, + 650, + posy + 100, + "#FFFFFF", + "#000000", + 6, + core.ui._buildFont(42, true) + ); + } + } - logctx.strokeStyle = "#FFFFFF"; - logctx.lineWidth = 3; - logctx.beginPath(); - logctx.moveTo(100, posy); - logctx.lineTo(1928, posy); - logctx.stroke(); + logctx.strokeStyle = "#FFFFFF"; + logctx.lineWidth = 3; + logctx.beginPath(); + logctx.moveTo(100, posy); + logctx.lineTo(1928, posy); + logctx.stroke(); - posy += 160; - } - logctx.beginPath(); - logctx.moveTo(100, 1120); - logctx.lineTo(1928, 1120); - logctx.moveTo(100, 1110); - logctx.lineTo(1928, 1110); - logctx.stroke(); - core.fillBoldText1( - logctx, - "上一页", - 300, - 1200, - page === 1 ? "#444444" : "#FFFFFF", - "#000000", - 6, - core.ui._buildFont(66, true) - ); + posy += 160; + } + logctx.beginPath(); + logctx.moveTo(100, 1120); + logctx.lineTo(1928, 1120); + logctx.moveTo(100, 1110); + logctx.lineTo(1928, 1110); + logctx.stroke(); + core.fillBoldText1( + logctx, + "上一页", + 300, + 1200, + page === 1 ? "#444444" : "#FFFFFF", + "#000000", + 6, + core.ui._buildFont(66, true) + ); - core.fillBoldText1( - logctx, - page + "/" + this.overpage, - 1000, - 1200, - "#FFFFFF", - "#000000", - 6, - core.ui._buildFont(66, true) - ); - core.fillBoldText1( - logctx, - "下一页", - 1500, - 1200, - page === this.overpage ? "#444444" : "#FFFFFF", - "#000000", - 6, - core.ui._buildFont(66, true) - ); - } - background() { - const img = core.material.images.images?.[this.image]; + core.fillBoldText1( + logctx, + page + "/" + this.overpage, + 1000, + 1200, + "#FFFFFF", + "#000000", + 6, + core.ui._buildFont(66, true) + ); + core.fillBoldText1( + logctx, + "下一页", + 1500, + 1200, + page === this.overpage ? "#444444" : "#FFFFFF", + "#000000", + 6, + core.ui._buildFont(66, true) + ); + } + background() { + const img = core.material.images.images?.[this.image]; - if (core.domStyle.isVertical) { - ctx.canvas.width = 1248; - ctx.canvas.height = 2028; - ctx.save(); //保存设置 - ctx.translate(1248, 0); //重新定位右上角为基准 - ctx.rotate(Math.PI / 2); //旋转90度 - } else { - ctx.canvas.width = 2028; - ctx.canvas.height = 1248; - } + if (core.domStyle.isVertical) { + ctx.canvas.width = 1248; + ctx.canvas.height = 2028; + ctx.save(); //保存设置 + ctx.translate(1248, 0); //重新定位右上角为基准 + ctx.rotate(Math.PI / 2); //旋转90度 + } else { + ctx.canvas.width = 2028; + ctx.canvas.height = 1248; + } - if (img) { - //绘制背景 - if (this.memory) ctx.filter = "sepia(50%)"; - ctx.drawImage(img, 0, 0, 2028, 1248); - ctx.filter = "none"; - } else { - core.fillRect(ctx, 0, 0, 2028, 1248); - } - this.bodyList.forEach((v) => { - //绘制立绘 - const body = core.material.images.images?.[v.name]; - if (v.filter) ctx.filter = "brightness(50%)"; - if (body) { - if (!v.w && !v.h && !v.scale) v.scale = 1.7; - if (!v.w && !v.h) { - ctx.drawImage( - body, - 0, - 0, - body.width, - body.height, - v.px, - 1248 - body.height * v.scale, - body.width * v.scale, - body.height * v.scale - ); - } else { - ctx.drawImage( - body, - 0, - 0, - body.width, - body.height, - v.px, - 1248 - (v.h ?? body.height), - v.w ?? body.width, - v.h ?? body.height - ); - } - } - ctx.filter = "none"; - }); - if (core.isPlaying() && !this.WindowSkin) - core.drawWindowSkin( - "winskin.webp", - ctx, - 30, - 780, - 1968, - 436, - null, - null, - null, - 3 - ); //绘制对话框 - const head = core.material.images.images?.[this.head.name]; - if (head) { - //绘制头像 - ctx.drawImage( - head, - 0, - 0, - head.width, - head.height, - this.head.px, - 1248 - head.height * 2.2, - head.width * 2.2, - head.height * 2.2 - ); - } - if (core.isPlaying() && !this.WindowSkin) { - core.drawWindowSkin( - "winskin.webp", - ctx, - 1700, - 800, - 192, - 96, - null, - null, - null, - 3 - ); - core.fillBoldText1( - ctx, - "记 录", - 1736, - 866, - "#FFFFFF", - "#000000", - 6, - "bold 48px Verdana" - ); - core.drawWindowSkin( - "winskin.webp", - ctx, - 1700, - 1100, - 192, - 96, - null, - null, - null, - 3 - ); - core.fillBoldText1( - ctx, - "存 档", - 1736, - 1166, - "#FFFFFF", - "#000000", - 6, - "bold 48px Verdana" - ); - core.drawWindowSkin( - "winskin.webp", - ctx, - 1700, - 1000, - 192, - 96, - null, - null, - null, - 3 - ); - core.fillBoldText1( - ctx, - "▶▶", - 1756, - 1066, - "#FFFFFF", - "#000000", - 6, - "bold 48px Verdana" - ); - core.drawWindowSkin( - "winskin.webp", - ctx, - 1700, - 900, - 192, - 96, - null, - null, - null, - 3 - ); - let autoText = "AUTO"; - if (auto) autoText = "STOP"; - core.fillBoldText1( - ctx, - autoText, - 1722, - 966, - "#FFFFFF", - "#000000", - 6, - "bold 48px Verdana" - ); - } - if (this.name) - core.fillBoldText1( - ctx, - `【${this.name}】`, - 550, - 880, - "#FFFFFF", - "#000000", - 6, - "bold 48px Verdana" - ); //绘制名字 + if (img) { + //绘制背景 + if (this.memory) ctx.filter = "sepia(50%)"; + ctx.drawImage(img, 0, 0, 2028, 1248); + ctx.filter = "none"; + } else { + core.fillRect(ctx, 0, 0, 2028, 1248); + } + this.bodyList.forEach((v) => { + //绘制立绘 + const body = core.material.images.images?.[v.name]; + if (v.filter) ctx.filter = "brightness(50%)"; + if (body) { + if (!v.w && !v.h && !v.scale) v.scale = 1.7; + if (!v.w && !v.h) { + ctx.drawImage( + body, + 0, + 0, + body.width, + body.height, + v.px, + 1248 - body.height * v.scale, + body.width * v.scale, + body.height * v.scale + ); + } else { + ctx.drawImage( + body, + 0, + 0, + body.width, + body.height, + v.px, + 1248 - (v.h ?? body.height), + v.w ?? body.width, + v.h ?? body.height + ); + } + } + ctx.filter = "none"; + }); + if (core.isPlaying() && !this.WindowSkin) + core.drawWindowSkin( + "winskin.webp", + ctx, + 30, + 780, + 1968, + 436, + null, + null, + null, + 3 + ); //绘制对话框 + const head = core.material.images.images?.[this.head.name]; + if (head) { + //绘制头像 + ctx.drawImage( + head, + 0, + 0, + head.width, + head.height, + this.head.px, + 1248 - head.height * 2.2, + head.width * 2.2, + head.height * 2.2 + ); + } + if (core.isPlaying() && !this.WindowSkin) { + core.drawWindowSkin( + "winskin.webp", + ctx, + 1700, + 800, + 192, + 96, + null, + null, + null, + 3 + ); + core.fillBoldText1( + ctx, + "记 录", + 1736, + 866, + "#FFFFFF", + "#000000", + 6, + "bold 48px Verdana" + ); + core.drawWindowSkin( + "winskin.webp", + ctx, + 1700, + 1100, + 192, + 96, + null, + null, + null, + 3 + ); + core.fillBoldText1( + ctx, + "存 档", + 1736, + 1166, + "#FFFFFF", + "#000000", + 6, + "bold 48px Verdana" + ); + core.drawWindowSkin( + "winskin.webp", + ctx, + 1700, + 1000, + 192, + 96, + null, + null, + null, + 3 + ); + core.fillBoldText1( + ctx, + "▶▶", + 1756, + 1066, + "#FFFFFF", + "#000000", + 6, + "bold 48px Verdana" + ); + core.drawWindowSkin( + "winskin.webp", + ctx, + 1700, + 900, + 192, + 96, + null, + null, + null, + 3 + ); + let autoText = "AUTO"; + if (auto) autoText = "STOP"; + core.fillBoldText1( + ctx, + autoText, + 1722, + 966, + "#FFFFFF", + "#000000", + 6, + "bold 48px Verdana" + ); + } + if (this.name) + core.fillBoldText1( + ctx, + `【${this.name}】`, + 550, + 880, + "#FFFFFF", + "#000000", + 6, + "bold 48px Verdana" + ); //绘制名字 - if ( - this.sound && - core.sounds && - !core.getFlag("skip", false) && - core.musicStatus.soundStatus - ) { - this.beforeSound = core.playSound(this.sound, null, () => { - if ( - this.sound && - auto && - !this.WindowSkin && - core.musicStatus.soundStatus - ) { - setTimeout(() => { - if (auto) { - cg.style.display = "none"; - core.ui._animateUI("hide", null, () => { - core.doAction(); - }); - } - }, this.wait); - } - }); - } - if (this.text && !core.getFlag("skip", false)) { - //绘制对话 - this.drawTextContent(ctx, this.text, { - left: 550, - top: 950, - bold: true, - color: "#FFFFFF", - align: "left", - fontSize: 48, - time: this.time || 0, - font: "Verdana", - maxWidth: 1000, - }); - } + if ( + this.sound && + core.sounds && + !core.getFlag("skip", false) && + core.musicStatus.soundStatus + ) { + this.beforeSound = core.playSound(this.sound, null, () => { + if ( + this.sound && + auto && + !this.WindowSkin && + core.musicStatus.soundStatus + ) { + setTimeout(() => { + if (auto) { + cg.style.display = "none"; + core.ui._animateUI("hide", null, () => { + core.doAction(); + }); + } + }, this.wait); + } + }); + } + if (this.text && !core.getFlag("skip", false)) { + //绘制对话 + this.drawTextContent(ctx, this.text, { + left: 550, + top: 950, + bold: true, + color: "#FFFFFF", + align: "left", + fontSize: 48, + time: this.time || 0, + font: "Verdana", + maxWidth: 1000, + }); + } - ctx.restore(); - } - } - core.ui.cgText = new cgText(); - }, + ctx.restore(); + } + } + core.ui.cgText = new cgText(); +}, "旁白": function () { // 在此增加新插件 const over = document.createElement("canvas"); //over画布设置 From 63de0f7785f4b6e03498a371101f5e1765bf8b2a Mon Sep 17 00:00:00 2001 From: strawberry42271 <2806566736@qq.com> Date: Sat, 1 Feb 2025 10:26:06 +0800 Subject: [PATCH 5/5] =?UTF-8?q?=E9=9F=B3=E9=A2=91=E5=89=A7=E6=83=85?= =?UTF-8?q?=E9=87=8D=E7=BD=AE=EF=BC=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- _server/MotaAction.g4 | 5 +- _server/MotaActionParser.js | 1 - project/data.js | 4 +- project/events.js | 245 - project/images/sound.webp | Bin 0 -> 1360 bytes project/plugins.js | 8734 ++++++++++++++++++----------------- 6 files changed, 4401 insertions(+), 4588 deletions(-) create mode 100644 project/images/sound.webp diff --git a/_server/MotaAction.g4 b/_server/MotaAction.g4 index c488ffd..eaa641e 100644 --- a/_server/MotaAction.g4 +++ b/_server/MotaAction.g4 @@ -1138,7 +1138,7 @@ return code; cgtext_s : '背景' EvalString? '回忆滤镜' Bool? '移除对话框' Bool? '剧情库序列' Int '头像' EvalString?'坐标PX' Number'打字间隔' Int? BGNL? Newline - '自动等待时长' Int '音频文件(需在全塔属性——使用音效注册)'EvalString? BGNL? Newline + '自动等待时长' Int BGNL? Newline textcgDrawingList+? Newline @@ -1146,11 +1146,10 @@ cgtext_s tooltip : cgtext:显示一段包含cg的文字(剧情) helpUrl : /_docs/#/instruction allImages : ['EvalString_0','EvalString_1'] -allSounds : ['EvalString_2'] default : ["bg_5043.webp",false,false,0,"face_050445.webp",-300,0,2000,"","这句话显示在对话框内",[{ "name":"tati_050145a.webp" , "px": 100,"filter":false }]] var head ='{ "name": "'+EvalString_1+'", "px": '+Number_0+' }' var list=',"bodyList": [\n'+textcgDrawingList_0.slice(0,-1)+'\n]' -var code = '{"type": "cgtext", "bg":"'+EvalString_0+'","memory":'+Bool_0+',"WindowSkin":'+Bool_1+',"head":'+head+' ,"index":"'+Int_0+'","time":'+Int_1+',"wait":'+Int_2+',"sound":"'+EvalString_2+'"'+list+' },\n'; +var code = '{"type": "cgtext", "bg":"'+EvalString_0+'","memory":'+Bool_0+',"WindowSkin":'+Bool_1+',"head":'+head+' ,"index":"'+Int_0+'","time":'+Int_1+',"wait":'+Int_2+list+' },\n'; return code; */; textcgDrawingList diff --git a/_server/MotaActionParser.js b/_server/MotaActionParser.js index 85647da..db8cf0b 100644 --- a/_server/MotaActionParser.js +++ b/_server/MotaActionParser.js @@ -574,7 +574,6 @@ MotaActionParser = function () { data.head.px || -300, data.time, data.wait, - data.sound, buildcgDrawing(data.bodyList), this.next, ]); diff --git a/project/data.js b/project/data.js index 0674e05..cf5aaac 100644 --- a/project/data.js +++ b/project/data.js @@ -451,6 +451,7 @@ var data_a1e2fb4a_e986_4524_b0da_9b7ba7c0874d = "other_0003.webp", "other_0004.webp", "r.webp", + "sound.webp", "status.webp", "suiji.webp", "tati_020101.webp", @@ -1140,7 +1141,8 @@ var data_a1e2fb4a_e986_4524_b0da_9b7ba7c0874d = "steps": 0, "matk": 0, "spell": 0, - "spelldef": 0 + "spelldef": 0, + "mhp": 0 }, "startCanvas": [ { diff --git a/project/events.js b/project/events.js index cbad1c4..71a864c 100644 --- a/project/events.js +++ b/project/events.js @@ -456,7 +456,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "0", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -477,7 +476,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "1", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -498,7 +496,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "2", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -528,7 +525,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "3", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -549,7 +545,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "4", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -570,7 +565,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "5", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -591,7 +585,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "6", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -612,7 +605,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "7", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -633,7 +625,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "8", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -654,7 +645,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "9", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -675,7 +665,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "10", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -705,7 +694,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "11", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -726,7 +714,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "12", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -747,7 +734,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "13", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -768,7 +754,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "14", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -789,7 +774,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "15", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -810,7 +794,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "16", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -831,7 +814,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "17", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -852,7 +834,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "18", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -882,7 +863,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "19", "time": 30, "wait": 1000, - "sound": "aiy010000010.opus", "bodyList": [ { "name": "", @@ -912,7 +892,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "20", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -933,7 +912,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "21", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -963,7 +941,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "22", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -993,7 +970,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "23", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -1014,7 +990,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "24", "time": 50, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -1044,7 +1019,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "25", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -1065,7 +1039,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "26", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -1086,7 +1059,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "27", "time": 30, "wait": 2000, - "sound": "aiy010000020.opus", "bodyList": [ { "name": "", @@ -1107,7 +1079,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "28", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -1128,7 +1099,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "29", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -1149,7 +1119,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "30", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -1170,7 +1139,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "31", "time": 30, "wait": 1000, - "sound": "aiy010000030.opus", "bodyList": [ { "name": "", @@ -1205,7 +1173,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "32", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -1226,7 +1193,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "33", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -1247,7 +1213,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "34", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -1268,7 +1233,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "35", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -1289,7 +1253,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "36", "time": 30, "wait": 1000, - "sound": "aiy710000010.opus", "bodyList": [ { "name": "", @@ -1310,7 +1273,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "37", "time": 30, "wait": 1000, - "sound": "aiy710000020.opus", "bodyList": [ { "name": "", @@ -1340,7 +1302,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "38", "time": 30, "wait": 1000, - "sound": "aiy710000030.opus", "bodyList": [ { "name": "", @@ -1361,7 +1322,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "39", "time": 30, "wait": 1000, - "sound": "aiy710000040.opus", "bodyList": [ { "name": "", @@ -1382,7 +1342,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "40", "time": 30, "wait": 1000, - "sound": "aiy710000050.opus", "bodyList": [ { "name": "", @@ -1412,7 +1371,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "41", "time": 30, "wait": 1000, - "sound": "aiy710000060.opus", "bodyList": [ { "name": "", @@ -1433,7 +1391,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "42", "time": 30, "wait": 1000, - "sound": "aiy310000010.opus", "bodyList": [ { "name": "", @@ -1454,7 +1411,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "43", "time": 30, "wait": 1000, - "sound": "aiy310000020.opus", "bodyList": [ { "name": "", @@ -1484,7 +1440,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "44", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -1505,7 +1460,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "45", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -1526,7 +1480,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "46", "time": 30, "wait": 1000, - "sound": "aiy350000010.opus", "bodyList": [ { "name": "", @@ -1547,7 +1500,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "47", "time": 30, "wait": 1000, - "sound": "aiy350000020.opus", "bodyList": [ { "name": "", @@ -1568,7 +1520,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "48", "time": 30, "wait": 1000, - "sound": "aiy310000030.opus", "bodyList": [ { "name": "", @@ -1589,7 +1540,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "49", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -1610,7 +1560,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "50", "time": 30, "wait": 1000, - "sound": "aiy350000030.opus", "bodyList": [ { "name": "", @@ -1631,7 +1580,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "51", "time": 30, "wait": 1000, - "sound": "aiy310000040.opus", "bodyList": [ { "name": "", @@ -1652,7 +1600,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "52", "time": 30, "wait": 1000, - "sound": "aiy710000070.opus", "bodyList": [ { "name": "", @@ -1673,7 +1620,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "53", "time": 30, "wait": 1000, - "sound": "aiy350000040.opus", "bodyList": [ { "name": "", @@ -1694,7 +1640,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "54", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -1715,7 +1660,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "55", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -1736,7 +1680,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "56", "time": 30, "wait": 1000, - "sound": "aiy350000050.opus", "bodyList": [ { "name": "", @@ -1757,7 +1700,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "57", "time": 30, "wait": 1000, - "sound": "aiy350000060.opus", "bodyList": [ { "name": "", @@ -1778,7 +1720,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "58", "time": 30, "wait": 1000, - "sound": "aiy310000050.opus", "bodyList": [ { "name": "", @@ -1799,7 +1740,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "59", "time": 30, "wait": 1000, - "sound": "aiy350000070.opus", "bodyList": [ { "name": "", @@ -1820,7 +1760,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "60", "time": 30, "wait": 1000, - "sound": "aiy350000080.opus", "bodyList": [ { "name": "", @@ -1841,7 +1780,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "61", "time": 30, "wait": 1000, - "sound": "aiy820000010.opus", "bodyList": [ { "name": "", @@ -1862,7 +1800,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "62", "time": 30, "wait": 1000, - "sound": "aiy350000090.opus", "bodyList": [ { "name": "", @@ -1883,7 +1820,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "63", "time": 30, "wait": 1000, - "sound": "aiy820000020.opus", "bodyList": [ { "name": "", @@ -1904,7 +1840,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "64", "time": 30, "wait": 1000, - "sound": "aiy350000100.opus", "bodyList": [ { "name": "", @@ -1925,7 +1860,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "65", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -1946,7 +1880,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "66", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -1967,7 +1900,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "67", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -1988,7 +1920,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "68", "time": 30, "wait": 1000, - "sound": "aiy310000060.opus", "bodyList": [ { "name": "", @@ -2009,7 +1940,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "69", "time": 30, "wait": 1000, - "sound": "aiy310000070.opus", "bodyList": [ { "name": "", @@ -2030,7 +1960,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "70", "time": 30, "wait": 1000, - "sound": "aiy350000110.opus", "bodyList": [ { "name": "", @@ -2051,7 +1980,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "71", "time": 30, "wait": 1000, - "sound": "aiy350000120.opus", "bodyList": [ { "name": "", @@ -2072,7 +2000,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "72", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -2093,7 +2020,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "73", "time": 30, "wait": 1000, - "sound": "aiy310000080.opus", "bodyList": [ { "name": "", @@ -2114,7 +2040,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "74", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -2135,7 +2060,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "75", "time": 30, "wait": 1000, - "sound": "aiy350000130.opus", "bodyList": [ { "name": "", @@ -2156,7 +2080,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "76", "time": 30, "wait": 1000, - "sound": "aiy310000090.opus", "bodyList": [ { "name": "", @@ -2177,7 +2100,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "77", "time": 30, "wait": 1000, - "sound": "aiy310000100.opus", "bodyList": [ { "name": "", @@ -2198,7 +2120,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "78", "time": 30, "wait": 1000, - "sound": "aiy350000140.opus", "bodyList": [ { "name": "", @@ -2219,7 +2140,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "79", "time": 30, "wait": 1000, - "sound": "aiy350000150.opus", "bodyList": [ { "name": "", @@ -2240,7 +2160,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "80", "time": 30, "wait": 1000, - "sound": "aiy710000080.opus", "bodyList": [ { "name": "", @@ -2261,7 +2180,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "81", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -2282,7 +2200,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "82", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -2303,7 +2220,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "83", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -2324,7 +2240,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "84", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -2345,7 +2260,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "85", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -2366,7 +2280,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "86", "time": 30, "wait": 1000, - "sound": "aiy710000090.opus", "bodyList": [ { "name": "", @@ -2387,7 +2300,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "87", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -2408,7 +2320,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "88", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -2429,7 +2340,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "89", "time": 30, "wait": 1000, - "sound": "aiy710000100.opus", "bodyList": [ { "name": "", @@ -2450,7 +2360,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "90", "time": 30, "wait": 1000, - "sound": "aiy350000160.opus", "bodyList": [ { "name": "", @@ -2471,7 +2380,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "91", "time": 30, "wait": 1000, - "sound": "aiy350000170.opus", "bodyList": [ { "name": "", @@ -2492,7 +2400,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "92", "time": 30, "wait": 1000, - "sound": "aiy710000110.opus", "bodyList": [ { "name": "", @@ -2513,7 +2420,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "93", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -2534,7 +2440,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "94", "time": 30, "wait": 2000, - "sound": "aiy350000180.opus", "bodyList": [ { "name": "", @@ -2555,7 +2460,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "95", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -2576,7 +2480,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "96", "time": 30, "wait": 1000, - "sound": "aiy350000190.opus", "bodyList": [ { "name": "", @@ -2597,7 +2500,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "97", "time": 30, "wait": 1000, - "sound": "aiy350000200.opus", "bodyList": [ { "name": "", @@ -2618,7 +2520,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "98", "time": 30, "wait": 1000, - "sound": "aiy710000120.opus", "bodyList": [ { "name": "", @@ -2639,7 +2540,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "99", "time": 30, "wait": 1000, - "sound": "aiy710000130.opus", "bodyList": [ { "name": "", @@ -2660,7 +2560,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "100", "time": 30, "wait": 1000, - "sound": "aiy350000210.opus", "bodyList": [ { "name": "", @@ -2681,7 +2580,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "101", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -2702,7 +2600,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "102", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -2723,7 +2620,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "103", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -2744,7 +2640,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "104", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -2765,7 +2660,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "105", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -2786,7 +2680,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "106", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -2807,7 +2700,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "107", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -2828,7 +2720,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "108", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -2849,7 +2740,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "109", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -2870,7 +2760,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "110", "time": 30, "wait": 1000, - "sound": "aiy310000110.opus", "bodyList": [ { "name": "", @@ -2891,7 +2780,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "111", "time": 30, "wait": 1000, - "sound": "aiy350000220.opus", "bodyList": [ { "name": "", @@ -2912,7 +2800,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "112", "time": 30, "wait": 1000, - "sound": "aiy350000230.opus", "bodyList": [ { "name": "", @@ -2933,7 +2820,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "113", "time": 30, "wait": 1000, - "sound": "aiy310000120.opus", "bodyList": [ { "name": "", @@ -2954,7 +2840,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "114", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -2975,7 +2860,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "115", "time": 30, "wait": 1000, - "sound": "aiy310000130.opus", "bodyList": [ { "name": "", @@ -3005,7 +2889,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "116", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -3026,7 +2909,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "117", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -3047,7 +2929,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "118", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -3068,7 +2949,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "119", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -3089,7 +2969,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "120", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -3110,7 +2989,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "121", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -3131,7 +3009,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "122", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -3152,7 +3029,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "123", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -3173,7 +3049,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "124", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -3194,7 +3069,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "125", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -3224,7 +3098,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "126", "time": 30, "wait": 1000, - "sound": "aiy310000140.opus", "bodyList": [ { "name": "", @@ -3273,7 +3146,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "0", "time": 30, "wait": 1000, - "sound": "aiy020000005.opus", "bodyList": [ { "name": "", @@ -3298,7 +3170,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "1", "time": 30, "wait": 1000, - "sound": "aiy020000010.opus", "bodyList": [ { "name": "tati_020141.webp", @@ -3319,7 +3190,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "2", "time": 30, "wait": 1000, - "sound": "aiy020000020.opus", "bodyList": [ { "name": "tati_020157.webp", @@ -3340,7 +3210,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "3", "time": 30, "wait": 1000, - "sound": "aiy310000150.opus", "bodyList": [ { "name": "tati_020157.webp", @@ -3361,7 +3230,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "4", "time": 30, "wait": 1000, - "sound": "aiy020000030.opus", "bodyList": [ { "name": "tati_020107.webp", @@ -3382,7 +3250,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "5", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "tati_020107.webp", @@ -3403,7 +3270,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "6", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "tati_020107.webp", @@ -3424,7 +3290,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "7", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "tati_020107.webp", @@ -3445,7 +3310,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "8", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "tati_020107.webp", @@ -3466,7 +3330,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "9", "time": 30, "wait": 1000, - "sound": "aiy020000040.opus", "bodyList": [ { "name": "tati_020157.webp", @@ -3487,7 +3350,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "10", "time": 30, "wait": 1000, - "sound": "aiy020000050.opus", "bodyList": [ { "name": "tati_020157.webp", @@ -3508,7 +3370,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "11", "time": 30, "wait": 1000, - "sound": "aiy310000160.opus", "bodyList": [ { "name": "tati_020157.webp", @@ -3529,7 +3390,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "12", "time": 30, "wait": 1000, - "sound": "aiy020000060.opus", "bodyList": [ { "name": "tati_020111.webp", @@ -3550,7 +3410,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "13", "time": 30, "wait": 1000, - "sound": "aiy310000170.opus", "bodyList": [ { "name": "tati_020111.webp", @@ -3571,7 +3430,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "14", "time": 30, "wait": 1000, - "sound": "aiy020000070.opus", "bodyList": [ { "name": "tati_020101.webp", @@ -3592,7 +3450,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "15", "time": 30, "wait": 1000, - "sound": "aiy310000180.opus", "bodyList": [ { "name": "tati_020101.webp", @@ -3613,7 +3470,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "16", "time": 30, "wait": 1000, - "sound": "aiy020000080.opus", "bodyList": [ { "name": "tati_020107.webp", @@ -3634,7 +3490,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "17", "time": 30, "wait": 1000, - "sound": "aiy310000190.opus", "bodyList": [ { "name": "tati_020107.webp", @@ -3655,7 +3510,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "18", "time": 30, "wait": 1000, - "sound": "aiy020000090.opus", "bodyList": [ { "name": "tati_020157.webp", @@ -3676,7 +3530,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "19", "time": 30, "wait": 1000, - "sound": "aiy310000200.opus", "bodyList": [ { "name": "tati_020157.webp", @@ -3697,7 +3550,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "20", "time": 30, "wait": 1000, - "sound": "aiy310000210.opus", "bodyList": [ { "name": "tati_020157.webp", @@ -3718,7 +3570,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "21", "time": 30, "wait": 1000, - "sound": "aiy020000100.opus", "bodyList": [ { "name": "tati_020125.webp", @@ -3739,7 +3590,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "22", "time": 30, "wait": 1000, - "sound": "aiy310000220.opus", "bodyList": [ { "name": "tati_020125.webp", @@ -3760,7 +3610,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "23", "time": 30, "wait": 1000, - "sound": "aiy020000110.opus", "bodyList": [ { "name": "tati_020121.webp", @@ -3781,7 +3630,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "24", "time": 30, "wait": 1000, - "sound": "aiy310000230.opus", "bodyList": [ { "name": "tati_020121.webp", @@ -3802,7 +3650,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "25", "time": 30, "wait": 1000, - "sound": "aiy310000240.opus", "bodyList": [ { "name": "tati_020121.webp", @@ -3823,7 +3670,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "26", "time": 30, "wait": 1000, - "sound": "aiy020000120.opus", "bodyList": [ { "name": "tati_020105.webp", @@ -3844,7 +3690,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "27", "time": 30, "wait": 1000, - "sound": "aiy020000130.opus", "bodyList": [ { "name": "tati_020103.webp", @@ -3865,7 +3710,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "28", "time": 30, "wait": 1000, - "sound": "aiy020000140.opus", "bodyList": [ { "name": "tati_020141.webp", @@ -3886,7 +3730,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "29", "time": 30, "wait": 1000, - "sound": "aiy310000250.opus", "bodyList": [ { "name": "tati_020141.webp", @@ -3907,7 +3750,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "30", "time": 30, "wait": 1000, - "sound": "aiy020000150.opus", "bodyList": [ { "name": "tati_020105.webp", @@ -3928,7 +3770,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "31", "time": 30, "wait": 1000, - "sound": "aiy310000260.opus", "bodyList": [ { "name": "tati_020105.webp", @@ -3949,7 +3790,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "32", "time": 30, "wait": 1000, - "sound": "aiy020000160.opus", "bodyList": [ { "name": "tati_020105.webp", @@ -3970,7 +3810,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "33", "time": 30, "wait": 1000, - "sound": "aiy020000170.opus", "bodyList": [ { "name": "tati_020107.webp", @@ -3991,7 +3830,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "34", "time": 30, "wait": 1000, - "sound": "aiy310000280.opus", "bodyList": [ { "name": "tati_020107.webp", @@ -4012,7 +3850,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "35", "time": 30, "wait": 1000, - "sound": "aiy020000180.opus", "bodyList": [ { "name": "tati_020145.webp", @@ -4033,7 +3870,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "36", "time": 30, "wait": 1000, - "sound": "aiy310000290.opus", "bodyList": [ { "name": "tati_020145.webp", @@ -4054,7 +3890,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "37", "time": 30, "wait": 1000, - "sound": "aiy310000300.opus", "bodyList": [ { "name": "tati_020145.webp", @@ -4099,7 +3934,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "0", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -4120,7 +3954,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "1", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -4141,7 +3974,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "2", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -4162,7 +3994,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "3", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -4183,7 +4014,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "4", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -4204,7 +4034,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "5", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -4225,7 +4054,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "6", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -4246,7 +4074,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "7", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -4267,7 +4094,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "8", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -4288,7 +4114,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "9", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -4318,7 +4143,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "10", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -4339,7 +4163,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "11", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -4360,7 +4183,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "12", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -4381,7 +4203,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "13", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -4402,7 +4223,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "14", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -4423,7 +4243,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "15", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -4444,7 +4263,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "16", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -4474,7 +4292,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "17", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -4495,7 +4312,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "18", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -4516,7 +4332,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "19", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -4550,7 +4365,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "20", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "tati_440101.webp", @@ -4571,7 +4385,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "21", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "tati_440101.webp", @@ -4592,7 +4405,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "22", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "tati_440101.webp", @@ -4613,7 +4425,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "23", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -4634,7 +4445,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "24", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -4655,7 +4465,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "25", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -4676,7 +4485,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "26", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -4697,7 +4505,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "27", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -4718,7 +4525,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "28", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -4739,7 +4545,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "29", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -4786,7 +4591,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "30", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -4807,7 +4611,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "31", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -4832,7 +4635,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "32", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -4853,7 +4655,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "33", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -4874,7 +4675,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "34", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -4895,7 +4695,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "35", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -4916,7 +4715,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "36", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -4937,7 +4735,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "37", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -4958,7 +4755,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "38", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -4979,7 +4775,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "39", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -5000,7 +4795,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "40", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -5021,7 +4815,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "41", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -5046,7 +4839,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "42", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -5076,7 +4868,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "43", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -5097,7 +4888,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "44", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -5118,7 +4908,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "45", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -5139,7 +4928,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "46", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -5160,7 +4948,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "47", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -5190,7 +4977,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "48", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -5211,7 +4997,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "49", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -5232,7 +5017,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "50", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -5253,7 +5037,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "51", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -5274,7 +5057,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "52", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -5295,7 +5077,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "53", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -5316,7 +5097,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "54", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -5337,7 +5117,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "55", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -5358,7 +5137,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "56", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -5379,7 +5157,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "57", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -5400,7 +5177,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "58", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -5421,7 +5197,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "59", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -5442,7 +5217,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "60", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -5463,7 +5237,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "61", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -5484,7 +5257,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "62", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -5505,7 +5277,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "63", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -5526,7 +5297,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "64", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -5547,7 +5317,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "65", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -5568,7 +5337,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "66", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -5589,7 +5357,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "67", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -5610,7 +5377,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "68", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -5631,7 +5397,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "69", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -5652,7 +5417,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "70", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -5673,7 +5437,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "71", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -5694,7 +5457,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "72", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -5715,7 +5477,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "73", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -5736,7 +5497,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "74", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -5757,7 +5517,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "75", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -5778,7 +5537,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "76", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -5799,7 +5557,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "77", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -5820,7 +5577,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "78", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", @@ -5841,7 +5597,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "index": "79", "time": 30, "wait": 1000, - "sound": "", "bodyList": [ { "name": "", diff --git a/project/images/sound.webp b/project/images/sound.webp new file mode 100644 index 0000000000000000000000000000000000000000..1fed12015c442fa4cf921856b1559c74723c4e46 GIT binary patch literal 1360 zcmWIYbaV4yWnc(*bqWXzu!!JdU|=u+;z%&^baoCn!3g9sFrEOBEI_H;ypp0IcPE92 z$S4K&2Mmlr2nLDC#RU)+RuZV{+ck*V%eq)q;1}dfNi9wWD)|7!Dn&rcfo>83vPIG% zYz+`Q3BtAkvCB&eN`PttK=2?(*InG6iuTNxN6ZXv`}7BDdI zw=ghlJC6`Ugh@eSQ6ktl79h!#md3#FX*mM}FEAp6FEB80MT6yl1P-?;0HtJr?#c(k zbcP&;R0ahGPlh~(WClGT%Lo{$h74woJ^>zo7=flvaL%2r7`b&@?(J>4t{pk=-F9E^ znqs}{=UKB|AhD|}e!bei&(X!AK>1|gt0D%eZR>tA|K?A-l_hezulCI16HUg7JxAaD z^q5fDF8W@ie2T)v?%s3;{#4tY+Vc+C z9ML~5ci84g{`$MjRUK(3ebbk;Kj_<~^kU%|wfXh8qV70n*0Z=X$azKcG1yGmrrT7( zarsGV&+1MlX4ad39@xgznNMg`<4n4rnzDR)V@YRXNugqo=I`2BF5GkMnVCK^JwM;z zu;;)};|^wxf`2@ZmJ70;o9`&$(fB!Czzrn+=a2mM@)qvbb`K}n$~lXl-ks;<5w?AK z$2*&Q#hS;iPI;wgUH5*jn)RlgiUAj;-%hFoQlEqNJhHsFG9$7$$%94QM62rE1@3ye zj*ybP_;up!AzD>g7n#Flw`fOgo4>Dnwd|CK9KS3jgY%cSESR6X_g@SJBn^SUSBxN&Izhvn?-b;X;{|1`QULEp0D0cs2yDyQ^UDIh`pjkmbCW)S{QcXKeOX9=qZ!TVWiW zeCS&Yx2ed1-Y&VBB3rkK$4pxIZ{>uSeeJVCSQ}sN*PF3BblS7o552x_XJGjEcgy?! z|LG>zf1I1x{5SrD>h1q;9@J(z0X8ir&4|E|!H{Nl=f{en~G`u`8N*oMuh z?ABo2Rsa8|)BXRS>firA@+@@+$7El-!=GQhFy3t=!MC$|YW@3 1000 / 60) { - now = timestamp; - globalAlphafloor += globalAlphafloorStatus; - if (globalAlphafloor === 100) globalAlphafloorStatus = -2; - if (globalAlphafloor === 0) globalAlphafloorStatus = 2; + core.dom.gameDraw.style.width = core.dom.gameDraw.style.height = + innerSize; + core.dom.gameDraw.style.top = + obj.gameDrawBox.top * core.domStyle.scale + "px"; + core.dom.gameDraw.style.left = + obj.gameDrawBox.left * core.domStyle.scale + "px"; + // resize bigmap + core.bigmap.canvas.forEach(function (cn) { + const ratio = core.canvas[cn].canvas.hasAttribute("isHD") + ? core.domStyle.ratio + : 1; + core.canvas[cn].canvas.style.width = + (innerSize / ratio) * core.domStyle.scale + "px"; + core.canvas[cn].canvas.style.height = + (innerSize / ratio) * core.domStyle.scale + "px"; + }); + // resize dynamic canvas + for (const name in core.dymCanvas) { + const ctx = core.dymCanvas[name], + canvas = ctx.canvas; + const ratio = canvas.hasAttribute("isHD") ? core.domStyle.ratio : 1; + canvas.style.width = (innerSize / ratio) * core.domStyle.scale + "px"; + canvas.style.height = (innerSize / ratio) * core.domStyle.scale + "px"; + canvas.style.left = + parseFloat(canvas.getAttribute("_left")) * core.domStyle.scale + "px"; + canvas.style.top = + parseFloat(canvas.getAttribute("_top")) * core.domStyle.scale + "px"; + } + // resize next + main.dom.next.style.width = main.dom.next.style.height = + 5 * core.domStyle.scale + "px"; + main.dom.next.style.borderBottomWidth = + main.dom.next.style.borderRightWidth = 4 * core.domStyle.scale + "px"; + }; + const bgctx = main.dom.outerBackground.getContext("2d"); + const uictx = main.dom.outerUI.getContext("2d"); + let now = 0; + core.registerAnimationFrame("lightFloor", true, function (timestamp) { + if (timestamp - now > 1000 / 60) { + now = timestamp; + globalAlphafloor += globalAlphafloorStatus; + if (globalAlphafloor === 100) globalAlphafloorStatus = -2; + if (globalAlphafloor === 0) globalAlphafloorStatus = 2; - if (core.domStyle.isVertical) { - core.clearMap( - uictx, - MAP_BLOCK_LEFT_VERTICAL, - MAP_BLOCK_TOP_VERTICAL, - 340, - 360 - ); - if (core.status.event.id === "viewMaps") { - core.ui.statusBar._update_map(core.status.event.data.floorId); - } else { - core.ui.statusBar._update_map(); - } + if (core.domStyle.isVertical) { + core.clearMap( + uictx, + MAP_BLOCK_LEFT_VERTICAL, + MAP_BLOCK_TOP_VERTICAL, + 340, + 360 + ); + if (core.status.event.id === "viewMaps") { + core.ui.statusBar._update_map(core.status.event.data.floorId); + } else { + core.ui.statusBar._update_map(); + } - uictx.globalAlpha = globalAlphafloor / 100; - core.drawImage( - uictx, - "green.webp", - MAP_BLOCK_LEFT_VERTICAL + 135, - MAP_BLOCK_TOP_VERTICAL + 170 - ); - uictx.globalAlpha = 1; - } else { - core.clearMap(uictx, MAP_BLOCK_LEFT, MAP_BLOCK_TOP, 340, 360); - if (core.status.event.id === "viewMaps") { - core.ui.statusBar._update_map(core.status.event.data.floorId); - } else { - core.ui.statusBar._update_map(); - } - uictx.globalAlpha = globalAlphafloor / 100; - core.drawImage( - uictx, - "green.webp", - MAP_BLOCK_LEFT + 150, - MAP_BLOCK_TOP + 180 - ); - uictx.globalAlpha = 1; - } - } - }); + uictx.globalAlpha = globalAlphafloor / 100; + core.drawImage( + uictx, + "green.webp", + MAP_BLOCK_LEFT_VERTICAL + 135, + MAP_BLOCK_TOP_VERTICAL + 170 + ); + uictx.globalAlpha = 1; + } else { + core.clearMap(uictx, MAP_BLOCK_LEFT, MAP_BLOCK_TOP, 340, 360); + if (core.status.event.id === "viewMaps") { + core.ui.statusBar._update_map(core.status.event.data.floorId); + } else { + core.ui.statusBar._update_map(); + } + uictx.globalAlpha = globalAlphafloor / 100; + core.drawImage( + uictx, + "green.webp", + MAP_BLOCK_LEFT + 150, + MAP_BLOCK_TOP + 180 + ); + uictx.globalAlpha = 1; + } + } + }); - core.control.resize = function () { - //自适应,可实现横竖屏切换 - if (main.mode == "editor") return; + core.control.resize = function () { + //自适应,可实现横竖屏切换 + if (main.mode == "editor") return; - const clientWidth = main.dom.body.clientWidth, - clientHeight = main.dom.body.clientHeight; - const canvasWidth = core.__PIXELS__; + const clientWidth = main.dom.body.clientWidth, + clientHeight = main.dom.body.clientHeight; + const canvasWidth = core.__PIXELS__; - const isVertical = clientHeight > clientWidth; - core.domStyle.isVertical = isVertical; + const isVertical = clientHeight > clientWidth; + core.domStyle.isVertical = isVertical; - const totalWidth = isVertical ? - GAMEVIEW_WIDTH_VERTICAL / 3 : - GAMEVIEW_WIDTH / 3, - totalHeight = isVertical ? - GAMEVIEW_HEIGHT_VERTICAL / 3 : - GAMEVIEW_HEIGHT / 3; + const totalWidth = isVertical + ? GAMEVIEW_WIDTH_VERTICAL / 3 + : GAMEVIEW_WIDTH / 3, + totalHeight = isVertical + ? GAMEVIEW_HEIGHT_VERTICAL / 3 + : GAMEVIEW_HEIGHT / 3; - const maxRatio = Math.min( - clientWidth / totalWidth, - clientHeight / totalHeight - ); + const maxRatio = Math.min( + clientWidth / totalWidth, + clientHeight / totalHeight + ); - core.domStyle.availableScale = []; - [1, 1.25, 1.5, 1.75, 2].forEach(function (v) { - if (maxRatio >= v) { - core.domStyle.availableScale.push(v); - } - }); + core.domStyle.availableScale = []; + [1, 1.25, 1.5, 1.75, 2].forEach(function (v) { + if (maxRatio >= v) { + core.domStyle.availableScale.push(v); + } + }); - if (core.domStyle.availableScale.indexOf(core.domStyle.scale) < 0) { - core.domStyle.scale = Math.min(1, maxRatio); - } else if ( - core.getLocalStorage("scale") == null && - core.domStyle.availableScale.length >= 2 - ) { - core.domStyle.scale = - core.domStyle.availableScale[core.domStyle.availableScale.length - 2]; - core.setLocalStorage("scale", core.domStyle.scale); - } + if (core.domStyle.availableScale.indexOf(core.domStyle.scale) < 0) { + core.domStyle.scale = Math.min(1, maxRatio); + } else if ( + core.getLocalStorage("scale") == null && + core.domStyle.availableScale.length >= 2 + ) { + core.domStyle.scale = + core.domStyle.availableScale[core.domStyle.availableScale.length - 2]; + core.setLocalStorage("scale", core.domStyle.scale); + } - const totalWidthScaled = totalWidth * core.domStyle.scale, - totalHeightScaled = totalHeight * core.domStyle.scale; + const totalWidthScaled = totalWidth * core.domStyle.scale, + totalHeightScaled = totalHeight * core.domStyle.scale; - const gameDrawBox = isVertical ? - { - left: BORDER_WIDTH / 3, - top: BAR_HEIGHT_VERTICAL / 3 + BORDER_HEIGHT / 3, - } : - { left: BAR_WIDTH / 3 + BORDER_WIDTH / 3, top: BORDER_HEIGHT / 3 }; + const gameDrawBox = isVertical + ? { + left: BORDER_WIDTH / 3, + top: BAR_HEIGHT_VERTICAL / 3 + BORDER_HEIGHT / 3, + } + : { left: BAR_WIDTH / 3 + BORDER_WIDTH / 3, top: BORDER_HEIGHT / 3 }; - const obj = { - clientWidth: clientWidth, - clientHeight: clientHeight, - canvasWidth: canvasWidth, - totalWidth: totalWidthScaled, - totalHeight: totalHeightScaled, - gameDrawBox: gameDrawBox, - globalAttribute: core.status.globalAttribute || core.initStatus.globalAttribute, - }; + const obj = { + clientWidth: clientWidth, + clientHeight: clientHeight, + canvasWidth: canvasWidth, + totalWidth: totalWidthScaled, + totalHeight: totalHeightScaled, + gameDrawBox: gameDrawBox, + globalAttribute: + core.status.globalAttribute || core.initStatus.globalAttribute, + }; - _resize_gameGroup(obj); - _resize_canvas(obj); + _resize_gameGroup(obj); + _resize_canvas(obj); - if (core.status.automaticRoute == null) core.status.automaticRoute = {}; - core.updateStatusBar(); - if (main.dom.CGUI && main.dom.CGUI.style.display === "block") - core.ui.CG.update(); - if (main.dom.music && main.dom.music.style.display === "block") - core.ui.music.update(); - if (main.dom.cgText && main.dom.cgText.style.display === "block") - core.ui.cgText.update(); - if (main.dom.logcanvas && main.dom.logcanvas.style.display === "block") - core.ui.cgText.update(); - }; + if (core.status.automaticRoute == null) core.status.automaticRoute = {}; + core.updateStatusBar(); + if (main.dom.CGUI && main.dom.CGUI.style.display === "block") + core.ui.CG.update(); + if (main.dom.music && main.dom.music.style.display === "block") + core.ui.music.update(); + if (main.dom.cgText && main.dom.cgText.style.display === "block") + core.ui.cgText.update(); + if (main.dom.logcanvas && main.dom.logcanvas.style.display === "block") + core.ui.cgText.update(); + }; - class StatusBar { - constructor() { - //道具栏列表 - this.itemMx = [ - //空位用‘none’填充,当前ui至多4列6行 - ["book", "wand", "none", "fly"], - ["cross", "superPotion", "pickaxe"], - ["bomb", "centerFly", "upFly"], - ["none", "none", "none"], - ["downFly", "knife", "snow"], - ["bigKey", "earthquake", "coin"], - ]; - } - //初始化内容(工具栏/录像操作执行函数) - init() { - this.toolbarAction = [ - [ - main.core.openKeyBoard, - main.core.openQuickShop, - core.openToolbox, - core.doSL, - ], - [main.core.openSettings, main.core.save, main.core.load, core.doSL], - ]; - this.replayAction = [ - [core.triggerReplay, core.stopReplay, core.rewindReplay], - [core.speedDownReplay, core.speedUpReplay, core.saveReplay], - ]; - } - //更新 - update() { - this._update_background(); //更新背景 - this._update_props(); //更新属性 - //this._update_items(); //更新道具 - //this._update_equips(); //更新装备 - //this._update_keys(); //更新钥匙 - //this._update_infoWindow(); //更新道具说明 - this._update_toolBox(); //更新工具栏 - this._redrawMap(); - } - _redrawMap() { - if (core.domStyle.isVertical) { - core.clearMap( - uictx, - MAP_BLOCK_LEFT_VERTICAL, - MAP_BLOCK_TOP_VERTICAL, - 340, - 360 - ); - this._update_map(); - uictx.globalAlpha = globalAlphafloor / 100; - core.drawImage( - uictx, - "green.webp", - MAP_BLOCK_LEFT_VERTICAL + 125, - MAP_BLOCK_TOP_VERTICAL + 170 - ); - uictx.globalAlpha = 1; - } else { - core.clearMap(uictx, MAP_BLOCK_LEFT, MAP_BLOCK_TOP, 340, 360); - this._update_map(); - uictx.globalAlpha = globalAlphafloor / 100; - core.drawImage( - uictx, - "green.webp", - MAP_BLOCK_LEFT + 150, - MAP_BLOCK_TOP + 170 - ); - uictx.globalAlpha = 1; - } - } - //更新背景 - _update_background() { - if (core.domStyle.isVertical) { - bgctx.canvas.width = GAMEVIEW_WIDTH_VERTICAL; - bgctx.canvas.height = GAMEVIEW_HEIGHT_VERTICAL; - uictx.canvas.width = GAMEVIEW_WIDTH_VERTICAL; - uictx.canvas.height = GAMEVIEW_HEIGHT_VERTICAL; + class StatusBar { + constructor() { + //道具栏列表 + this.itemMx = [ + //空位用‘none’填充,当前ui至多4列6行 + ["book", "wand", "none", "fly"], + ["cross", "superPotion", "pickaxe"], + ["bomb", "centerFly", "upFly"], + ["none", "none", "none"], + ["downFly", "knife", "snow"], + ["bigKey", "earthquake", "coin"], + ]; + } + //初始化内容(工具栏/录像操作执行函数) + init() { + this.toolbarAction = [ + [ + main.core.openKeyBoard, + main.core.openQuickShop, + core.openToolbox, + core.doSL, + ], + [main.core.openSettings, main.core.save, main.core.load, core.doSL], + ]; + this.replayAction = [ + [core.triggerReplay, core.stopReplay, core.rewindReplay], + [core.speedDownReplay, core.speedUpReplay, core.saveReplay], + ]; + } + //更新 + update() { + this._update_background(); //更新背景 + this._update_props(); //更新属性 + //this._update_items(); //更新道具 + //this._update_equips(); //更新装备 + //this._update_keys(); //更新钥匙 + //this._update_infoWindow(); //更新道具说明 + this._update_toolBox(); //更新工具栏 + this._redrawMap(); + } + _redrawMap() { + if (core.domStyle.isVertical) { + core.clearMap( + uictx, + MAP_BLOCK_LEFT_VERTICAL, + MAP_BLOCK_TOP_VERTICAL, + 340, + 360 + ); + this._update_map(); + uictx.globalAlpha = globalAlphafloor / 100; + core.drawImage( + uictx, + "green.webp", + MAP_BLOCK_LEFT_VERTICAL + 125, + MAP_BLOCK_TOP_VERTICAL + 170 + ); + uictx.globalAlpha = 1; + } else { + core.clearMap(uictx, MAP_BLOCK_LEFT, MAP_BLOCK_TOP, 340, 360); + this._update_map(); + uictx.globalAlpha = globalAlphafloor / 100; + core.drawImage( + uictx, + "green.webp", + MAP_BLOCK_LEFT + 150, + MAP_BLOCK_TOP + 170 + ); + uictx.globalAlpha = 1; + } + } + //更新背景 + _update_background() { + if (core.domStyle.isVertical) { + bgctx.canvas.width = GAMEVIEW_WIDTH_VERTICAL; + bgctx.canvas.height = GAMEVIEW_HEIGHT_VERTICAL; + uictx.canvas.width = GAMEVIEW_WIDTH_VERTICAL; + uictx.canvas.height = GAMEVIEW_HEIGHT_VERTICAL; - const bg = core.material.images.images["status.webp"]; //竖屏背景(上) - bgctx.drawImage( - bg, - 0, - 0, - GAMEVIEW_WIDTH_VERTICAL, - BAR_HEIGHT_VERTICAL - ); - const bg2 = core.material.images.images["status.webp"]; //竖屏背景(下) - bgctx.drawImage( - bg2, - 0, - BAR_HEIGHT_VERTICAL + GAMEVIEW_WIDTH_VERTICAL, - GAMEVIEW_WIDTH_VERTICAL, - BAR_HEIGHT_VERTICAL - ); - bgctx.globalAlpha = globalAlpha; - bgctx.globalAlpha = 1; - core.setTextAlign("outerUI", "center"); - } else { - bgctx.canvas.width = GAMEVIEW_WIDTH; - bgctx.canvas.height = GAMEVIEW_HEIGHT; - uictx.canvas.width = GAMEVIEW_WIDTH; - uictx.canvas.height = GAMEVIEW_HEIGHT; + const bg = core.material.images.images["status.webp"]; //竖屏背景(上) + bgctx.drawImage( + bg, + 0, + 0, + GAMEVIEW_WIDTH_VERTICAL, + BAR_HEIGHT_VERTICAL + ); + const bg2 = core.material.images.images["status.webp"]; //竖屏背景(下) + bgctx.drawImage( + bg2, + 0, + BAR_HEIGHT_VERTICAL + GAMEVIEW_WIDTH_VERTICAL, + GAMEVIEW_WIDTH_VERTICAL, + BAR_HEIGHT_VERTICAL + ); + bgctx.globalAlpha = globalAlpha; + bgctx.globalAlpha = 1; + core.setTextAlign("outerUI", "center"); + } else { + bgctx.canvas.width = GAMEVIEW_WIDTH; + bgctx.canvas.height = GAMEVIEW_HEIGHT; + uictx.canvas.width = GAMEVIEW_WIDTH; + uictx.canvas.height = GAMEVIEW_HEIGHT; - const bg = core.material.images.images["status.webp"]; //横屏背景(左) - bgctx.drawImage(bg, 0, 0, BAR_WIDTH, GAMEVIEW_HEIGHT); - const bg2 = core.material.images.images["status.webp"]; //横屏背景(右) - bgctx.drawImage( - bg2, - BAR_WIDTH + GAMEVIEW_HEIGHT, - 0, - BAR_WIDTH, - GAMEVIEW_HEIGHT - ); - bgctx.globalAlpha = globalAlpha; + const bg = core.material.images.images["status.webp"]; //横屏背景(左) + bgctx.drawImage(bg, 0, 0, BAR_WIDTH, GAMEVIEW_HEIGHT); + const bg2 = core.material.images.images["status.webp"]; //横屏背景(右) + bgctx.drawImage( + bg2, + BAR_WIDTH + GAMEVIEW_HEIGHT, + 0, + BAR_WIDTH, + GAMEVIEW_HEIGHT + ); + bgctx.globalAlpha = globalAlpha; - bgctx.globalAlpha = 1; - core.setTextAlign("outerUI", "center"); - } - } - // 更新属性 - _update_props(updatedFloorTitle) { - if (!updatedFloorTitle && core.status.floorId) { - updatedFloorTitle = core.status.maps[core.status.floorId].title; - } - const statusList = ["hp", "atk", "def", "money"]; //属性列表,图标在函数复写core.statusBar.icons中声明,数字为project\materials\icons.png中的图标序号(可使用便捷ps追加,第一个序号为0) - const drawStatusList = (baseX, baseY) => { - let curh = baseY; - core.setTextAlign("outerUI", "right"); - statusList.forEach((item) => { - // 绘制图标 - core.drawIcon( - "outerUI", - item, - baseX - 95 * 3, - curh - 18 * 3, - 22 * 3, - 22 * 3 - ); + bgctx.globalAlpha = 1; + core.setTextAlign("outerUI", "center"); + } + } + // 更新属性 + _update_props(updatedFloorTitle) { + if (!updatedFloorTitle && core.status.floorId) { + updatedFloorTitle = core.status.maps[core.status.floorId].title; + } + const statusList = ["hp", "atk", "def", "money"]; //属性列表,图标在函数复写core.statusBar.icons中声明,数字为project\materials\icons.png中的图标序号(可使用便捷ps追加,第一个序号为0) + const drawStatusList = (baseX, baseY) => { + let curh = baseY; + core.setTextAlign("outerUI", "right"); + statusList.forEach((item) => { + // 绘制图标 + core.drawIcon( + "outerUI", + item, + baseX - 95 * 3, + curh - 18 * 3, + 22 * 3, + 22 * 3 + ); - // 四舍五入 - core.status.hero[item] = Math.round(core.status.hero[item]); - // 大数据格式化 - core.fillBoldText1( - "outerUI", - core.getRealStatus(item), - baseX, - curh, - TEXT_COLOR, - "#000000", - 6 - ); - curh += 24 * 3; - if (curh > 130 * 3 && core.domStyle.isVertical) { - curh = 24 * 3; - baseX += 105 * 3; - } - }); - core.setTextAlign("outerUI", "center"); - }; - if (core.domStyle.isVertical) { - core.clearMap("outerUI", 10 * 3, 0, 210 * 3, 120 * 3); - core.setFont("outerUI", "bold 42px Verdana"); - if (updatedFloorTitle) { - core.fillBoldText1( - "outerUI", - updatedFloorTitle, - 60 * 3, - 22 * 3, - TEXT_COLOR, - "#000000", - 6 - ); - } - //drawStatusList(96 * 3, 46 * 3); - //core.drawImage("outerUI", "lane1.png", 0, 0) - core.drawImage("outerUI", "cao.webp", 0, 0); - } else { - core.clearMap("outerUI", 10 * 3, 40 * 3, 105 * 3, 250 * 3); - core.setFont("outerUI", "bold 48px Verdana"); - if (updatedFloorTitle) { - core.fillBoldText1( - "outerUI", - updatedFloorTitle, - 62 * 3, - 41 * 3, - TEXT_COLOR, - "#000000", - 6 - ); - } - //drawStatusList(110 * 3, 93 * 3); - //core.drawImage("outerUI", "lane1.png", 0, 30) - core.drawImage( - "outerUI", - "cao.webp", - 0, - 0, - 400, - 350, - 0, - 30, - 360, - 315 - ); - } - } - _update_items() { - //更新道具栏 - const drawItemMx = (drawFn) => { - for (let i = 0; i < this.itemMx.length; i++) { - for (let j = 0; j < this.itemMx[i].length; j++) { - var item = this.itemMx[i][j]; - drawFn(i, j, item); - } - } - }; - const drawItem = (item, posx, posy) => { - const icon = core.material.icons.items[item], - image = core.material.images.items; - core.drawImage( - "outerUI", - image, - 0, - 32 * icon, - 32, - 32, - posx, - posy, - 30 * 3, - 30 * 3 - ); - const cnt = core.itemCount(item); - if ( - (core.items.items[item].cls === "tools" && cnt > 1) || - FORCE_COUNTABLE_ITEMS.includes(item) - ) { - core.fillText( - "outerUI", - cnt, - posx + 25 * 3, - posy + 28 * 3, - "#FFFFFF", - "bold 36px Verdana" - ); - } - }; - if (core.domStyle.isVertical) { - core.clearMap( - "outerUI", - ITEM_BOX_LEFT_VERTICAL, - ITEM_BOX_TOP_VERTICAL, - 185 * 3, - 125 * 3 - ); + // 四舍五入 + core.status.hero[item] = Math.round(core.status.hero[item]); + // 大数据格式化 + core.fillBoldText1( + "outerUI", + core.getRealStatus(item), + baseX, + curh, + TEXT_COLOR, + "#000000", + 6 + ); + curh += 24 * 3; + if (curh > 130 * 3 && core.domStyle.isVertical) { + curh = 24 * 3; + baseX += 105 * 3; + } + }); + core.setTextAlign("outerUI", "center"); + }; + if (core.domStyle.isVertical) { + core.clearMap("outerUI", 10 * 3, 0, 210 * 3, 120 * 3); + core.setFont("outerUI", "bold 42px Verdana"); + if (updatedFloorTitle) { + core.fillBoldText1( + "outerUI", + updatedFloorTitle, + 60 * 3, + 22 * 3, + TEXT_COLOR, + "#000000", + 6 + ); + } + //drawStatusList(96 * 3, 46 * 3); + //core.drawImage("outerUI", "lane1.png", 0, 0) + core.drawImage("outerUI", "cao.webp", 0, 0); + } else { + core.clearMap("outerUI", 10 * 3, 40 * 3, 105 * 3, 250 * 3); + core.setFont("outerUI", "bold 48px Verdana"); + if (updatedFloorTitle) { + core.fillBoldText1( + "outerUI", + updatedFloorTitle, + 62 * 3, + 41 * 3, + TEXT_COLOR, + "#000000", + 6 + ); + } + //drawStatusList(110 * 3, 93 * 3); + //core.drawImage("outerUI", "lane1.png", 0, 30) + core.drawImage( + "outerUI", + "cao.webp", + 0, + 0, + 400, + 350, + 0, + 30, + 360, + 315 + ); + } + } + _update_items() { + //更新道具栏 + const drawItemMx = (drawFn) => { + for (let i = 0; i < this.itemMx.length; i++) { + for (let j = 0; j < this.itemMx[i].length; j++) { + var item = this.itemMx[i][j]; + drawFn(i, j, item); + } + } + }; + const drawItem = (item, posx, posy) => { + const icon = core.material.icons.items[item], + image = core.material.images.items; + core.drawImage( + "outerUI", + image, + 0, + 32 * icon, + 32, + 32, + posx, + posy, + 30 * 3, + 30 * 3 + ); + const cnt = core.itemCount(item); + if ( + (core.items.items[item].cls === "tools" && cnt > 1) || + FORCE_COUNTABLE_ITEMS.includes(item) + ) { + core.fillText( + "outerUI", + cnt, + posx + 25 * 3, + posy + 28 * 3, + "#FFFFFF", + "bold 36px Verdana" + ); + } + }; + if (core.domStyle.isVertical) { + core.clearMap( + "outerUI", + ITEM_BOX_LEFT_VERTICAL, + ITEM_BOX_TOP_VERTICAL, + 185 * 3, + 125 * 3 + ); - drawItemMx((i, j, item) => { - if (core.hasItem(item)) { - const posx = ITEM_BOX_LEFT_VERTICAL + i * 30 * 3, - posy = ITEM_BOX_TOP_VERTICAL + j * 31 * 3; - drawItem(item, posx, posy); - } - }); - } else { - core.clearMap( - "outerUI", - ITEM_BOX_LEFT, - ITEM_BOX_TOP, - 125 * 3, - 185 * 3 - ); + drawItemMx((i, j, item) => { + if (core.hasItem(item)) { + const posx = ITEM_BOX_LEFT_VERTICAL + i * 30 * 3, + posy = ITEM_BOX_TOP_VERTICAL + j * 31 * 3; + drawItem(item, posx, posy); + } + }); + } else { + core.clearMap( + "outerUI", + ITEM_BOX_LEFT, + ITEM_BOX_TOP, + 125 * 3, + 185 * 3 + ); - drawItemMx((i, j, item) => { - if (core.hasItem(item)) { - const posx = ITEM_BOX_LEFT + j * 30 * 3, - posy = ITEM_BOX_TOP + i * 31 * 3; - drawItem(item, posx, posy); - } - }); - } - } + drawItemMx((i, j, item) => { + if (core.hasItem(item)) { + const posx = ITEM_BOX_LEFT + j * 30 * 3, + posy = ITEM_BOX_TOP + i * 31 * 3; + drawItem(item, posx, posy); + } + }); + } + } - _update_map(floorId = core.status.floorId) { - const x = core.domStyle.isVertical ? - MAP_BLOCK_LEFT_VERTICAL : - MAP_BLOCK_LEFT; - const y = core.domStyle.isVertical ? - MAP_BLOCK_TOP_VERTICAL : - MAP_BLOCK_TOP; + _update_map(floorId = core.status.floorId) { + const x = core.domStyle.isVertical + ? MAP_BLOCK_LEFT_VERTICAL + : MAP_BLOCK_LEFT; + const y = core.domStyle.isVertical + ? MAP_BLOCK_TOP_VERTICAL + : MAP_BLOCK_TOP; - if (!floorId) return; - const info = core.plugin.getMapDrawInfo(floorId, Infinity, true); - core.setTextAlign("outerUI", "center"); + if (!floorId) return; + const info = core.plugin.getMapDrawInfo(floorId, Infinity, true); + core.setTextAlign("outerUI", "center"); - core.plugin.drawSmallMap(uictx, info, floorId, x, y, 300, 300); - } + core.plugin.drawSmallMap(uictx, info, floorId, x, y, 300, 300); + } - _update_equips() { - return; - core.setFont("outerUI", "bold 48px Verdana"); - const drawEquip = (baseX, baseY, id, color, back) => { - if (!id) - core.fillText( - "outerUI", - back, - baseX + 20 * 3, - baseY + 22 * 3, - color - ); - else { - var icon = core.material.icons.items[id]; - core.drawImage( - "outerUI", - core.material.images.items, - 0, - 32 * icon, - 32, - 32, - baseX + 5 * 3, - baseY, - 32 * 3, - 32 * 3 - ); - } - }; - if (core.domStyle.isVertical) { - core.clearMap( - "outerUI", - EQUIP_BLOCK_LEFT_VERTICAL, - EQUIP_BLOCK_TOP_VERTICAL, - 90 * 3, - 130 * 3 - ); - drawEquip( - EQUIP_BLOCK_LEFT_VERTICAL, - EQUIP_BLOCK_TOP_VERTICAL, - core.getEquip(0), - "#D1CEFF", - "无" - ); - drawEquip( - EQUIP_BLOCK_LEFT_VERTICAL + 45 * 3, - EQUIP_BLOCK_TOP_VERTICAL, - core.getEquip(1), - "#D1CEFF", - "无" - ); - drawEquip( - EQUIP_BLOCK_LEFT_VERTICAL, - EQUIP_BLOCK_TOP_VERTICAL + 45 * 3, - core.getEquip(2), - "#D1CEFF", - "无" - ); - drawEquip( - EQUIP_BLOCK_LEFT_VERTICAL + 45 * 3, - EQUIP_BLOCK_TOP_VERTICAL + 45 * 3, - core.getEquip(3), - "#D1CEFF", - "无" - ); - drawEquip( - EQUIP_BLOCK_LEFT_VERTICAL, - EQUIP_BLOCK_TOP_VERTICAL + 90 * 3, - core.getEquip(4), - "#D1CEFF", - "无" - ); - drawEquip( - EQUIP_BLOCK_LEFT_VERTICAL + 45 * 3, - EQUIP_BLOCK_TOP_VERTICAL + 90 * 3, - core.getEquip(5), - "#D1CEFF", - "无" - ); - } else { - core.clearMap( - "outerUI", - EQUIP_BLOCK_LEFT, - EQUIP_BLOCK_TOP, - 130 * 3, - 95 * 3 - ); - drawEquip( - EQUIP_BLOCK_LEFT, - EQUIP_BLOCK_TOP, - core.getEquip(0), - "#D1CEFF", - "无" - ); - drawEquip( - EQUIP_BLOCK_LEFT + 42 * 3, - EQUIP_BLOCK_TOP, - core.getEquip(1), - "#D1CEFF", - "无" - ); - drawEquip( - EQUIP_BLOCK_LEFT + 85 * 3, - EQUIP_BLOCK_TOP, - core.getEquip(2), - "#D1CEFF", - "无" - ); - drawEquip( - EQUIP_BLOCK_LEFT, - EQUIP_BLOCK_TOP + 45 * 3, - core.getEquip(3), - "#D1CEFF", - "无" - ); - drawEquip( - EQUIP_BLOCK_LEFT + 42 * 3, - EQUIP_BLOCK_TOP + 45 * 3, - core.getEquip(4), - "#D1CEFF", - "无" - ); - drawEquip( - EQUIP_BLOCK_LEFT + 85 * 3, - EQUIP_BLOCK_TOP + 45 * 3, - core.getEquip(5), - "#D1CEFF", - "无" - ); - } - } - _update_keys() { - const drawKeyList = (baseX, baseY) => { - const todraw = [], - keyList = ["yellowKey", "blueKey", "redKey", "greenKey"]; - let total = 0; - keyList.forEach(function (key, i) { - todraw[i] = core.itemCount(key); - total += todraw[i]; - }); + _update_equips() { + return; + core.setFont("outerUI", "bold 48px Verdana"); + const drawEquip = (baseX, baseY, id, color, back) => { + if (!id) + core.fillText( + "outerUI", + back, + baseX + 20 * 3, + baseY + 22 * 3, + color + ); + else { + var icon = core.material.icons.items[id]; + core.drawImage( + "outerUI", + core.material.images.items, + 0, + 32 * icon, + 32, + 32, + baseX + 5 * 3, + baseY, + 32 * 3, + 32 * 3 + ); + } + }; + if (core.domStyle.isVertical) { + core.clearMap( + "outerUI", + EQUIP_BLOCK_LEFT_VERTICAL, + EQUIP_BLOCK_TOP_VERTICAL, + 90 * 3, + 130 * 3 + ); + drawEquip( + EQUIP_BLOCK_LEFT_VERTICAL, + EQUIP_BLOCK_TOP_VERTICAL, + core.getEquip(0), + "#D1CEFF", + "无" + ); + drawEquip( + EQUIP_BLOCK_LEFT_VERTICAL + 45 * 3, + EQUIP_BLOCK_TOP_VERTICAL, + core.getEquip(1), + "#D1CEFF", + "无" + ); + drawEquip( + EQUIP_BLOCK_LEFT_VERTICAL, + EQUIP_BLOCK_TOP_VERTICAL + 45 * 3, + core.getEquip(2), + "#D1CEFF", + "无" + ); + drawEquip( + EQUIP_BLOCK_LEFT_VERTICAL + 45 * 3, + EQUIP_BLOCK_TOP_VERTICAL + 45 * 3, + core.getEquip(3), + "#D1CEFF", + "无" + ); + drawEquip( + EQUIP_BLOCK_LEFT_VERTICAL, + EQUIP_BLOCK_TOP_VERTICAL + 90 * 3, + core.getEquip(4), + "#D1CEFF", + "无" + ); + drawEquip( + EQUIP_BLOCK_LEFT_VERTICAL + 45 * 3, + EQUIP_BLOCK_TOP_VERTICAL + 90 * 3, + core.getEquip(5), + "#D1CEFF", + "无" + ); + } else { + core.clearMap( + "outerUI", + EQUIP_BLOCK_LEFT, + EQUIP_BLOCK_TOP, + 130 * 3, + 95 * 3 + ); + drawEquip( + EQUIP_BLOCK_LEFT, + EQUIP_BLOCK_TOP, + core.getEquip(0), + "#D1CEFF", + "无" + ); + drawEquip( + EQUIP_BLOCK_LEFT + 42 * 3, + EQUIP_BLOCK_TOP, + core.getEquip(1), + "#D1CEFF", + "无" + ); + drawEquip( + EQUIP_BLOCK_LEFT + 85 * 3, + EQUIP_BLOCK_TOP, + core.getEquip(2), + "#D1CEFF", + "无" + ); + drawEquip( + EQUIP_BLOCK_LEFT, + EQUIP_BLOCK_TOP + 45 * 3, + core.getEquip(3), + "#D1CEFF", + "无" + ); + drawEquip( + EQUIP_BLOCK_LEFT + 42 * 3, + EQUIP_BLOCK_TOP + 45 * 3, + core.getEquip(4), + "#D1CEFF", + "无" + ); + drawEquip( + EQUIP_BLOCK_LEFT + 85 * 3, + EQUIP_BLOCK_TOP + 45 * 3, + core.getEquip(5), + "#D1CEFF", + "无" + ); + } + } + _update_keys() { + const drawKeyList = (baseX, baseY) => { + const todraw = [], + keyList = ["yellowKey", "blueKey", "redKey", "greenKey"]; + let total = 0; + keyList.forEach(function (key, i) { + todraw[i] = core.itemCount(key); + total += todraw[i]; + }); - let dn = 3; - for (let i = 0; i <= dn; i++) { - let delta = i * 32 * 3; + let dn = 3; + for (let i = 0; i <= dn; i++) { + let delta = i * 32 * 3; - if (core.domStyle.isVertical) { - this.drawKey(keyList[i], baseX, baseY + delta); - } else { - this.drawKey(keyList[i], baseX + delta, baseY); - } + if (core.domStyle.isVertical) { + this.drawKey(keyList[i], baseX, baseY + delta); + } else { + this.drawKey(keyList[i], baseX + delta, baseY); + } - core.setFont("outerUI", "bold 48px Verdana"); - core.setTextAlign("outerUI", "left"); - if (core.domStyle.isVertical) { - core.fillText( - "outerUI", - todraw[i], - baseX + 20 * 3, - baseY + 14 * 3 + delta, - TEXT_COLOR - ); - } else { - core.fillText( - "outerUI", - todraw[i], - baseX + delta, - baseY + 32 * 3, - TEXT_COLOR - ); - } - } - }; - if (core.domStyle.isVertical) { - core.clearMap( - "outerUI", - KEY_BLOCK_LEFT_VERTICAL, - KEY_BLOCK_TOP_VERTICAL, - 45 * 3, - 130 * 3 - ); - drawKeyList( - KEY_BLOCK_LEFT_VERTICAL + 3 * 3, - KEY_BLOCK_TOP_VERTICAL + 5 * 3 - ); - } else { - core.clearMap( - "outerUI", - KEY_BLOCK_LEFT, - KEY_BLOCK_TOP, - 130 * 3, - 45 * 3 - ); - drawKeyList(KEY_BLOCK_LEFT + 10 * 3, KEY_BLOCK_TOP); - } - } - drawKey(key, x, y) { - let sx = 0, - sy = 0; + core.setFont("outerUI", "bold 48px Verdana"); + core.setTextAlign("outerUI", "left"); + if (core.domStyle.isVertical) { + core.fillText( + "outerUI", + todraw[i], + baseX + 20 * 3, + baseY + 14 * 3 + delta, + TEXT_COLOR + ); + } else { + core.fillText( + "outerUI", + todraw[i], + baseX + delta, + baseY + 32 * 3, + TEXT_COLOR + ); + } + } + }; + if (core.domStyle.isVertical) { + core.clearMap( + "outerUI", + KEY_BLOCK_LEFT_VERTICAL, + KEY_BLOCK_TOP_VERTICAL, + 45 * 3, + 130 * 3 + ); + drawKeyList( + KEY_BLOCK_LEFT_VERTICAL + 3 * 3, + KEY_BLOCK_TOP_VERTICAL + 5 * 3 + ); + } else { + core.clearMap( + "outerUI", + KEY_BLOCK_LEFT, + KEY_BLOCK_TOP, + 130 * 3, + 45 * 3 + ); + drawKeyList(KEY_BLOCK_LEFT + 10 * 3, KEY_BLOCK_TOP); + } + } + drawKey(key, x, y) { + let sx = 0, + sy = 0; - if (key == "yellowKey") sx += 13; - else if (key == "blueKey") sx += 26; - else if (key == "greenKey") sx += 39; + if (key == "yellowKey") sx += 13; + else if (key == "blueKey") sx += 26; + else if (key == "greenKey") sx += 39; - core.drawImage( - "outerUI", - "maba.webp", - sx, - sy, - 13, - 26, - x, - y, - 13 * 3, - 26 * 3 - ); - } - _update_infoWindow() { - const itemId = this.selectedItem; - let text = ""; - if (this.selectedItem) { - text = core.replaceText(core.material.items[itemId]?.text); - if (text[0] == "," || text[0] == ",") text = text.substring(1); - } - if (core.domStyle.isVertical) { - core.clearMap( - "outerUI", - INFO_BLOCK_LEFT_VERTICAL, - INFO_BLOCK_TOP_VERTICAL, - 300 * 3, - 120 * 3 - ); + core.drawImage( + "outerUI", + "maba.webp", + sx, + sy, + 13, + 26, + x, + y, + 13 * 3, + 26 * 3 + ); + } + _update_infoWindow() { + const itemId = this.selectedItem; + let text = ""; + if (this.selectedItem) { + text = core.replaceText(core.material.items[itemId]?.text); + if (text[0] == "," || text[0] == ",") text = text.substring(1); + } + if (core.domStyle.isVertical) { + core.clearMap( + "outerUI", + INFO_BLOCK_LEFT_VERTICAL, + INFO_BLOCK_TOP_VERTICAL, + 300 * 3, + 120 * 3 + ); - if (this.selectedItem) { - const icon = core.material.icons.items[itemId]; - core.setTextAlign("outerUI", "left"); - core.fillText( - "outerUI", - core.material.items[itemId].name, - INFO_BLOCK_LEFT_VERTICAL + 50 * 3, - INFO_BLOCK_TOP_VERTICAL + 27 * 3, - "#D1CEFF" - ); - core.drawImage( - "outerUI", - core.material.images.items, - 0, - 32 * icon, - 32, - 32, - INFO_BLOCK_LEFT_VERTICAL + 10 * 3, - INFO_BLOCK_TOP_VERTICAL + 8 * 3, - 32 * 3, - 32 * 3 - ); - core.ui.drawTextContent("outerUI", text, { - left: INFO_BLOCK_LEFT_VERTICAL + 10 * 3, - top: INFO_BLOCK_TOP_VERTICAL + 40 * 3, - maxWidth: 275 * 3, - color: "#D1CEFF", - fontSize: 36, - }); - } - } else { - core.clearMap( - "outerUI", - INFO_BLOCK_LEFT, - INFO_BLOCK_TOP, - 115 * 3, - 230 * 3 - ); + if (this.selectedItem) { + const icon = core.material.icons.items[itemId]; + core.setTextAlign("outerUI", "left"); + core.fillText( + "outerUI", + core.material.items[itemId].name, + INFO_BLOCK_LEFT_VERTICAL + 50 * 3, + INFO_BLOCK_TOP_VERTICAL + 27 * 3, + "#D1CEFF" + ); + core.drawImage( + "outerUI", + core.material.images.items, + 0, + 32 * icon, + 32, + 32, + INFO_BLOCK_LEFT_VERTICAL + 10 * 3, + INFO_BLOCK_TOP_VERTICAL + 8 * 3, + 32 * 3, + 32 * 3 + ); + core.ui.drawTextContent("outerUI", text, { + left: INFO_BLOCK_LEFT_VERTICAL + 10 * 3, + top: INFO_BLOCK_TOP_VERTICAL + 40 * 3, + maxWidth: 275 * 3, + color: "#D1CEFF", + fontSize: 36, + }); + } + } else { + core.clearMap( + "outerUI", + INFO_BLOCK_LEFT, + INFO_BLOCK_TOP, + 115 * 3, + 230 * 3 + ); - if (this.selectedItem) { - const icon = core.material.icons.items[itemId]; - core.setTextAlign("outerUI", "center"); - core.fillText( - "outerUI", - core.material.items[itemId].name, - INFO_BLOCK_LEFT + 60 * 3, - INFO_BLOCK_TOP + 25 * 3, - "#D1CEFF" - ); - core.drawImage( - "outerUI", - core.material.images.items, - 0, - 32 * icon, - 32, - 32, - INFO_BLOCK_LEFT + 45 * 3, - INFO_BLOCK_TOP + 30 * 3, - 32 * 3, - 32 * 3 - ); - core.ui.drawTextContent("outerUI", text, { - left: INFO_BLOCK_LEFT + 10 * 3, - top: INFO_BLOCK_TOP + 60 * 3, - maxWidth: 105 * 3, - color: "#D1CEFF", - fontSize: 36, - }); - } - } - } - showItemInfo(itemId) { - //展示道具说明 - this.selectedItem = itemId; - this._update_infoWindow(); - } - clearItemInfo() { - //清除道具说明 - this.selectedItem = null; - this._update_infoWindow(); - } - _update_toolBox() { - const tools = core.isReplaying() ? - [ - [core.status.replay.pausing ? "play" : "pause", "stop", "rewind"], - ["speedDown", "speedUp", "save"], - ] : - [ - ["keyboard", "shop", "pack", "T332"], - ["settings", "save", "load", "T331"], - ]; - if (core.domStyle.isVertical) { - core.clearMap( - "outerUI", - TOOL_BOX_LEFT_VERTICAL, - TOOL_BOX_TOP_VERTICAL, - 115, - 130 - ); + if (this.selectedItem) { + const icon = core.material.icons.items[itemId]; + core.setTextAlign("outerUI", "center"); + core.fillText( + "outerUI", + core.material.items[itemId].name, + INFO_BLOCK_LEFT + 60 * 3, + INFO_BLOCK_TOP + 25 * 3, + "#D1CEFF" + ); + core.drawImage( + "outerUI", + core.material.images.items, + 0, + 32 * icon, + 32, + 32, + INFO_BLOCK_LEFT + 45 * 3, + INFO_BLOCK_TOP + 30 * 3, + 32 * 3, + 32 * 3 + ); + core.ui.drawTextContent("outerUI", text, { + left: INFO_BLOCK_LEFT + 10 * 3, + top: INFO_BLOCK_TOP + 60 * 3, + maxWidth: 105 * 3, + color: "#D1CEFF", + fontSize: 36, + }); + } + } + } + showItemInfo(itemId) { + //展示道具说明 + this.selectedItem = itemId; + this._update_infoWindow(); + } + clearItemInfo() { + //清除道具说明 + this.selectedItem = null; + this._update_infoWindow(); + } + _update_toolBox() { + const tools = core.isReplaying() + ? [ + [core.status.replay.pausing ? "play" : "pause", "stop", "rewind"], + ["speedDown", "speedUp", "save"], + ] + : [ + ["keyboard", "shop", "pack", "T332"], + ["settings", "save", "load", "T331"], + ]; + if (core.domStyle.isVertical) { + core.clearMap( + "outerUI", + TOOL_BOX_LEFT_VERTICAL, + TOOL_BOX_TOP_VERTICAL, + 115, + 130 + ); - for (let i = 0; i < tools.length; i++) { - for (let j = 0; j < tools[i].length; j++) { - core.drawIcon( - "outerUI", - tools[i][j], - TOOL_BOX_LEFT_VERTICAL + i * 31 * 3, - TOOL_BOX_TOP_VERTICAL + j * 31 * 3, - 30 * 3, - 30 * 3 - ); - } - } - } else { - core.clearMap( - "outerUI", - TOOL_BOX_LEFT, - TOOL_BOX_TOP, - 130 * 3, - 80 * 3 - ); + for (let i = 0; i < tools.length; i++) { + for (let j = 0; j < tools[i].length; j++) { + core.drawIcon( + "outerUI", + tools[i][j], + TOOL_BOX_LEFT_VERTICAL + i * 31 * 3, + TOOL_BOX_TOP_VERTICAL + j * 31 * 3, + 30 * 3, + 30 * 3 + ); + } + } + } else { + core.clearMap( + "outerUI", + TOOL_BOX_LEFT, + TOOL_BOX_TOP, + 130 * 3, + 80 * 3 + ); - for (let i = 0; i < tools.length; i++) { - for (let j = 0; j < tools[i].length; j++) { - core.drawIcon( - "outerUI", - tools[i][j], - TOOL_BOX_LEFT + j * 31 * 3, - TOOL_BOX_TOP + i * 31 * 3, - 30 * 3, - 30 * 3 - ); - } - } - } - } - onclick(x, y) { - const makeBox = ([x, y], [w, h]) => { - return [ - [x, y], - [x + w, y + h], - ]; - }; - const gridify = ([x, y], [gw, gh]) => { - return [Math.floor(x / gw), Math.floor(y / gh)]; - }; - const useItem = (itemId) => { - if (!core.hasItem(itemId)) return; + for (let i = 0; i < tools.length; i++) { + for (let j = 0; j < tools[i].length; j++) { + core.drawIcon( + "outerUI", + tools[i][j], + TOOL_BOX_LEFT + j * 31 * 3, + TOOL_BOX_TOP + i * 31 * 3, + 30 * 3, + 30 * 3 + ); + } + } + } + } + onclick(x, y) { + const makeBox = ([x, y], [w, h]) => { + return [ + [x, y], + [x + w, y + h], + ]; + }; + const gridify = ([x, y], [gw, gh]) => { + return [Math.floor(x / gw), Math.floor(y / gh)]; + }; + const useItem = (itemId) => { + if (!core.hasItem(itemId)) return; - if (itemId != this.selectedItem) { - this.showItemInfo(itemId); - } else { - switch (itemId) { - case "centerFly": - core.ui._drawCenterFly(); - break; - case "book": - core.openBook(true); - break; - case "wand": - core.insertAction({ - type: "useItem", - id: itemId, - }); - break; - case "fly": - core.useItem(itemId); - break; - default: - core.useItem(itemId); - } - } - }; - const inRect = ([x, y], [ - [sx, sy], - [dx, dy] - ]) => { - return sx <= x && x <= dx && sy <= y && y <= dy; - }; - const relativeTo = ([x, y], [ax, ay]) => { - return [x - ax, y - ay]; - }; - const pos = [x, y]; - if (core.domStyle.isVertical) { - const itemBox = makeBox( - [ITEM_BOX_LEFT_VERTICAL, ITEM_BOX_TOP_VERTICAL], - [30 * 6 * 3, 31 * 4 * 3] - ); - if (inRect(pos, itemBox)) { - const [gx, gy] = gridify(relativeTo(pos, itemBox[0]), [ - 30 * 3, - 31 * 3, - ]); - const itemId = this.itemMx[gx][gy]; - if ( - (core.status.event.id == "viewMaps" || - core.status.event.id == "fly") && - itemId === "book" - ) - core.openBook(true); - if ( - core.isReplaying() || - core.status.lockControl || - core.isMoving() - ) - return; - useItem(itemId); - return; - } - const toolBox = makeBox( - [TOOL_BOX_LEFT_VERTICAL, TOOL_BOX_TOP_VERTICAL], - [31 * 2 * 3, 31 * 4 * 3] - ); - if (inRect(pos, toolBox)) { - const [col, row] = gridify(relativeTo(pos, toolBox[0]), [ - 31 * 3, - 31 * 3, - ]); - if (core.status.lockControl || core.isMoving()) return; - if (core.isReplaying()) { - this.replayAction[col][row].call(core); - } else if (core.isPlaying()) { - if (col === 0 && row === 3) { - core.doSL("autoSave", "load"); - } else if (col === 1 && row === 3) { - core.doSL("autoSave", "reload"); - } else { - this.toolbarAction[col][row].call(core, true); - } - } - return; - } - const mapBox = makeBox( - [MAP_BLOCK_LEFT_VERTICAL, MAP_BLOCK_TOP_VERTICAL], - [350, 350] - ); - if (inRect(pos, mapBox)) { - if ( - core.isReplaying() || - core.status.lockControl || - core.isMoving() - ) - return; - core.useItem("fly"); - return; - } - /*const equipBox = makeBox([EQUIP_BLOCK_LEFT_VERTICAL, EQUIP_BLOCK_TOP_VERTICAL], [90 * 3, 130 * 3]) + if (itemId != this.selectedItem) { + this.showItemInfo(itemId); + } else { + switch (itemId) { + case "centerFly": + core.ui._drawCenterFly(); + break; + case "book": + core.openBook(true); + break; + case "wand": + core.insertAction({ + type: "useItem", + id: itemId, + }); + break; + case "fly": + core.useItem(itemId); + break; + default: + core.useItem(itemId); + } + } + }; + const inRect = ([x, y], [[sx, sy], [dx, dy]]) => { + return sx <= x && x <= dx && sy <= y && y <= dy; + }; + const relativeTo = ([x, y], [ax, ay]) => { + return [x - ax, y - ay]; + }; + const pos = [x, y]; + if (core.domStyle.isVertical) { + const itemBox = makeBox( + [ITEM_BOX_LEFT_VERTICAL, ITEM_BOX_TOP_VERTICAL], + [30 * 6 * 3, 31 * 4 * 3] + ); + if (inRect(pos, itemBox)) { + const [gx, gy] = gridify(relativeTo(pos, itemBox[0]), [ + 30 * 3, + 31 * 3, + ]); + const itemId = this.itemMx[gx][gy]; + if ( + (core.status.event.id == "viewMaps" || + core.status.event.id == "fly") && + itemId === "book" + ) + core.openBook(true); + if ( + core.isReplaying() || + core.status.lockControl || + core.isMoving() + ) + return; + useItem(itemId); + return; + } + const toolBox = makeBox( + [TOOL_BOX_LEFT_VERTICAL, TOOL_BOX_TOP_VERTICAL], + [31 * 2 * 3, 31 * 4 * 3] + ); + if (inRect(pos, toolBox)) { + const [col, row] = gridify(relativeTo(pos, toolBox[0]), [ + 31 * 3, + 31 * 3, + ]); + if (core.status.lockControl || core.isMoving()) return; + if (core.isReplaying()) { + this.replayAction[col][row].call(core); + } else if (core.isPlaying()) { + if (col === 0 && row === 3) { + core.doSL("autoSave", "load"); + } else if (col === 1 && row === 3) { + core.doSL("autoSave", "reload"); + } else { + this.toolbarAction[col][row].call(core, true); + } + } + return; + } + const mapBox = makeBox( + [MAP_BLOCK_LEFT_VERTICAL, MAP_BLOCK_TOP_VERTICAL], + [350, 350] + ); + if (inRect(pos, mapBox)) { + if ( + core.isReplaying() || + core.status.lockControl || + core.isMoving() + ) + return; + core.useItem("fly"); + return; + } + /*const equipBox = makeBox([EQUIP_BLOCK_LEFT_VERTICAL, EQUIP_BLOCK_TOP_VERTICAL], [90 * 3, 130 * 3]) if (inRect(pos, equipBox)) { if (core.isReplaying() || core.status.lockControl || core.isMoving()) return; core.openEquipbox(true) return; }*/ - } else { - const mapBox = makeBox([MAP_BLOCK_LEFT, MAP_BLOCK_TOP], [350, 350]); - if (inRect(pos, mapBox)) { - if ( - core.isReplaying() || - core.status.lockControl || - core.isMoving() - ) - return; - core.useItem("fly"); - return; - } - /* + } else { + const mapBox = makeBox([MAP_BLOCK_LEFT, MAP_BLOCK_TOP], [350, 350]); + if (inRect(pos, mapBox)) { + if ( + core.isReplaying() || + core.status.lockControl || + core.isMoving() + ) + return; + core.useItem("fly"); + return; + } + /* const equipBox = makeBox([EQUIP_BLOCK_LEFT, EQUIP_BLOCK_TOP], [130, 95]) if (inRect(pos, equipBox)) { if (core.isReplaying() || core.status.lockControl || core.isMoving()) return; core.openEquipbox(true) return; }*/ - const itemBox = makeBox( - [ITEM_BOX_LEFT, ITEM_BOX_TOP], - [31 * 4 * 3, 30 * 6 * 3] - ); - if (inRect(pos, itemBox)) { - const [gx, gy] = gridify(relativeTo(pos, itemBox[0]), [ - 31 * 3, - 30 * 3, - ]); - const itemId = this.itemMx[gy][gx]; - if ( - (core.status.event.id == "viewMaps" || - core.status.event.id == "fly") && - itemId === "book" - ) - core.openBook(true); - if ( - core.isReplaying() || - core.status.lockControl || - core.isMoving() - ) - return; - useItem(itemId); - return; - } - const toolBox = makeBox( - [TOOL_BOX_LEFT, TOOL_BOX_TOP], - [31 * 4 * 3, 31 * 2 * 3] - ); - if (inRect(pos, toolBox)) { - const [row, col] = gridify(relativeTo(pos, toolBox[0]), [ - 31 * 3, - 31 * 3, - ]); - if (core.status.lockControl || core.isMoving()) return; - if (core.isReplaying()) { - this.replayAction[col][row].call(core); - } else if (core.isPlaying()) { - if (col === 0 && row === 3) { - core.doSL("autoSave", "load"); - } else if (col === 1 && row === 3) { - core.doSL("autoSave", "reload"); - } else { - this.toolbarAction[col][row].call(core, true); - } - } - return; - } - } - } - } + const itemBox = makeBox( + [ITEM_BOX_LEFT, ITEM_BOX_TOP], + [31 * 4 * 3, 30 * 6 * 3] + ); + if (inRect(pos, itemBox)) { + const [gx, gy] = gridify(relativeTo(pos, itemBox[0]), [ + 31 * 3, + 30 * 3, + ]); + const itemId = this.itemMx[gy][gx]; + if ( + (core.status.event.id == "viewMaps" || + core.status.event.id == "fly") && + itemId === "book" + ) + core.openBook(true); + if ( + core.isReplaying() || + core.status.lockControl || + core.isMoving() + ) + return; + useItem(itemId); + return; + } + const toolBox = makeBox( + [TOOL_BOX_LEFT, TOOL_BOX_TOP], + [31 * 4 * 3, 31 * 2 * 3] + ); + if (inRect(pos, toolBox)) { + const [row, col] = gridify(relativeTo(pos, toolBox[0]), [ + 31 * 3, + 31 * 3, + ]); + if (core.status.lockControl || core.isMoving()) return; + if (core.isReplaying()) { + this.replayAction[col][row].call(core); + } else if (core.isPlaying()) { + if (col === 0 && row === 3) { + core.doSL("autoSave", "load"); + } else if (col === 1 && row === 3) { + core.doSL("autoSave", "reload"); + } else { + this.toolbarAction[col][row].call(core, true); + } + } + return; + } + } + } + } - core.ui.statusBar = new StatusBar(); + core.ui.statusBar = new StatusBar(); - core.control.clearStatusBar = function () { - core.clearMap("outerUI"); - }; - // init() called in `afterLoadResources`. -}, + core.control.clearStatusBar = function () { + core.clearMap("outerUI"); + }; + // init() called in `afterLoadResources`. + }, "override": function () { core.statusBar.icons = { floor: 0, @@ -12485,2062 +12486,2079 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 = }; }, "小地图": function () { - // 在此增加新插件 - // ----- 不可自定义 杂七杂八的变量 - /** @type {{[x: string]: BFSResult}} */ - let mapCache = {}; // 地图缓存 - let drawCache = {}; // 绘制信息缓存 - let status = "none"; // 当前的绘制状态 - /** @type {{[x: string]: Sprite}} */ - let sprites = {}; // 当前所有的sprite - /** @type {{[x: string]: Sprite}} */ - let canDrag = {}; // 可以拖拽的sprite - /** @type {{[x: string]: Button}} */ - let areaSprite = {}; // 区域列表对应的sprite - let clicking = false; // 是否正在点击,用于拖拽判定 - let drawingMap = ""; // 正在绘制的中心楼层 - let nowScale = 0; // 当前绘制的放缩比例 - let lastTouch = {}; // 上一次的单点点击信息 - let lastLength = 0; // 手机端缩放时上一次的两指间距离 - let nowDepth = 0; // 当前的遍历深度 - let drawedThumbnail = {}; // 已经绘制过的缩略图 - let moved = false; // 鼠标按下后是否移动了 - let noBorder = false; // 是否是无边框拼接模式 - let lastScale = 0; // 上一次缩放,用于优化缩略图绘制 - let areaPage = 0; // 区域显示的当前页数 - let nowArea = 0; // 当前区域index - let selecting = ""; // 选择时当前正在选择的地图 + // 在此增加新插件 + // ----- 不可自定义 杂七杂八的变量 + /** @type {{[x: string]: BFSResult}} */ + let mapCache = {}; // 地图缓存 + let drawCache = {}; // 绘制信息缓存 + let status = "none"; // 当前的绘制状态 + /** @type {{[x: string]: Sprite}} */ + let sprites = {}; // 当前所有的sprite + /** @type {{[x: string]: Sprite}} */ + let canDrag = {}; // 可以拖拽的sprite + /** @type {{[x: string]: Button}} */ + let areaSprite = {}; // 区域列表对应的sprite + let clicking = false; // 是否正在点击,用于拖拽判定 + let drawingMap = ""; // 正在绘制的中心楼层 + let nowScale = 0; // 当前绘制的放缩比例 + let lastTouch = {}; // 上一次的单点点击信息 + let lastLength = 0; // 手机端缩放时上一次的两指间距离 + let nowDepth = 0; // 当前的遍历深度 + let drawedThumbnail = {}; // 已经绘制过的缩略图 + let moved = false; // 鼠标按下后是否移动了 + let noBorder = false; // 是否是无边框拼接模式 + let lastScale = 0; // 上一次缩放,用于优化缩略图绘制 + let areaPage = 0; // 区域显示的当前页数 + let nowArea = 0; // 当前区域index + let selecting = ""; // 选择时当前正在选择的地图 - // ---- 不可自定义,常量 - /** @type {Area} */ - let areas = []; // 区域信息 - const perPage = Math.floor((core._PY_ - 60) / 30); // 区域的每页显示数量 + // ---- 不可自定义,常量 + /** @type {Area} */ + let areas = []; // 区域信息 + const perPage = Math.floor((core._PY_ - 60) / 30); // 区域的每页显示数量 - // ---- 可自定义,默认的切换地图的图块id - const defaultChange = { - left: "leftPortal", // 左箭头 - up: "upPortal", // 上箭头 - right: "rightPortal", // 右箭头 - down: "downPortal", // 下箭头 - upFloor: "upFloor", // 上楼 - downFloor: "downFloor", // 下楼 - }; - // ---- 可自定义,默认数值 - const defaultValue = { - font: "Verdana", // 默认字体 - scale: 60, // 默认地图缩放比例 - depth: Infinity, // 默认的遍历深度 - }; + // ---- 可自定义,默认的切换地图的图块id + const defaultChange = { + left: "leftPortal", // 左箭头 + up: "upPortal", // 上箭头 + right: "rightPortal", // 右箭头 + down: "downPortal", // 下箭头 + upFloor: "upFloor", // 上楼 + downFloor: "downFloor", // 下楼 + }; + // ---- 可自定义,默认数值 + const defaultValue = { + font: "Verdana", // 默认字体 + scale: 60, // 默认地图缩放比例 + depth: Infinity, // 默认的遍历深度 + }; - // ---- 不可自定义,计算数据 - const dirData = { - up: [1, 0], - down: [-1, 0], - left: [0, 1], - right: [0, -1], - upFloor: [0, 0], - downFloor: [0, 0], - }; - let ignoreEnemies = (this.ignoreEnemies = []); + // ---- 不可自定义,计算数据 + const dirData = { + up: [1, 0], + down: [-1, 0], + left: [0, 1], + right: [0, -1], + upFloor: [0, 0], + downFloor: [0, 0], + }; + let ignoreEnemies = (this.ignoreEnemies = []); - let allChangeEntries = Object.entries(defaultChange); + let allChangeEntries = Object.entries(defaultChange); - this.setq = function (floorId) { - core.setFlag("任务地点", floorId); - }; + this.setq = function (floorId) { + core.setFlag("任务地点", floorId); + }; - const reset = core.events.resetGame; - this.bfs = function () { - areas = []; - // 获取所有分区,使用异步函数,保证不会卡顿 - // 原理是用bfs扫,将所有连在一起的地图合并成一个区域 - (async function () { - let all = core.floorIds.slice(); - const scanned = { - [all[0]]: true, - }; - while (all.length > 0) { - let now = all.shift(); - if (core.status.maps[now].deleted) continue; - if (!now) return; - await new Promise((res) => { - const result = core.plugin.bfsSearch(now, Infinity, true); - mapCache[`${now}_Infinity_false`] = result; - areas.push({ name: core.floors[now].areas, maps: result.order }); - for (const map of result.order) { - scanned[map] = true; - all = all.filter((v) => !result.order.includes(v)); - } - res("success"); - }).then(() => { - core.setFlag("areas", areas); - }); - } - })(); - }; - core.events.resetGame = function () { - reset.apply(core.events, arguments); - core.plugin.bfs(); - }; - /** - * 广度优先搜索搜索地图路径 - * @param {string} center 中心地图的id - * @param {number} depth 搜索深度 - * @param {boolean} noCache 是否不使用缓存 - * @returns {BFSResult} 格式:floorId_x_y_dir: floorId_x_y - */ - this.bfsSearch = function bfsSearch(center, depth, noCache) { - // 检查缓存 - const id = `${center}_${depth}_${noBorder}`; - if (mapCache[id] && !noCache) return mapCache[id]; - const used = { - [center]: true, - }; // 搜索过的楼层 - let queue = []; - let stack = [center]; // 当前栈 - let nowDepth = -1; - const mapOrder = [center]; // 遍历顺序,顺便还能记录遍历了哪些楼层 + const reset = core.events.resetGame; + this.bfs = function () { + areas = []; + // 获取所有分区,使用异步函数,保证不会卡顿 + // 原理是用bfs扫,将所有连在一起的地图合并成一个区域 + (async function () { + let all = core.floorIds.slice(); + const scanned = { + [all[0]]: true, + }; + while (all.length > 0) { + let now = all.shift(); + if (core.status.maps[now].deleted) continue; + if (!now) return; + await new Promise((res) => { + const result = core.plugin.bfsSearch(now, Infinity, true); + mapCache[`${now}_Infinity_false`] = result; + areas.push({ name: core.floors[now].areas, maps: result.order }); + for (const map of result.order) { + scanned[map] = true; + all = all.filter((v) => !result.order.includes(v)); + } + res("success"); + }).then(() => { + core.setFlag("areas", areas); + }); + } + })(); + }; + core.events.resetGame = function () { + reset.apply(core.events, arguments); + core.plugin.bfs(); + }; + /** + * 广度优先搜索搜索地图路径 + * @param {string} center 中心地图的id + * @param {number} depth 搜索深度 + * @param {boolean} noCache 是否不使用缓存 + * @returns {BFSResult} 格式:floorId_x_y_dir: floorId_x_y + */ + this.bfsSearch = function bfsSearch(center, depth, noCache) { + // 检查缓存 + const id = `${center}_${depth}_${noBorder}`; + if (mapCache[id] && !noCache) return mapCache[id]; + const used = { + [center]: true, + }; // 搜索过的楼层 + let queue = []; + let stack = [center]; // 当前栈 + let nowDepth = -1; + const mapOrder = [center]; // 遍历顺序,顺便还能记录遍历了哪些楼层 - const res = {}; // 输出结果,格式:floorId_x_y_dir: floorId_x_y - const enemies = {}; - const upOrDown = {}; - const mapdir = {}; - // 开始循环搜索 - while (nowDepth < depth && stack.length > 0) { - const now = stack.shift(); // 当前id - if (core.status.maps[now].deleted) continue; - mapdir[now] = mapdir[now] ?? []; - const blocks = core.getMapBlocksObj(now); // 获取当前地图的每点的事件 - enemies[now] = {}; - // 遍历,获取可以传送的点,只检测绿点事件,因此可用红点事件进行传送来实现分区功能 - for (const i in blocks) { - const block = blocks[i]; - // 整合漏怪检测,所以要检测怪物 - if (block.event.trigger === "battle") { - const id = block.event.id; - if (ignoreEnemies.includes(id)) continue; - else enemies[now][i] = block.event.id; - continue; - } - // 检测触发器是否为切换楼层,不是则直接跳过 - if (block.event.trigger !== "changeFloor") continue; - const dirEntries = allChangeEntries.find( - (v) => v[1] === block.event.id - ); - // 如果不是那六种传送门,直接忽略 - if (!dirEntries) continue; - const data = block.event.data; - const dir = dirEntries[0]; - const route = now + "_" + i.replace(",", "_") + "_" + dir; - const target = data.floorId + "_" + data.loc.join("_"); + const res = {}; // 输出结果,格式:floorId_x_y_dir: floorId_x_y + const enemies = {}; + const upOrDown = {}; + const mapdir = {}; + // 开始循环搜索 + while (nowDepth < depth && stack.length > 0) { + const now = stack.shift(); // 当前id + if (core.status.maps[now].deleted) continue; + mapdir[now] = mapdir[now] ?? []; + const blocks = core.getMapBlocksObj(now); // 获取当前地图的每点的事件 + enemies[now] = {}; + // 遍历,获取可以传送的点,只检测绿点事件,因此可用红点事件进行传送来实现分区功能 + for (const i in blocks) { + const block = blocks[i]; + // 整合漏怪检测,所以要检测怪物 + if (block.event.trigger === "battle") { + const id = block.event.id; + if (ignoreEnemies.includes(id)) continue; + else enemies[now][i] = block.event.id; + continue; + } + // 检测触发器是否为切换楼层,不是则直接跳过 + if (block.event.trigger !== "changeFloor") continue; + const dirEntries = allChangeEntries.find( + (v) => v[1] === block.event.id + ); + // 如果不是那六种传送门,直接忽略 + if (!dirEntries) continue; + const data = block.event.data; + const dir = dirEntries[0]; + const route = now + "_" + i.replace(",", "_") + "_" + dir; + const target = data.floorId + "_" + data.loc.join("_"); - mapdir[now].push(dir); - if (!used[data.floorId]) { - if (dir === "upFloor" || dir === "downFloor") { - upOrDown[now] = upOrDown[id] ?? []; - upOrDown[now].push(dir); - } + mapdir[now].push(dir); + if (!used[data.floorId]) { + if (dir === "upFloor" || dir === "downFloor") { + upOrDown[now] = upOrDown[id] ?? []; + upOrDown[now].push(dir); + } - queue.push(data.floorId); // 没有搜索过,则加入栈中 - mapOrder.push(data.floorId); - used[data.floorId] = true; - } - res[route] = target; - } - if (stack.length === 0) { - stack = queue; - queue = []; - nowDepth++; - } - if (stack.length === 0 && queue.length === 0) break; - } - return { res, order: mapOrder, enemies, upOrDown, mapdir }; - }; - /** - * 获取绘制信息 - * @param {string?} center 中心地图id - * @param {number?} depth 搜索深度 - * @param {boolean?} noCache 是否不使用缓存 - * @returns {MapDrawInfo} - */ - this.getMapDrawInfo = function ( - center = core.status.floorId, - depth = defaultValue.depth, - noCache = false - ) { - nowDepth = depth; - drawingMap = center; - const id = `${center}_${depth}_${noBorder}`; - // 检查缓存 - if (drawCache[id] && !noCache) return drawCache[id]; - const map = core.plugin.bfsSearch(center, depth, noCache); - mapCache[id] = map; - const res = getDrawInfo(map.res, center, map.order); - res.upOrDown = map.upOrDown; - res.mapdir = map.mapdir; - drawCache[id] = res; - return res; - }; - /** - * 提供地图的绘制信息 - * @param {{[x: string]: string}} map 要绘制的地图,格式:floorId_x_y_dir: floorId_x_y - * @param {string} center 中心地图的id - * @param {string[]} order 遍历顺序 - * @returns {MapDrawInfo} 地图的绘制信息 - */ + queue.push(data.floorId); // 没有搜索过,则加入栈中 + mapOrder.push(data.floorId); + used[data.floorId] = true; + } + res[route] = target; + } + if (stack.length === 0) { + stack = queue; + queue = []; + nowDepth++; + } + if (stack.length === 0 && queue.length === 0) break; + } + return { res, order: mapOrder, enemies, upOrDown, mapdir }; + }; + /** + * 获取绘制信息 + * @param {string?} center 中心地图id + * @param {number?} depth 搜索深度 + * @param {boolean?} noCache 是否不使用缓存 + * @returns {MapDrawInfo} + */ + this.getMapDrawInfo = function ( + center = core.status.floorId, + depth = defaultValue.depth, + noCache = false + ) { + nowDepth = depth; + drawingMap = center; + const id = `${center}_${depth}_${noBorder}`; + // 检查缓存 + if (drawCache[id] && !noCache) return drawCache[id]; + const map = core.plugin.bfsSearch(center, depth, noCache); + mapCache[id] = map; + const res = getDrawInfo(map.res, center, map.order); + res.upOrDown = map.upOrDown; + res.mapdir = map.mapdir; + drawCache[id] = res; + return res; + }; + /** + * 提供地图的绘制信息 + * @param {{[x: string]: string}} map 要绘制的地图,格式:floorId_x_y_dir: floorId_x_y + * @param {string} center 中心地图的id + * @param {string[]} order 遍历顺序 + * @returns {MapDrawInfo} 地图的绘制信息 + */ - function getDrawInfo(map, center, order) { - // 先根据地图id分类,从而确定每个地图连接哪些地图,同时方便处理 - const links = {}; - for (const i in map) { - const splitted = i.split("_"); - const id = splitted[0]; - if (!links[id]) links[id] = {}; - links[id][i] = map[i]; - } + function getDrawInfo(map, center, order) { + // 先根据地图id分类,从而确定每个地图连接哪些地图,同时方便处理 + const links = {}; + for (const i in map) { + const splitted = i.split("_"); + const id = splitted[0]; + if (!links[id]) links[id] = {}; + links[id][i] = map[i]; + } - // 分类完毕,然后根据连接点先计算出各个地图的坐标,然后再进行判断 - const centerFloor = core.status.maps[center]; - const visitedCenter = core.hasVisitedFloor(center); - const locs = { - // 格式:[中心x, 中心y, 宽, 高, 是否到达过] - [center]: [2, 2, 1, 1, visitedCenter], - }; - // 可以上楼下楼的地图 - const upOrDown = {}; - for (const id of order) { - const now = links[id]; - // 遍历每一个地图的连接情况 - for (const from in now) { - const to = now[from]; - // 先根据from to计算物理位置 - const fromData = from.split("_"), - toData = to.split("_"); - const dir = fromData[3]; - if (dir === "upFloor" || dir === "downFloor") continue; - if (!defaultChange[dir]) continue; - const v = dirData[dir][1], // 竖直数值 - h = dirData[dir][0], // 水平数值 - ha = Math.abs(h), - va = Math.abs(v); - const ff = id, // fromFloorId - tf = toData[0]; // toFloorId - const fromFloor = core.status.maps[ff], - toFloor = core.status.maps[tf]; - const fhw = Math.floor(fromFloor.width / 2), // fromFloorHalfWidth - fhh = Math.floor(fromFloor.height / 2), - thw = Math.floor(toFloor.width / 2), - thh = Math.floor(toFloor.height / 2); - const fLoc = locs[id] ?? [0, 0]; - if (!locs[ff]) continue; - let x, y; - if (locs && locs[tf]) { - x = locs[tf][0]; - y = locs[tf][1]; - } else { - // 计算坐标,公式可以通过画图推断出 - x = fLoc[0] - v; - y = fLoc[1] - h; - } - locs[tf] = locs[tf] ?? [x, y, 1, 1, core.hasVisitedFloor(tf)]; - } - } - // 获取地图绘制需要的长宽 - let width = 0, - height = 0; - let left, right, up, down; - for (const id in locs) { - const [x, y, w, h] = locs[id]; - if (left === void 0) { - left = right = x; - up = down = y; - } - left = Math.min(x - 1, left); - right = Math.max(x + 1, right); - up = Math.min(y - 1, up); - down = Math.max(y + 1, down); - } - width = right - left; - height = down - up; + // 分类完毕,然后根据连接点先计算出各个地图的坐标,然后再进行判断 + const centerFloor = core.status.maps[center]; + const visitedCenter = core.hasVisitedFloor(center); + const locs = { + // 格式:[中心x, 中心y, 宽, 高, 是否到达过] + [center]: [2, 2, 1, 1, visitedCenter], + }; + // 可以上楼下楼的地图 + const upOrDown = {}; + for (const id of order) { + const now = links[id]; + // 遍历每一个地图的连接情况 + for (const from in now) { + const to = now[from]; + // 先根据from to计算物理位置 + const fromData = from.split("_"), + toData = to.split("_"); + const dir = fromData[3]; + if (dir === "upFloor" || dir === "downFloor") continue; + if (!defaultChange[dir]) continue; + const v = dirData[dir][1], // 竖直数值 + h = dirData[dir][0], // 水平数值 + ha = Math.abs(h), + va = Math.abs(v); + const ff = id, // fromFloorId + tf = toData[0]; // toFloorId + const fromFloor = core.status.maps[ff], + toFloor = core.status.maps[tf]; + const fhw = Math.floor(fromFloor.width / 2), // fromFloorHalfWidth + fhh = Math.floor(fromFloor.height / 2), + thw = Math.floor(toFloor.width / 2), + thh = Math.floor(toFloor.height / 2); + const fLoc = locs[id] ?? [0, 0]; + if (!locs[ff]) continue; + let x, y; + if (locs && locs[tf]) { + x = locs[tf][0]; + y = locs[tf][1]; + } else { + // 计算坐标,公式可以通过画图推断出 + x = fLoc[0] - v; + y = fLoc[1] - h; + } + locs[tf] = locs[tf] ?? [x, y, 1, 1, core.hasVisitedFloor(tf)]; + } + } + // 获取地图绘制需要的长宽 + let width = 0, + height = 0; + let left, right, up, down; + for (const id in locs) { + const [x, y, w, h] = locs[id]; + if (left === void 0) { + left = right = x; + up = down = y; + } + left = Math.min(x - 1, left); + right = Math.max(x + 1, right); + up = Math.min(y - 1, up); + down = Math.max(y + 1, down); + } + width = right - left; + height = down - up; - return { locs, width, height, layer: upOrDown }; - } + return { locs, width, height, layer: upOrDown }; + } - function mapblock(mapdir) { - let mb = ""; - if (mapdir.includes("up")) mb += "u"; - if (mapdir.includes("down")) mb += "d"; - if (mapdir.includes("left")) mb += "l"; - if (mapdir.includes("right")) mb += "r"; - return mb ? mb + ".webp" : "null.webp"; - } - core.animateFrame.globalAlphaFloor = 0; - core.animateFrame.globalAlphaFloorStatus = 1; + function mapblock(mapdir) { + let mb = ""; + if (mapdir.includes("up")) mb += "u"; + if (mapdir.includes("down")) mb += "d"; + if (mapdir.includes("left")) mb += "l"; + if (mapdir.includes("right")) mb += "r"; + return mb ? mb + ".webp" : "null.webp"; + } + core.animateFrame.globalAlphaFloor = 0; + core.animateFrame.globalAlphaFloorStatus = 1; - const tesk = document.createElement("canvas"); - tesk.width = 300; - tesk.height = 300; - const teskctx = tesk.getContext("2d"); + const tesk = document.createElement("canvas"); + tesk.width = 300; + tesk.height = 300; + const teskctx = tesk.getContext("2d"); - let line = 50; - teskctx.strokeStyle = "green"; - teskctx.fillStyle = "green"; - let now = 0; - core.registerAnimationFrame("tesk", true, function (timestamp) { - if (timestamp - now > 1000 / 60) { - now = timestamp; - core.clearMap(teskctx); - teskctx.lineWidth = 150 - line; + let line = 50; + teskctx.strokeStyle = "green"; + teskctx.fillStyle = "green"; + let now = 0; + core.registerAnimationFrame("tesk", true, function (timestamp) { + if (timestamp - now > 1000 / 60) { + now = timestamp; + core.clearMap(teskctx); + teskctx.lineWidth = 150 - line; - if (line <= 150) { - teskctx.beginPath(); - teskctx.arc(150, 150, line, 0, Math.PI * 2); - line += 2; - teskctx.stroke(); - } else { - teskctx.beginPath(); - teskctx.arc(150, 150, line - 150, 0, Math.PI * 2); - line += 2; - teskctx.fill(); - if (line >= 250) line = 50; - } - } - }); + if (line <= 150) { + teskctx.beginPath(); + teskctx.arc(150, 150, line, 0, Math.PI * 2); + line += 2; + teskctx.stroke(); + } else { + teskctx.beginPath(); + teskctx.arc(150, 150, line - 150, 0, Math.PI * 2); + line += 2; + teskctx.fill(); + if (line >= 250) line = 50; + } + } + }); - /** - * 绘制小地图 - * @param {MapDrawInfo} info 地图绘制信息 - * @param {number} scale 地图的绘制比例 - */ - this.drawSmallMap = function ( - ctx, - info, - center, - sx, - sy, - sw, - sh, - scale = defaultValue.scale - ) { - core.clearMap(ctx, sx, sy, sw + 40, sh + 60); - if (core.domStyle.isVertical) { - sy += 50; - sx += 15; - } else { - sy += 60; - sx += 30; - } - core.fillRect(ctx, sx, sy, sw, sh, "#000"); - core.strokeRect(ctx, sx, sy, sw, sh, "#fff", 5); - core.setTextAlign("outerUI", "center"); - core.fillBoldText1( - ctx, - core.status.maps[center].areas, - sx + sw / 2, - sy - 10, - "#FFFFFF", - "#000000", - 6, - "bold 42px Verdana" - ); - const locs = info.locs; - for (const id in locs) { - const loc = locs[id]; - let color = "#000"; - if (!loc[4]) color = "#f0f"; - const [x, y, w, h] = loc.map((v) => typeof v === "number" && v * scale); - const fx = x + sx, - fy = y + sy; - const mapdir = info.mapdir[id]; - const img = mapblock(mapdir); - if (x < 0 || x > 4 * scale || y < 0 || y > 4 * scale) continue; - core.drawImage(ctx, img, 0, 0, 60, 60, fx, fy, w, h); - const layer = info.upOrDown[id]; - const min = Math.min(w, h); + /** + * 绘制小地图 + * @param {MapDrawInfo} info 地图绘制信息 + * @param {number} scale 地图的绘制比例 + */ + this.drawSmallMap = function ( + ctx, + info, + center, + sx, + sy, + sw, + sh, + scale = defaultValue.scale + ) { + core.clearMap(ctx, sx, sy, sw + 40, sh + 60); + if (core.domStyle.isVertical) { + sy += 50; + sx += 15; + } else { + sy += 60; + sx += 30; + } + core.fillRect(ctx, sx, sy, sw, sh, "#000"); + core.strokeRect(ctx, sx, sy, sw, sh, "#fff", 5); + core.setTextAlign("outerUI", "center"); + core.fillBoldText1( + ctx, + core.status.maps[center].areas, + sx + sw / 2, + sy - 10, + "#FFFFFF", + "#000000", + 6, + "bold 42px Verdana" + ); + const locs = info.locs; + for (const id in locs) { + const loc = locs[id]; + let color = "#000"; + if (!loc[4]) color = "#f0f"; + const [x, y, w, h] = loc.map((v) => typeof v === "number" && v * scale); + const fx = x + sx, + fy = y + sy; + const mapdir = info.mapdir[id]; + const img = mapblock(mapdir); + if (x < 0 || x > 4 * scale || y < 0 || y > 4 * scale) continue; + core.drawImage(ctx, img, 0, 0, 60, 60, fx, fy, w, h); + const layer = info.upOrDown[id]; + const min = Math.min(w, h); - - if (layer?.includes("upFloor")) - core.drawIcon( - ctx, - defaultChange.upFloor, - fx + min / 4, - fy + min / 4, - min / 2, - min / 2 - ); - if (layer?.includes("downFloor")) - core.drawIcon( - ctx, - defaultChange.downFloor, - fx + min / 4, - fy + min / 4, - min / 2, - min / 2 - ); - if (core.getFlag("任务地点") && core.getFlag("任务地点") === id) - ctx.drawImage(tesk, fx + min / 4, fy + min / 4, min / 2, min / 2); - if (id === core.status.floorId) core.drawImage(ctx, "hero.webp", - 0, - 0, - 32, - 19, fx + min / 4, fy + min * 5 / 16, 32, 19); - // 显示漏怪数量 - if (core.getFlag("showEnemy")) { - ctx.textAlign = "center"; - ctx.textBaseline = "middle"; - const c = drawingMap + "_" + nowDepth + "_" + noBorder; - const n = Object.keys(mapCache[c].enemies[id]).length; - color = "#fff"; - if (n > 10) color = "#fc3"; - if (n > 20) color = "#f22"; - ctx.shadowBlur = 0.6 * nowScale; - ctx.shadowColor = "#000"; - if (n > 0) - core.fillText( - ctx, - n, - fx + (w * 3) / 10, - fy + (h * 7) / 10, - color, - 22 + "px normal" - ); - ctx.shadowBlur = 0; - } - if (!core.hasVisitedFloor(id)) { - core.fillRect(ctx, fx, fy, w, h, "rgba(0,0,0,0.7)") - core.fillText(ctx, "?", fx + min / 2, fy + min * 3 / 4, "#FFFFFF", "bold 42px Verdana") - } - } - }; -}, + if (layer?.includes("upFloor")) + core.drawIcon( + ctx, + defaultChange.upFloor, + fx + min / 4, + fy + min / 4, + min / 2, + min / 2 + ); + if (layer?.includes("downFloor")) + core.drawIcon( + ctx, + defaultChange.downFloor, + fx + min / 4, + fy + min / 4, + min / 2, + min / 2 + ); + if (core.getFlag("任务地点") && core.getFlag("任务地点") === id) + ctx.drawImage(tesk, fx + min / 4, fy + min / 4, min / 2, min / 2); + if (id === core.status.floorId) + core.drawImage( + ctx, + "hero.webp", + 0, + 0, + 32, + 19, + fx + min / 4, + fy + (min * 5) / 16, + 32, + 19 + ); + // 显示漏怪数量 + if (core.getFlag("showEnemy")) { + ctx.textAlign = "center"; + ctx.textBaseline = "middle"; + const c = drawingMap + "_" + nowDepth + "_" + noBorder; + const n = Object.keys(mapCache[c].enemies[id]).length; + color = "#fff"; + if (n > 10) color = "#fc3"; + if (n > 20) color = "#f22"; + ctx.shadowBlur = 0.6 * nowScale; + ctx.shadowColor = "#000"; + if (n > 0) + core.fillText( + ctx, + n, + fx + (w * 3) / 10, + fy + (h * 7) / 10, + color, + 22 + "px normal" + ); + ctx.shadowBlur = 0; + } + if (!core.hasVisitedFloor(id)) { + core.fillRect(ctx, fx, fy, w, h, "rgba(0,0,0,0.7)"); + core.fillText( + ctx, + "?", + fx + min / 2, + fy + (min * 3) / 4, + "#FFFFFF", + "bold 42px Verdana" + ); + } + } + }; + }, "楼传": function () { - // 在此增加新插件 + // 在此增加新插件 - core.canMoveFloor = function () { - let canmove = false; - core.status.thisMap.blocks.forEach((block) => { - if ( - !block.disable && - (block.event.id == "upFloor" || block.event.id == "downFloor") - ) { - let automaticRoute = core.automaticRoute(block.x, block.y); - if (!core.flags.flyNearStair || automaticRoute.length > 0) { - let loc = automaticRoute.pop(); - loc = automaticRoute.pop(); - if (core.canMoveDirectly(loc?.x, loc?.y) >= 0 || !loc) { - canmove = true; - } - } - } - }); - return canmove; - }; - ui.prototype._drawViewMaps_drawHint = function () { - core.playSound("打开界面"); - }; + core.canMoveFloor = function () { + let canmove = false; + core.status.thisMap.blocks.forEach((block) => { + if ( + !block.disable && + (block.event.id == "upFloor" || block.event.id == "downFloor") + ) { + let automaticRoute = core.automaticRoute(block.x, block.y); + if (!core.flags.flyNearStair || automaticRoute.length > 0) { + let loc = automaticRoute.pop(); + loc = automaticRoute.pop(); + if (core.canMoveDirectly(loc?.x, loc?.y) >= 0 || !loc) { + canmove = true; + } + } + } + }); + return canmove; + }; + ui.prototype._drawViewMaps_drawHint = function () { + core.playSound("打开界面"); + }; - ////// 绘制浏览地图界面 ////// - ui.prototype._drawViewMaps = function (index, x, y) { - core.lockControl(); + ////// 绘制浏览地图界面 ////// + ui.prototype._drawViewMaps = function (index, x, y) { + core.lockControl(); - core.clearMap("data"); - core.status.event.id = "viewMaps"; - this.clearUI(); - //console.log(index) - if (index == null) index = core.floorIds.indexOf(core.status.floorId); - core.animateFrame.tip = null; - core.status.checkBlock.cache = {}; - let data = this._drawViewMaps_buildData(index, x, y); - core.drawWindowSkin("winskin1.webp", "ui", 0, 0, 416, 416); - let page = core.status.event.data.index; - let floorId = core.status.event.data.floorId; - core.ui.statusBar._update_map(floorId); - const bfs = core.plugin.bfsSearch(floorId, 1, true); - const mapdir = bfs.mapdir[floorId]; - core.setTextAlign("ui", "center"); - let size = (core.__PIXELS__ * 3) / 4; //312 - const areas = core.getFlag("areas"); + core.clearMap("data"); + core.status.event.id = "viewMaps"; + this.clearUI(); + //console.log(index) + if (index == null) index = core.floorIds.indexOf(core.status.floorId); + core.animateFrame.tip = null; + core.status.checkBlock.cache = {}; + let data = this._drawViewMaps_buildData(index, x, y); + core.drawWindowSkin("winskin1.webp", "ui", 0, 0, 416, 416); + let page = core.status.event.data.index; + let floorId = core.status.event.data.floorId; + core.ui.statusBar._update_map(floorId); + const bfs = core.plugin.bfsSearch(floorId, 1, true); + const mapdir = bfs.mapdir[floorId]; + core.setTextAlign("ui", "center"); + let size = (core.__PIXELS__ * 3) / 4; //312 + const areas = core.getFlag("areas"); - let i = areas.findIndex((v) => v.maps.includes(floorId)); - core.fillRoundRect("ui", 15 - 2, 15 - 2, 35 + 4, 35 + 4, 4, "#444444"); - core.strokeRoundRect( - "ui", - 15 - 4, - 15 - 4, - 35 + 8, - 35 + 8, - 4, - "#444444", - 1 - ); - core.fillBoldText1( - "ui", - "当前", - 13 + 20, - 17 + 20, - "#FFFFFF", - "#000000", - 2, - this._buildFont(18, true) - ); + let i = areas.findIndex((v) => v.maps.includes(floorId)); + core.fillRoundRect("ui", 15 - 2, 15 - 2, 35 + 4, 35 + 4, 4, "#444444"); + core.strokeRoundRect( + "ui", + 15 - 4, + 15 - 4, + 35 + 8, + 35 + 8, + 4, + "#444444", + 1 + ); + core.fillBoldText1( + "ui", + "当前", + 13 + 20, + 17 + 20, + "#FFFFFF", + "#000000", + 2, + this._buildFont(18, true) + ); - core.fillRoundRect( - "ui", - 15 - 2, - 15 - 2 + 35 + 8 + size + 8 - 54, - 35 + 4, - 35 + 4, - 4, - "#444444" - ); - core.strokeRoundRect( - "ui", - 15 - 4, - 15 - 4 + 35 + 8 + size + 8 - 54, - 35 + 8, - 35 + 8, - 4, - "#444444", - 1 - ); - if ( - !core.status.maps[core.floorIds[page]].canFlyTo || - !core.hasVisitedFloor(core.floorIds[page]) - ) { - core.fillBoldText1( - "ui", - "预览", - 13 + 20, - 17 + 20 + 35 + 8 + size + 8 - 54, - "#909090", - "#000000", - 2, - this._buildFont(18, true) - ); - } else { - core.fillBoldText1( - "ui", - "传送", - 13 + 20, - 17 + 20 + 35 + 8 + size + 8 - 54, - "#909090", - "#000000", - 2, - this._buildFont(18, true) - ); - } - core.fillRoundRect( - "ui", - 15 - 4 + size - 2 + 45, - 15 - 2 + size - 4 + 45, - 35 + 4, - 35 + 4, - 4, - "#444444" - ); - core.strokeRoundRect( - "ui", - 15 - 4 + size - 4 + 45, - 15 - 4 + size - 4 + 45, - 35 + 8, - 35 + 8, - 4, - "#444444", - 1 - ); - core.fillBoldText1( - "ui", - "离开", - 15 - 4 + size - 4 + 45 + 22, - 15 - 4 + size - 4 + 45 + 26, - "#FFFFFF", - "#000000", - 2, - this._buildFont(18, true) - ); + core.fillRoundRect( + "ui", + 15 - 2, + 15 - 2 + 35 + 8 + size + 8 - 54, + 35 + 4, + 35 + 4, + 4, + "#444444" + ); + core.strokeRoundRect( + "ui", + 15 - 4, + 15 - 4 + 35 + 8 + size + 8 - 54, + 35 + 8, + 35 + 8, + 4, + "#444444", + 1 + ); + if ( + !core.status.maps[core.floorIds[page]].canFlyTo || + !core.hasVisitedFloor(core.floorIds[page]) + ) { + core.fillBoldText1( + "ui", + "预览", + 13 + 20, + 17 + 20 + 35 + 8 + size + 8 - 54, + "#909090", + "#000000", + 2, + this._buildFont(18, true) + ); + } else { + core.fillBoldText1( + "ui", + "传送", + 13 + 20, + 17 + 20 + 35 + 8 + size + 8 - 54, + "#909090", + "#000000", + 2, + this._buildFont(18, true) + ); + } + core.fillRoundRect( + "ui", + 15 - 4 + size - 2 + 45, + 15 - 2 + size - 4 + 45, + 35 + 4, + 35 + 4, + 4, + "#444444" + ); + core.strokeRoundRect( + "ui", + 15 - 4 + size - 4 + 45, + 15 - 4 + size - 4 + 45, + 35 + 8, + 35 + 8, + 4, + "#444444", + 1 + ); + core.fillBoldText1( + "ui", + "离开", + 15 - 4 + size - 4 + 45 + 22, + 15 - 4 + size - 4 + 45 + 26, + "#FFFFFF", + "#000000", + 2, + this._buildFont(18, true) + ); - core.fillRoundRect( - "ui", - 15 + 44 - 2, - 15 - 2, - size + 4 - 58, - 35 + 4, - 4, - "#444444" - ); - core.strokeRoundRect( - "ui", - 15 + 44 - 4, - 15 - 4, - size + 8 - 58, - 35 + 8, - 4, - "#444444", - 1 - ); - if (mapdir.includes("up")) { - core.fillBoldText1( - "ui", - "北▲", - 30 + 145 + 10, - 17 + 20, - "#FFFFFF", - "#000000", - 2, - this._buildFont(18, true) - ); - } else { - core.fillBoldText1( - "ui", - "北▲", - 30 + 145 + 10, - 17 + 20, - "#909090", - "#000000", - 2, - this._buildFont(18, true) - ); - } + core.fillRoundRect( + "ui", + 15 + 44 - 2, + 15 - 2, + size + 4 - 58, + 35 + 4, + 4, + "#444444" + ); + core.strokeRoundRect( + "ui", + 15 + 44 - 4, + 15 - 4, + size + 8 - 58, + 35 + 8, + 4, + "#444444", + 1 + ); + if (mapdir.includes("up")) { + core.fillBoldText1( + "ui", + "北▲", + 30 + 145 + 10, + 17 + 20, + "#FFFFFF", + "#000000", + 2, + this._buildFont(18, true) + ); + } else { + core.fillBoldText1( + "ui", + "北▲", + 30 + 145 + 10, + 17 + 20, + "#909090", + "#000000", + 2, + this._buildFont(18, true) + ); + } - core.fillRoundRect( - "ui", - 15 - 2, - 59 - 2, - 35 + 4, - size + 4 - 58, - 4, - "#444444" - ); - core.strokeRoundRect( - "ui", - 15 - 4, - 59 - 4, - 35 + 8, - size + 8 - 58, - 4, - "#444444", - 1 - ); - if (mapdir.includes("left")) { - core.fillBoldText1( - "ui", - "西", - 15 + 17, - 25 + 150, - "#FFFFFF", - "#000000", - 2, - this._buildFont(18, true) - ); - core.fillBoldText1( - "ui", - "◀", - 15 + 17, - 45 + 150, - "#FFFFFF", - "#000000", - 2, - this._buildFont(18, true) - ); - } else { - core.fillBoldText1( - "ui", - "西", - 15 + 17, - 25 + 150, - "#909090", - "#000000", - 2, - this._buildFont(18, true) - ); - core.fillBoldText1( - "ui", - "◀", - 15 + 17, - 45 + 150, - "#909090", - "#000000", - 2, - this._buildFont(18, true) - ); - } - core.fillRoundRect( - "ui", - 15 + 44 - 2, - 15 - 2 + size - 4, - size + 4 - 58, - 35 + 4, - 4, - "#444444" - ); - core.strokeRoundRect( - "ui", - 15 + 44 - 4, - 15 - 4 + size - 4, - size + 8 - 58, - 35 + 8, - 4, - "#444444", - 1 - ); - if (mapdir.includes("down")) { - core.fillBoldText1( - "ui", - "南▼", - 30 + 145 + 10, - 17 + 20 + size - 4, - "#FFFFFF", - "#000000", - 2, - this._buildFont(18, true) - ); - } else { - core.fillBoldText1( - "ui", - "南▼", - 30 + 145 + 10, - 17 + 20 + size - 4, - "#909090", - "#000000", - 2, - this._buildFont(18, true) - ); - } + core.fillRoundRect( + "ui", + 15 - 2, + 59 - 2, + 35 + 4, + size + 4 - 58, + 4, + "#444444" + ); + core.strokeRoundRect( + "ui", + 15 - 4, + 59 - 4, + 35 + 8, + size + 8 - 58, + 4, + "#444444", + 1 + ); + if (mapdir.includes("left")) { + core.fillBoldText1( + "ui", + "西", + 15 + 17, + 25 + 150, + "#FFFFFF", + "#000000", + 2, + this._buildFont(18, true) + ); + core.fillBoldText1( + "ui", + "◀", + 15 + 17, + 45 + 150, + "#FFFFFF", + "#000000", + 2, + this._buildFont(18, true) + ); + } else { + core.fillBoldText1( + "ui", + "西", + 15 + 17, + 25 + 150, + "#909090", + "#000000", + 2, + this._buildFont(18, true) + ); + core.fillBoldText1( + "ui", + "◀", + 15 + 17, + 45 + 150, + "#909090", + "#000000", + 2, + this._buildFont(18, true) + ); + } + core.fillRoundRect( + "ui", + 15 + 44 - 2, + 15 - 2 + size - 4, + size + 4 - 58, + 35 + 4, + 4, + "#444444" + ); + core.strokeRoundRect( + "ui", + 15 + 44 - 4, + 15 - 4 + size - 4, + size + 8 - 58, + 35 + 8, + 4, + "#444444", + 1 + ); + if (mapdir.includes("down")) { + core.fillBoldText1( + "ui", + "南▼", + 30 + 145 + 10, + 17 + 20 + size - 4, + "#FFFFFF", + "#000000", + 2, + this._buildFont(18, true) + ); + } else { + core.fillBoldText1( + "ui", + "南▼", + 30 + 145 + 10, + 17 + 20 + size - 4, + "#909090", + "#000000", + 2, + this._buildFont(18, true) + ); + } - core.fillRoundRect( - "ui", - 15 - 2 + size - 4, - 59 - 2, - 35 + 4, - size + 4 - 58, - 4, - "#444444" - ); - core.strokeRoundRect( - "ui", - 15 - 4 + size - 4, - 59 - 4, - 35 + 8, - size + 8 - 58, - 4, - "#444444", - 1 - ); - if (mapdir.includes("right")) { - core.fillBoldText1( - "ui", - "东", - 15 + 17 + size - 4, - 25 + 150, - "#FFFFFF", - "#000000", - 2, - this._buildFont(18, true) - ); - core.fillBoldText1( - "ui", - "▶", - 15 + 17 + size - 4, - 45 + 150, - "#FFFFFF", - "#000000", - 2, - this._buildFont(18, true) - ); - } else { - core.fillBoldText1( - "ui", - "东", - 15 + 17 + size - 4, - 25 + 150, - "#909090", - "#000000", - 2, - this._buildFont(18, true) - ); - core.fillBoldText1( - "ui", - "▶", - 15 + 17 + size - 4, - 45 + 150, - "#909090", - "#000000", - 2, - this._buildFont(18, true) - ); - } - core.fillRoundRect( - "ui", - 60 - 2, - 60 - 2, - size - 58 + 4, - size - 58 + 4, - 4, - "#444444" - ); - core.strokeRoundRect( - "ui", - 60 - 4, - 60 - 4, - size - 58 + 8, - size - 58 + 8, - 4, - "#444444", - 1 - ); - core.drawThumbnail(floorId, null, { - damage: data.damage, - ctx: "ui", - x: 58, - y: 58, - size: 0.62, - all: data.all, - }); - if ( - !core.status.maps[core.floorIds[page]].canFlyTo || - !core.hasVisitedFloor(core.floorIds[page]) - ) { - /*core.fillRect("ui", 58, + core.fillRoundRect( + "ui", + 15 - 2 + size - 4, + 59 - 2, + 35 + 4, + size + 4 - 58, + 4, + "#444444" + ); + core.strokeRoundRect( + "ui", + 15 - 4 + size - 4, + 59 - 4, + 35 + 8, + size + 8 - 58, + 4, + "#444444", + 1 + ); + if (mapdir.includes("right")) { + core.fillBoldText1( + "ui", + "东", + 15 + 17 + size - 4, + 25 + 150, + "#FFFFFF", + "#000000", + 2, + this._buildFont(18, true) + ); + core.fillBoldText1( + "ui", + "▶", + 15 + 17 + size - 4, + 45 + 150, + "#FFFFFF", + "#000000", + 2, + this._buildFont(18, true) + ); + } else { + core.fillBoldText1( + "ui", + "东", + 15 + 17 + size - 4, + 25 + 150, + "#909090", + "#000000", + 2, + this._buildFont(18, true) + ); + core.fillBoldText1( + "ui", + "▶", + 15 + 17 + size - 4, + 45 + 150, + "#909090", + "#000000", + 2, + this._buildFont(18, true) + ); + } + core.fillRoundRect( + "ui", + 60 - 2, + 60 - 2, + size - 58 + 4, + size - 58 + 4, + 4, + "#444444" + ); + core.strokeRoundRect( + "ui", + 60 - 4, + 60 - 4, + size - 58 + 8, + size - 58 + 8, + 4, + "#444444", + 1 + ); + core.drawThumbnail(floorId, null, { + damage: data.damage, + ctx: "ui", + x: 58, + y: 58, + size: 0.62, + all: data.all, + }); + if ( + !core.status.maps[core.floorIds[page]].canFlyTo || + !core.hasVisitedFloor(core.floorIds[page]) + ) { + /*core.fillRect("ui", 58, 58, size - 50, size - 50, "rgba(0,0,0,0.5)")*/ - core.getContextByName("ui").globalAlpha = 0.7 + core.getContextByName("ui").globalAlpha = 0.7; - core.drawImage( - "ui", - "miwu.webp", - 0, - 0, - size, - size, - 58, - 58, - size - 50, - size - 50 - ); - core.getContextByName("ui").globalAlpha = 1 - /*core.fillText("ui", '?', 188, + core.drawImage( + "ui", + "miwu.webp", + 0, + 0, + size, + size, + 58, + 58, + size - 50, + size - 50 + ); + core.getContextByName("ui").globalAlpha = 1; + /*core.fillText("ui", '?', 188, 278, "rgba(255,255,255,0.2)", this._buildFont(250, true))*/ - } - core.fillRoundRect( - "ui", - 15 + 44 - 2, - 60 - 2 + size - 4, - size + 4 - 58, - 35 + 4, - 4, - "#444444" - ); - core.strokeRoundRect( - "ui", - 15 + 44 - 4, - 60 - 4 + size - 4, - size + 8 - 58, - 35 + 8, - 4, - "#444444", - 1 - ); - core.fillBoldText1( - "ui", - core.status.maps[floorId].areas, - 30 + 145 + 10, - 17 + 65 + size - 4, - "#FFFFFF", - "#000000", - 2, - this._buildFont(18, true) - ); - core.fillRoundRect( - "ui", - 15 - 2, - 60 - 2 + size - 4, - 35 + 4, - 35 + 4, - 4, - "#444444" - ); - core.strokeRoundRect( - "ui", - 15 - 4, - 60 - 4 + size - 4, - 35 + 8, - 35 + 8, - 4, - "#444444", - 1 - ); - if (i === 0) { - core.fillBoldText1( - "ui", - "◀", - 30, - 17 + 65 + size - 4, - "#909090", - "#000000", - 2, - this._buildFont(18, true) - ); - } else { - core.fillBoldText1( - "ui", - "◀", - 30, - 17 + 65 + size - 4, - "#FFFFFF", - "#000000", - 2, - this._buildFont(18, true) - ); - } - core.fillRoundRect( - "ui", - 15 - 2 + size - 4, - 60 - 2 + size - 4, - 35 + 4, - 35 + 4, - 4, - "#444444" - ); - core.strokeRoundRect( - "ui", - 15 - 4 + size - 4, - 60 - 4 + size - 4, - 35 + 8, - 35 + 8, - 4, - "#444444", - 1 - ); - if (i === areas.length - 1) { - core.fillBoldText1( - "ui", - "▶", - 30 + 300 + 10, - 17 + 65 + size - 4, - "#909090", - "#000000", - 2, - this._buildFont(18, true) - ); - } else { - core.fillBoldText1( - "ui", - "▶", - 30 + 300 + 10, - 17 + 65 + size - 4, - "#FFFFFF", - "#000000", - 2, - this._buildFont(18, true) - ); - } - - core.fillRoundRect( - "ui", - 15 - 2 + size - 4, - 15 - 2, - 80 + 4, - 35 + 4, - 4, - "#444444" - ); - core.strokeRoundRect( - "ui", - 15 - 4 + size - 4, - 15 - 4, - 80 + 8, - 35 + 8, - 4, - "#444444", - 1 - ); - if (mapdir.includes("upFloor")) { - core.fillBoldText1( - "ui", - "上楼", - 30 + 320 + 10, - 17 + 20, - "#FFFFFF", - "#000000", - 2, - this._buildFont(18, true) - ); - } else { - core.fillBoldText1( - "ui", - "上楼", - 30 + 320 + 10, - 17 + 20, - "#909090", - "#000000", - 2, - this._buildFont(18, true) - ); - } - core.fillRoundRect( - "ui", - 15 - 2 + size - 4, - 15 - 2 + size - 4, - 80 + 4, - 35 + 4, - 4, - "#444444" - ); - core.strokeRoundRect( - "ui", - 15 - 4 + size - 4, - 15 - 4 + size - 4, - 80 + 8, - 35 + 8, - 4, - "#444444", - 1 - ); - if (mapdir.includes("downFloor")) { - core.fillBoldText1( - "ui", - "下楼", - 30 + 320 + 10, - 17 + 20 + size - 4, - "#FFFFFF", - "#000000", - 2, - this._buildFont(18, true) - ); - } else { - core.fillBoldText1( - "ui", - "下楼", - 30 + 320 + 10, - 17 + 20 + size - 4, - "#909090", - "#000000", - 2, - this._buildFont(18, true) - ); - } - - core.fillRoundRect( - "ui", - 15 - 2 + size - 4 + 35 + 8, - 59 - 2, - 37 + 4, - (size - 58) / 2 + 4, - 4, - "#444444" - ); - core.strokeRoundRect( - "ui", - 15 - 4 + size - 4 + 35 + 8, - 59 - 4, - 37 + 8, - (size - 58) / 2 + 8, - 4, - "#444444", - 1 - ); - const title = core.status.maps[floorId].title; - //const length = title.length - fillTextVertical( - "ui", - title, - 15 - 4 + size - 4 + 45, - 85, - core.hasVisitedFloor(floorId) ? "#FFFFFF" : "#444444", - "#000000", - 18 - ); - //const uictx = main.dom.gameCanvas.ui.getContext('2d') - core.fillRoundRect( - "ui", - 15 - 2 + size - 4 + 35 + 8, - 59 - 2 + (size - 58) / 2 + 8, - 37 + 4, - 119 + 4, - 4, - "#444444" - ); - core.strokeRoundRect( - "ui", - 15 - 4 + size - 4 + 35 + 8, - 59 - 4 + (size - 58) / 2 + 8, - 37 + 8, - 119 + 8, - 4, - "#444444", - 1 - ); - if (core.getFlag("showEnemy")) { - fillTextVertical( - "ui", - "关闭漏怪检测", - 15 - 4 + size - 4 + 45, - 220, - "#FFFFFF", - "#000000", - 18 - ); - } else { - fillTextVertical( - "ui", - "开启漏怪检测", - 15 - 4 + size - 4 + 45, - 220, - "#FFFFFF", - "#000000", - 18 - ); - } - - //uictx.fillTextVertical(title, 15 - 4 + size - 4 + 35 + 29, 25 + 150) - //fillTextVertical('ui', title, 15 - 4 + size - 4 + 35 + 29, 25 + 150, '#FFFFFF', this._buildFont(18, true)) - }; - - function fillTextVertical(name, text, x, y, style, boldstyle, fontsize) { - //竖向文字绘制 - - const ctx = core.ui.getContextByName(name); - if (!ctx) return; - const canvas = document.createElement("canvas"); - const context = canvas.getContext("2d"); - fontsize *= 3; - const length = text.length; - canvas.width = fontsize * 2; - canvas.height = fontsize * length * 2; - if (style) context.fillStyle = core.arrayToRGBA(style); - if (boldstyle) context.strokeStyle = core.arrayToRGBA(boldstyle); - context.lineWidth = 2; - if (fontsize) context.font = core.ui._buildFont(fontsize, true); - let arrText = text.split(""); - - let arrWidth = arrText.map(function (letter) { - return context.measureText(letter).width; - }); - - let align = context.textAlign; - - let baseline = context.textBaseline; - let sx = fontsize, - sy = fontsize * length; - if (align == "left") { - sx = sx + Math.max.apply(null, arrWidth) / 2; - } else if (align == "right") { - sx = sx - Math.max.apply(null, arrWidth) / 2; - } - - if ( - baseline == "bottom" || - baseline == "alphabetic" || - baseline == "ideographic" - ) { - sy = sy - arrWidth[0] / 2; - } else if (baseline == "top" || baseline == "hanging") { - sy = sy + arrWidth[0] / 2; - } - - context.textAlign = "center"; - - context.textBaseline = "middle"; - context.lineWidth = 6; - - // 开始逐字绘制 - - arrText.forEach(function (letter, index) { - // 确定下一个字符的纵坐标位置 - - context.strokeText(letter, sx, sy); - context.fillText(letter, sx, sy); - // 旋转坐标系还原成初始态 - - context.setTransform(1, 0, 0, 1, 0, 0); - - // 确定下一个字符的纵坐标位置 - - var letterWidth = 54; - - sy = sy + letterWidth; - }); - - // 水平垂直对齐方式还原 - - context.textAlign = align; - - context.textBaseline = baseline; - - //绘制到目标位置 - ctx.drawImage( - canvas, - x, - y - (fontsize / 3) * length, - canvas.width / 3, - canvas.height / 3 - ); - } - - ////// 点击楼层传送器时的打开操作 ////// - events.prototype.useFly = function (fromUserAction) { - if (!core.isPlaying()) return; - if (!core.status.maps[core.status.floorId].canFlyFrom) { - core.drawTip(core.material.items["fly"].name + "好像失效了", "fly"); - return; - } - // 从“浏览地图”页面:尝试直接传送到该层 - if (core.status.event.id == "viewMaps") { - if (!core.hasItem("fly")) { - core.playSound("操作失败"); - core.drawTip("你没有" + core.material.items["fly"].name, "fly"); - } else if ( - core.flags.flyNearStair && - !core.nearStair() && - !flags.canMoveFloor - ) { - core.playSound("操作失败"); - core.drawTip( - "无法到达楼梯边使用" + core.material.items["fly"].name, - "fly" - ); - } else { - core.flyTo(core.status.event.data.floorId); - core.updateStatusBar(); - } - return; - } - - if (!this._checkStatus("fly", fromUserAction, true)) return; - //if (core.flags.flyNearStair && !core.nearStair()) - - if ( - (core.flags.flyNearStair && !core.nearStair()) || - !flags.canMoveFloor - ) { - core.playSound("操作失败"); - core.drawTip( - "无法到达楼梯边使用" + core.material.items["fly"].name, - "fly" - ); - core.unlockControl(); - core.status.event.data = null; - core.status.event.id = null; - return; - } - if (!core.canUseItem("fly")) { - core.playSound("操作失败"); - core.drawTip(core.material.items["fly"].name + "好像失效了", "fly"); - core.unlockControl(); - core.status.event.data = null; - core.status.event.id = null; - return; - } - core.playSound("打开界面"); - core.useItem("fly", true); - core.updateStatusBar(); - return; - }; - ////// 系统菜单栏界面时的点击操作 ////// - actions.prototype._clickSettings = function (x, y) { - if (this._out(x)) return; - var choices = core.status.event.ui.choices; - var topIndex = this._getChoicesTopIndex(choices.length); - if (y >= topIndex && y < topIndex + choices.length) { - var selection = y - topIndex; - core.status.event.selection = selection; - switch (selection) { - case 0: - core.status.event.selection = 0; - core.playSound("确定"); - core.ui._drawSwitchs(); - break; - case 1: - // core.playSound('确定'); - core.ui._drawKeyBoard(); - break; - case 2: - // core.playSound('确定'); - core.clearUI(); - core.useItem("fly"); - break; - case 3: - core.status.event.selection = 0; - core.playSound("确定"); - core.ui._drawNotes(); - break; - case 4: - core.status.event.selection = 0; - core.playSound("确定"); - core.ui._drawSyncSave(); - break; - case 5: - core.status.event.selection = 0; - core.playSound("确定"); - core.ui._drawGameInfo(); - break; - case 6: - return core.confirmRestart(); - case 7: - core.playSound("取消"); - core.ui.closePanel(); - break; - } - } - return; - }; - ////// 查看地图界面时的点击操作 ////// - actions.prototype._clickViewMaps = function (x, y, px, py) { - if (core.status.event.data == null) { - core.ui._drawViewMaps(core.floorIds.indexOf(core.status.floorId)); - return; - } - let now = core.floorIds.indexOf(core.status.floorId); - let index = core.status.event.data.index; - let cx = core.status.event.data.x, - cy = core.status.event.data.y; - let floorId = core.floorIds[index], - mw = core.floors[floorId].width, - mh = core.floors[floorId].height; - let perpx = core.__PIXELS__ / 5, - cornerpx = (perpx * 3) / 4; - const bfs = core.plugin.bfsSearch(floorId, 1, true); - const mapdir = bfs.mapdir[floorId]; - const res = bfs.res; - const formto = {}; - for (let from in res) { - const to = res[from]; - const [fromfloorId, fromsx, fromsy, dir] = from.split("_"); - const [tofloorId, tosx, tosy] = to.split("_"); - if (!formto[fromfloorId]) formto[fromfloorId] = {}; - if (!formto[fromfloorId][dir]) formto[fromfloorId][dir] = tofloorId; - } - const areas = core.getFlag("areas"); - let i = areas.findIndex((v) => v.maps.includes(floorId)); - - if (px >= 11 && px <= 54 && py >= 11 && py <= 54) { - core.ui._drawViewMaps(core.floorIds.indexOf(core.status.floorId)); - } else if (px >= 362 && px <= 407 && py >= 191 && py <= 318) { - flags.showEnemy = !flags.showEnemy; - core.ui._drawViewMaps(index); - } else if (px >= 364 && px <= 407 && py >= 364 && py <= 407) { - core.clearMap("data"); - core.playSound("取消"); - core.ui.closePanel(); - core.getItemDetail(); - core.redrawMap(); - core.updateStatusBar(); - core.ui.statusBar._update_map(); - return; - } else if (px >= 55 && px <= 317 && py >= 11 && py <= 54) { - if (mapdir.includes("up")) - core.ui._drawViewMaps(core.floorIds.indexOf(formto[floorId].up)); - } else if (px >= 55 && px <= 317 && py >= 319 && py <= 362) { - if (mapdir.includes("down")) - core.ui._drawViewMaps(core.floorIds.indexOf(formto[floorId].down)); - } else if (px >= 11 && px <= 54 && py >= 55 && py <= 317) { - if (mapdir.includes("left")) - core.ui._drawViewMaps(core.floorIds.indexOf(formto[floorId].left)); - } else if (px >= 319 && px <= 362 && py >= 55 && py <= 317) { - if (mapdir.includes("right")) - core.ui._drawViewMaps(core.floorIds.indexOf(formto[floorId].right)); - } else if (px >= 319 && px <= 407 && py >= 11 && py <= 54) { - if (mapdir.includes("upFloor")) - core.ui._drawViewMaps(core.floorIds.indexOf(formto[floorId].upFloor)); - } else if (px >= 319 && px <= 407 && py >= 319 && py <= 362) { - if (mapdir.includes("downFloor")) - core.ui._drawViewMaps( - core.floorIds.indexOf(formto[floorId].downFloor) - ); - } else if ( - px >= 55 && - px <= 317 && - py >= 55 && - py <= 317 && - core.isPlaying() - ) { - core.useFly(false); - return; - } else if (px >= 11 && px <= 54 && py >= 364 && py <= 407) { - if (i > 0) { - i -= 1; - core.ui._drawViewMaps(core.floorIds.indexOf(areas[i].maps[0])); - } - } else if (px >= 319 && px <= 362 && py >= 364 && py <= 407) { - if (i < areas.length - 1) { - i += 1; - core.ui._drawViewMaps(core.floorIds.indexOf(areas[i].maps[0])); - } - } - }; - const replayAction_fly = function (action) { - //楼层传送的录像操作 - if (action.indexOf("fly:") != 0) return false; - var floorId = action.substring(4); - var toIndex = core.floorIds.indexOf(floorId); - if ( - !core.canUseItem("fly") || - (core.flags.flyNearStair && !core.nearStair() && !flags.canMoveFloor) - ) - return false; - core.ui._drawViewMaps(toIndex); - if (core.status.replay.speed == 24) { - if (!core.flyTo(floorId, core.replay)) - core.control._replay_error(action); - return true; - } - setTimeout(function () { - if (!core.flyTo(floorId, core.replay)) - core.control._replay_error(action); - }, core.control.__replay_getTimeout()); - return true; - }; - core.registerReplayAction("fly", replayAction_fly); - ////// 查看地图界面时,放开某个键的操作 ////// - - actions.prototype._keyUpViewMaps = function (keycode) { - if (core.status.event.data == null) { - core.ui._drawViewMaps(core.floorIds.indexOf(core.status.floorId)); - return; - } - var floorId = core.floorIds[core.status.event.data.index]; - - if (keycode == 27 || keycode == 71) { - core.clearMap("data"); - core.playSound("取消"); - core.ui.closePanel(); - core.getItemDetail(); - core.redrawMap(); - core.ui.statusBar._update_map(); - core.updateStatusBar(); - return; - } - - if (keycode == 86) { - core.status.event.data.damage = !core.status.event.data.damage; - core.playSound("光标移动"); - core.ui._drawViewMaps(core.status.event.data); - return; - } - if (keycode == 66 || keycode == 88) { - if (core.isReplaying()) { - core.control._replay_book(); - } else { - core.openBook(false); - } - return; - } - if ( - (keycode == 13 || keycode == 32 || keycode == 67) && - !core.isReplaying() - ) { - core.useFly(false); - return; - } - return; - }; - actions.prototype._keyDownViewMaps = function (keycode) { - if (core.status.event.data == null) return; - - var floorId = core.floorIds[core.status.event.data.index], - mh = core.floors[floorId].height; - - if (keycode == 39) this._clickViewMaps(9, 1, 330, 250); - if (keycode == 37) this._clickViewMaps(9, 8, 25, 200); - if (keycode == 40) this._clickViewMaps(9, 6, 250, 330); - if (keycode == 38) this._clickViewMaps(9, 3, 200, 25); - if (keycode == 34) this._clickViewMaps(9, 3, 350, 330); - if (keycode == 33) this._clickViewMaps(9, 3, 350, 25); - return; - }; - - actions.prototype._sys_onmousewheel = function (direct) { - // 向下滚动是 -1 ,向上是 1 - - if (this._checkReplaying()) { - // 滚轮控制速度 - if (direct == 1) core.speedUpReplay(); - if (direct == -1) core.speedDownReplay(); - return; - } - - // 楼层飞行器 - if (core.status.lockControl && core.status.event.id == "fly") { - if (direct == 1) core.ui.drawFly(this._getNextFlyFloor(1)); - if (direct == -1) core.ui.drawFly(this._getNextFlyFloor(-1)); - return; - } - - // 怪物手册 - if (core.status.lockControl && core.status.event.id == "book") { - var pageinfo = core.ui._drawBook_pageinfo(); - if (direct == 1) - core.ui.drawBook(core.status.event.data - pageinfo.per_page); - if (direct == -1) - core.ui.drawBook(core.status.event.data + pageinfo.per_page); - return; - } - - // 存读档 - if ( - core.status.lockControl && - (core.status.event.id == "save" || core.status.event.id == "load") - ) { - var index = - core.status.event.data.page * 10 + core.status.event.data.offset; - if (direct == 1) core.ui._drawSLPanel(index - 10); - if (direct == -1) core.ui._drawSLPanel(index + 10); - return; - } - - // 浏览地图 - if (core.status.lockControl && core.status.event.id == "viewMaps") { - let floorId = core.floorIds[core.status.event.data.index]; - if (!flags.__visited__[floorId]) floorId = core.status.floorId; - const visit = Object.keys(flags.__visited__); - let index = visit.indexOf(floorId); - if (direct == 1) { - if (index > 0) - core.ui._drawViewMaps(core.floorIds.indexOf(visit[index - 1])); - } - if (direct == -1) { - if (index < visit.length - 1) - core.ui._drawViewMaps(core.floorIds.indexOf(visit[index + 1])); - } - return; - } - - // wait事件 - if ( - core.status.lockControl && - core.status.event.id == "action" && - core.status.event.data.type == "wait" - ) { - var timeout = - Math.max(0, core.status.event.timeout - new Date().getTime()) || 0; - core.setFlag("type", 0); - var keycode = direct == 1 ? 33 : 34; - core.setFlag("keycode", keycode); - core.setFlag("timeout", timeout); - var executed = core.events.__action_wait_afterGet( - core.status.event.data.current - ); - if (executed || !core.status.event.data.current.forceChild) { - core.status.route.push("input:" + (1e8 * timeout + keycode)); - clearTimeout(core.status.event.interval); - delete core.status.event.timeout; - core.doAction(); - } - return; - } - }; - core.registerAction( - "onmousewheel", - "_sys_onmousewheel", - actions.prototype._sys_onmousewheel, - 0 - ); -}, - "CG回廊": function () { - // 在此增加新插件 - const CGUI = document.createElement("canvas"); //CGui画布设置 - CGUI.style.position = "absolute"; - CGUI.style.zIndex = 300; - CGUI.style.display = "none"; - CGUI.id = "CGUI"; - main.dom.gameGroup.insertAdjacentElement("afterend", CGUI); - CGUI.style.top = "50%"; - CGUI.style.left = "50%"; - CGUI.style.transform = "translate(-50%,-50%)"; - const ctx = CGUI.getContext("2d"); - main.dom.CGUI = CGUI; - let page = 0; //初始页面 - let show = false; //展示状态 - CGUI.onclick = function (e) { - try { - e.preventDefault(); - if (core.isPlaying()) return false; - const left = core.dom.gameGroup.offsetLeft; - const top = core.dom.gameGroup.offsetTop; - const px = Math.floor((e.clientX - left) / core.domStyle.scale), - py = Math.floor((e.clientY - top) / core.domStyle.scale); - core.ui.CG.onclick(px * 3, py * 3); - } catch (ee) { - main.log(ee); } + core.fillRoundRect( + "ui", + 15 + 44 - 2, + 60 - 2 + size - 4, + size + 4 - 58, + 35 + 4, + 4, + "#444444" + ); + core.strokeRoundRect( + "ui", + 15 + 44 - 4, + 60 - 4 + size - 4, + size + 8 - 58, + 35 + 8, + 4, + "#444444", + 1 + ); + core.fillBoldText1( + "ui", + core.status.maps[floorId].areas, + 30 + 145 + 10, + 17 + 65 + size - 4, + "#FFFFFF", + "#000000", + 2, + this._buildFont(18, true) + ); + core.fillRoundRect( + "ui", + 15 - 2, + 60 - 2 + size - 4, + 35 + 4, + 35 + 4, + 4, + "#444444" + ); + core.strokeRoundRect( + "ui", + 15 - 4, + 60 - 4 + size - 4, + 35 + 8, + 35 + 8, + 4, + "#444444", + 1 + ); + if (i === 0) { + core.fillBoldText1( + "ui", + "◀", + 30, + 17 + 65 + size - 4, + "#909090", + "#000000", + 2, + this._buildFont(18, true) + ); + } else { + core.fillBoldText1( + "ui", + "◀", + 30, + 17 + 65 + size - 4, + "#FFFFFF", + "#000000", + 2, + this._buildFont(18, true) + ); + } + core.fillRoundRect( + "ui", + 15 - 2 + size - 4, + 60 - 2 + size - 4, + 35 + 4, + 35 + 4, + 4, + "#444444" + ); + core.strokeRoundRect( + "ui", + 15 - 4 + size - 4, + 60 - 4 + size - 4, + 35 + 8, + 35 + 8, + 4, + "#444444", + 1 + ); + if (i === areas.length - 1) { + core.fillBoldText1( + "ui", + "▶", + 30 + 300 + 10, + 17 + 65 + size - 4, + "#909090", + "#000000", + 2, + this._buildFont(18, true) + ); + } else { + core.fillBoldText1( + "ui", + "▶", + 30 + 300 + 10, + 17 + 65 + size - 4, + "#FFFFFF", + "#000000", + 2, + this._buildFont(18, true) + ); + } + + core.fillRoundRect( + "ui", + 15 - 2 + size - 4, + 15 - 2, + 80 + 4, + 35 + 4, + 4, + "#444444" + ); + core.strokeRoundRect( + "ui", + 15 - 4 + size - 4, + 15 - 4, + 80 + 8, + 35 + 8, + 4, + "#444444", + 1 + ); + if (mapdir.includes("upFloor")) { + core.fillBoldText1( + "ui", + "上楼", + 30 + 320 + 10, + 17 + 20, + "#FFFFFF", + "#000000", + 2, + this._buildFont(18, true) + ); + } else { + core.fillBoldText1( + "ui", + "上楼", + 30 + 320 + 10, + 17 + 20, + "#909090", + "#000000", + 2, + this._buildFont(18, true) + ); + } + core.fillRoundRect( + "ui", + 15 - 2 + size - 4, + 15 - 2 + size - 4, + 80 + 4, + 35 + 4, + 4, + "#444444" + ); + core.strokeRoundRect( + "ui", + 15 - 4 + size - 4, + 15 - 4 + size - 4, + 80 + 8, + 35 + 8, + 4, + "#444444", + 1 + ); + if (mapdir.includes("downFloor")) { + core.fillBoldText1( + "ui", + "下楼", + 30 + 320 + 10, + 17 + 20 + size - 4, + "#FFFFFF", + "#000000", + 2, + this._buildFont(18, true) + ); + } else { + core.fillBoldText1( + "ui", + "下楼", + 30 + 320 + 10, + 17 + 20 + size - 4, + "#909090", + "#000000", + 2, + this._buildFont(18, true) + ); + } + + core.fillRoundRect( + "ui", + 15 - 2 + size - 4 + 35 + 8, + 59 - 2, + 37 + 4, + (size - 58) / 2 + 4, + 4, + "#444444" + ); + core.strokeRoundRect( + "ui", + 15 - 4 + size - 4 + 35 + 8, + 59 - 4, + 37 + 8, + (size - 58) / 2 + 8, + 4, + "#444444", + 1 + ); + const title = core.status.maps[floorId].title; + //const length = title.length + fillTextVertical( + "ui", + title, + 15 - 4 + size - 4 + 45, + 85, + core.hasVisitedFloor(floorId) ? "#FFFFFF" : "#444444", + "#000000", + 18 + ); + //const uictx = main.dom.gameCanvas.ui.getContext('2d') + core.fillRoundRect( + "ui", + 15 - 2 + size - 4 + 35 + 8, + 59 - 2 + (size - 58) / 2 + 8, + 37 + 4, + 119 + 4, + 4, + "#444444" + ); + core.strokeRoundRect( + "ui", + 15 - 4 + size - 4 + 35 + 8, + 59 - 4 + (size - 58) / 2 + 8, + 37 + 8, + 119 + 8, + 4, + "#444444", + 1 + ); + if (core.getFlag("showEnemy")) { + fillTextVertical( + "ui", + "关闭漏怪检测", + 15 - 4 + size - 4 + 45, + 220, + "#FFFFFF", + "#000000", + 18 + ); + } else { + fillTextVertical( + "ui", + "开启漏怪检测", + 15 - 4 + size - 4 + 45, + 220, + "#FFFFFF", + "#000000", + 18 + ); + } + + //uictx.fillTextVertical(title, 15 - 4 + size - 4 + 35 + 29, 25 + 150) + //fillTextVertical('ui', title, 15 - 4 + size - 4 + 35 + 29, 25 + 150, '#FFFFFF', this._buildFont(18, true)) }; - class CG { - constructor() { - this.cgs; - //cg列表 - this.UIMx = [ - //空位用‘none’填充,当前ui3*2 - [ - ["eve_010102.webp", "eve_010203.webp", "eve_010304.webp"], - ["eve_010501.webp", "eve_010601.webp", "eve_010701.webp"], - ], - [ - ["eve_010801.webp", "eve_010902.webp", "eve_011001.webp"], - ["eve_011101.webp", "eve_011202.webp", "eve_011302.webp"], - ], - [ - ["eve_011402.webp", "eve_020102.webp", "eve_020201.webp"], - ["eve_020301.webp", "eve_020401.webp", "eve_020501.webp"], - ], - [ - ["eve_020605.webp", "eve_020701.webp", "eve_020801.webp"], - ["eve_030101.webp", "eve_030206.webp", "eve_030302.webp"], - ], - [ - ["eve_030508.webp", "eve_030601.webp", "eve_030801.webp"], - ["eve_030901.webp", "eve_031002.webp", "eve_031101.webp"], - ], - [ - ["eve_040201.webp", "eve_040401.webp", "eve_040501.webp"], - ["eve_040601.webp", "eve_040702.webp", "eve_040801.webp"], - ], - [ - ["eve_050101.webp", "eve_050201.webp", "eve_050401.webp"], - ["eve_050501.webp", "eve_050601.webp", "eve_050704.webp"], - ], - [ - ["eve_050801.webp", "eve_070101.webp", "bg_1511.webp"], - ["bg_1521.webp", "bg_2011.webp", "bg_2521.webp"], - ], - [ - ["bg_3042.webp", "bg_3551.webp", "bg_3571.webp"], - ["bg_3721.webp", "bg_5033.webp", "bg_5044.webp"], - ], - ]; + function fillTextVertical(name, text, x, y, style, boldstyle, fontsize) { + //竖向文字绘制 + + const ctx = core.ui.getContextByName(name); + if (!ctx) return; + const canvas = document.createElement("canvas"); + const context = canvas.getContext("2d"); + fontsize *= 3; + const length = text.length; + canvas.width = fontsize * 2; + canvas.height = fontsize * length * 2; + if (style) context.fillStyle = core.arrayToRGBA(style); + if (boldstyle) context.strokeStyle = core.arrayToRGBA(boldstyle); + context.lineWidth = 2; + if (fontsize) context.font = core.ui._buildFont(fontsize, true); + let arrText = text.split(""); + + let arrWidth = arrText.map(function (letter) { + return context.measureText(letter).width; + }); + + let align = context.textAlign; + + let baseline = context.textBaseline; + let sx = fontsize, + sy = fontsize * length; + if (align == "left") { + sx = sx + Math.max.apply(null, arrWidth) / 2; + } else if (align == "right") { + sx = sx - Math.max.apply(null, arrWidth) / 2; } - //更新 - update() { - this.background(); - this.drawUI(); + if ( + baseline == "bottom" || + baseline == "alphabetic" || + baseline == "ideographic" + ) { + sy = sy - arrWidth[0] / 2; + } else if (baseline == "top" || baseline == "hanging") { + sy = sy + arrWidth[0] / 2; } - background() { - //画布大小设置 - if (core.domStyle.isVertical) { - CGUI.width = 1248; - CGUI.height = 2028; - } else { - CGUI.width = 2028; - CGUI.height = 1248; - } - core.setTextAlign(ctx, "center"); - } - onclick(px, py) { - //点击 - if (show) { - show = !show; - core.clearMap(ctx); - this.update(); - return; - } - const makeBox = ([x, y], [w, h]) => { - return [ - [x, y], - [x + w, y + h], - ]; - }; - const inRect = ([x, y], [[sx, sy], [dx, dy]]) => { - return sx <= x && x <= dx && sy <= y && y <= dy; - }; - const pos = [px, py]; - const backbox = makeBox([15, 35], [210, 90]); - if (inRect(pos, backbox)) { - //离开按钮是一致的,其余的记区分横竖屏 - CGUI.style.display = "none"; - core.clearMap(ctx); - core.restart(); - return; - } - if (core.domStyle.isVertical) { - //竖屏 - const pageupbox = makeBox([200, 1830], [200, 100]); - const pagedownbox = makeBox([900, 1830], [200, 100]); + context.textAlign = "center"; - const imagebox0 = makeBox([50, 200], [560, 420]); - const imagebox1 = makeBox([50, 750], [560, 420]); - const imagebox2 = makeBox([50, 1300], [560, 420]); + context.textBaseline = "middle"; + context.lineWidth = 6; - const imagebox3 = makeBox([650, 200], [560, 420]); - const imagebox4 = makeBox([650, 750], [560, 420]); - const imagebox5 = makeBox([650, 1300], [560, 420]); - if (inRect(pos, pagedownbox)) { - //2代表当前最大页数-1 - if (page < this.UIMx.length - 1) { - page++; - core.clearMap(ctx); - this.update(); - } - } else if (inRect(pos, pageupbox)) { - if (page > 0) { - page--; - core.clearMap(ctx); - this.update(); - } - } else if (inRect(pos, imagebox0)) { - if (this.cgs.includes(this.UIMx[page][0][0])) { - const img = core.material.images.images[this.UIMx[page][0][0]]; - if (img) { - ctx.save(); //保存设置 - ctx.translate(1248, 0); //重新定位右上角为基准 - ctx.rotate(Math.PI / 2); //旋转90度 - ctx.drawImage(img, 0, 0, 2028, 1248); - ctx.restore(); //重置画布设置 - show = !show; - } - } - } else if (inRect(pos, imagebox1)) { - if (this.cgs.includes(this.UIMx[page][0][1])) { - const img = core.material.images.images[this.UIMx[page][0][1]]; - if (img) { - ctx.save(); //保存设置 - ctx.translate(1248, 0); //重新定位右上角为基准 - ctx.rotate(Math.PI / 2); //旋转90度 - ctx.drawImage(img, 0, 0, 2028, 1248); - ctx.restore(); //重置画布设置 - show = !show; - } - } - } else if (inRect(pos, imagebox2)) { - if (this.cgs.includes(this.UIMx[page][0][2])) { - const img = core.material.images.images[this.UIMx[page][0][2]]; - if (img) { - ctx.save(); //保存设置 - ctx.translate(1248, 0); //重新定位右上角为基准 - ctx.rotate(Math.PI / 2); //旋转90度 - ctx.drawImage(img, 0, 0, 2028, 1248); - ctx.restore(); //重置画布设置 - show = !show; - } - } - } else if (inRect(pos, imagebox3)) { - if (this.cgs.includes(this.UIMx[page][1][0])) { - const img = core.material.images.images[this.UIMx[page][1][0]]; - if (img) { - ctx.save(); //保存设置 - ctx.translate(1248, 0); //重新定位右上角为基准 - ctx.rotate(Math.PI / 2); //旋转90度 - ctx.drawImage(img, 0, 0, 2028, 1248); - ctx.restore(); //重置画布设置 - show = !show; - } - } - } else if (inRect(pos, imagebox4)) { - if (this.cgs.includes(this.UIMx[page][1][1])) { - const img = core.material.images.images[this.UIMx[page][1][1]]; - if (img) { - ctx.save(); //保存设置 - ctx.translate(1248, 0); //重新定位右上角为基准 - ctx.rotate(Math.PI / 2); //旋转90度 - ctx.drawImage(img, 0, 0, 2028, 1248); - ctx.restore(); //重置画布设置 - show = !show; - } - } - } else if (inRect(pos, imagebox5)) { - if (this.cgs.includes(this.UIMx[page][1][2])) { - const img = core.material.images.images[this.UIMx[page][1][2]]; - if (img) { - ctx.save(); //保存设置 - ctx.translate(1248, 0); //重新定位右上角为基准 - ctx.rotate(Math.PI / 2); //旋转90度 - ctx.drawImage(img, 0, 0, 2028, 1248); - ctx.restore(); //重置画布设置 - show = !show; - } - } - } - } else { - const pageupbox = makeBox([200, 1110], [200, 100]); - const pagedownbox = makeBox([1600, 1110], [200, 100]); - const imagebox0 = makeBox([75, 150], [600, 450]); - const imagebox1 = makeBox([725, 150], [600, 450]); - const imagebox2 = makeBox([1300, 150], [600, 450]); - const imagebox3 = makeBox([75, 650], [600, 450]); - const imagebox4 = makeBox([725, 650], [600, 450]); - const imagebox5 = makeBox([1375, 650], [600, 450]); - if (inRect(pos, pagedownbox)) { - if (page < this.UIMx.length - 1) { - page++; - core.clearMap(ctx); - this.update(); - } - } else if (inRect(pos, pageupbox)) { - if (page > 0) { - page--; - core.clearMap(ctx); - this.update(); - } - } else if (inRect(pos, imagebox0)) { - if (this.cgs.includes(this.UIMx[page][0][0])) { - const img = core.material.images.images[this.UIMx[page][0][0]]; - if (img) { - ctx.drawImage(img, 0, 0, 2028, 1248); - show = !show; - } - } - } else if (inRect(pos, imagebox1)) { - if (this.cgs.includes(this.UIMx[page][0][1])) { - const img = core.material.images.images[this.UIMx[page][0][1]]; - if (img) { - ctx.drawImage(img, 0, 0, 2028, 1248); - show = !show; - } - } - } else if (inRect(pos, imagebox2)) { - if (this.cgs.includes(this.UIMx[page][0][2])) { - const img = core.material.images.images[this.UIMx[page][0][2]]; - if (img) { - ctx.drawImage(img, 0, 0, 2028, 1248); - show = !show; - } - } - } else if (inRect(pos, imagebox3)) { - if (this.cgs.includes(this.UIMx[page][1][0])) { - const img = core.material.images.images[this.UIMx[page][1][0]]; - if (img) { - ctx.drawImage(img, 0, 0, 2028, 1248); - show = !show; - } - } - } else if (inRect(pos, imagebox4)) { - if (this.cgs.includes(this.UIMx[page][1][1])) { - const img = core.material.images.images[this.UIMx[page][1][1]]; - if (img) { - ctx.drawImage(img, 0, 0, 2028, 1248); - show = !show; - } - } - } else if (inRect(pos, imagebox5)) { - if (this.cgs.includes(this.UIMx[page][1][2])) { - const img = core.material.images.images[this.UIMx[page][1][2]]; - if (img) { - ctx.drawImage(img, 0, 0, 2028, 1248); - show = !show; - } - } - } - } - } - drawUI() { - //绘制页面 - core.clearMap(CGUI); - const bgVertical = core.material.images.images["bg_2010.webp"]; //竖屏背景 - const bg = core.material.images.images["bg_5043.webp"]; //横屏背景 + // 开始逐字绘制 - if (core.domStyle.isVertical) { - //竖屏 + arrText.forEach(function (letter, index) { + // 确定下一个字符的纵坐标位置 - core.fillRect(ctx, 0, 0, 1248, 2028, "#000000"); //黑色背景 - ctx.globalAlpha = 0.5; //透明度 - if (bgVertical) - ctx.drawImage(bgVertical, 0, 0, 1280, 1500, 0, 0, 1248, 2028); //绘制半透明背景图片 - ctx.globalAlpha = 1; //恢复为不透明 + context.strokeText(letter, sx, sy); + context.fillText(letter, sx, sy); + // 旋转坐标系还原成初始态 - core.setTextAlign(ctx, "center"); - core.fillBoldText1( - ctx, - "◀离开", - 100, - 110, - "#FFFFFF", - "#000000", - 6, - core.ui._buildFont(66, true) - ); + context.setTransform(1, 0, 0, 1, 0, 0); - core.fillBoldText1( - ctx, - "上一页", - 300, - 1900, - page === 0 ? "#444444" : "#FFFFFF", - "#000000", - 6, - core.ui._buildFont(66, true) - ); + // 确定下一个字符的纵坐标位置 - core.fillBoldText1( - ctx, - page + 1 + "/" + this.UIMx.length, - 650, - 1900, - "#FFFFFF", - "#000000", - 6, - core.ui._buildFont(66, true) - ); - core.fillBoldText1( - ctx, - "下一页", - 1000, - 1900, - page === this.UIMx.length - 1 ? "#444444" : "#FFFFFF", - "#000000", - 6, - core.ui._buildFont(66, true) - ); - // 添加向上翻页和向下翻页的按钮 + var letterWidth = 54; - // 添加3*2个4:3的画框,及图片 - for (let i = 0; i < 3; i++) { - for (let j = 0; j < 2; j++) { - const img = core.material.images.images[this.UIMx[page][j][i]]; - core.strokeRect( - ctx, - 50 + j * 600, - 200 + i * 550, - 560, - 420, - "#444444", - 5 - ); - if (this.cgs.includes(this.UIMx[page][j][i])) { - if (img) - ctx.drawImage( - img, - 50 + j * 600 + 15, - 200 + i * 550 + 15, - 560 - 30, - 420 - 30 - ); - } else { - ctx.fillStyle = "#000000"; - ctx.fillRect( - 50 + j * 600 + 15, - 200 + i * 550 + 15, - 560 - 30, - 420 - 30 - ); - const img = core.material.images.images["LOGO.webp"]; - if (img) - ctx.drawImage( - img, - 50 + j * 600 + 15, - 200 + i * 550 + 15, - 560 - 30, - 420 - 30 - ); - } - } - } - } else { - //横屏 - core.fillRect(ctx, 0, 0, 2028, 1248, "#000000"); //黑色背景 - ctx.globalAlpha = 0.5; //透明度 - if (bg) ctx.drawImage(bg, 0, 0, 1280, 720, 0, 0, 2028, 1248); //绘制半透明背景图片 - ctx.globalAlpha = 1; //恢复为不透明 + sy = sy + letterWidth; + }); - core.setTextAlign(ctx, "center"); - core.fillBoldText1( - ctx, - "◀离开", - 110, - 100, - "#FFFFFF", - "#000000", - 6, - core.ui._buildFont(66, true) - ); + // 水平垂直对齐方式还原 - // 添加向上翻页和向下翻页的按钮 - core.fillBoldText1( - ctx, - "上一页", - 300, - 1180, - page === 0 ? "#444444" : "#FFFFFF", - "#000000", - 6, - core.ui._buildFont(66, true) - ); + context.textAlign = align; - core.fillBoldText1( - ctx, - page + 1 + "/" + this.UIMx.length, - 1000, - 1180, - "#FFFFFF", - "#000000", - 6, - core.ui._buildFont(66, true) - ); - core.fillBoldText1( - ctx, - "下一页", - 1700, - 1180, - page === this.UIMx.length - 1 ? "#444444" : "#FFFFFF", - "#000000", - 6, - core.ui._buildFont(66, true) - ); + context.textBaseline = baseline; - // 添加3*2个4:3的画框 - for (let i = 0; i < 2; i++) { - for (let j = 0; j < 3; j++) { - core.strokeRect( - ctx, - 75 + j * 650, - 150 + i * 500, - 600, - 450, - "#444444", - 2 - ); - if (this.cgs.includes(this.UIMx[page][i][j])) { - const img = core.material.images.images[this.UIMx[page][i][j]]; - if (img) - ctx.drawImage( - img, - 75 + j * 650 + 15, - 150 + i * 500 + 15, - 600 - 30, - 450 - 30 - ); - } else { - ctx.fillStyle = "#000000"; - ctx.fillRect( - 75 + j * 650 + 15, - 150 + i * 500 + 15, - 600 - 30, - 450 - 30 - ); - const img = core.material.images.images["LOGO.webp"]; - if (img) - ctx.drawImage( - img, - 75 + j * 650 + 15, - 150 + i * 500 + 15, - 600 - 30, - 450 - 30 - ); - } - } - } - } - } + //绘制到目标位置 + ctx.drawImage( + canvas, + x, + y - (fontsize / 3) * length, + canvas.width / 3, + canvas.height / 3 + ); } - this.setcgs = function (img) { - const a = core.getLocalStorage("cgs", []); - if (img) { - if (!a.includes(img)) a.push(img); - core.setLocalStorage("cgs", a); - } else core.setLocalStorage("cgs"); + + ////// 点击楼层传送器时的打开操作 ////// + events.prototype.useFly = function (fromUserAction) { + if (!core.isPlaying()) return; + if (!core.status.maps[core.status.floorId].canFlyFrom) { + core.drawTip(core.material.items["fly"].name + "好像失效了", "fly"); + return; + } + // 从“浏览地图”页面:尝试直接传送到该层 + if (core.status.event.id == "viewMaps") { + if (!core.hasItem("fly")) { + core.playSound("操作失败"); + core.drawTip("你没有" + core.material.items["fly"].name, "fly"); + } else if ( + core.flags.flyNearStair && + !core.nearStair() && + !flags.canMoveFloor + ) { + core.playSound("操作失败"); + core.drawTip( + "无法到达楼梯边使用" + core.material.items["fly"].name, + "fly" + ); + } else { + core.flyTo(core.status.event.data.floorId); + core.updateStatusBar(); + } + return; + } + + if (!this._checkStatus("fly", fromUserAction, true)) return; + //if (core.flags.flyNearStair && !core.nearStair()) + + if ( + (core.flags.flyNearStair && !core.nearStair()) || + !flags.canMoveFloor + ) { + core.playSound("操作失败"); + core.drawTip( + "无法到达楼梯边使用" + core.material.items["fly"].name, + "fly" + ); + core.unlockControl(); + core.status.event.data = null; + core.status.event.id = null; + return; + } + if (!core.canUseItem("fly")) { + core.playSound("操作失败"); + core.drawTip(core.material.items["fly"].name + "好像失效了", "fly"); + core.unlockControl(); + core.status.event.data = null; + core.status.event.id = null; + return; + } + core.playSound("打开界面"); + core.useItem("fly", true); + core.updateStatusBar(); + return; }; - core.ui.CG = new CG(); - main.dom.CGMode.onclick = function () { - //点击开始页面的CG MODE进入cg回廊 - main.core.control.checkBgm(); - page = 0; - main.core.ui.CG.cgs = core.getLocalStorage("cgs", []); - CGUI.style.display = "block"; - main.core.ui.CG.update(); + ////// 系统菜单栏界面时的点击操作 ////// + actions.prototype._clickSettings = function (x, y) { + if (this._out(x)) return; + var choices = core.status.event.ui.choices; + var topIndex = this._getChoicesTopIndex(choices.length); + if (y >= topIndex && y < topIndex + choices.length) { + var selection = y - topIndex; + core.status.event.selection = selection; + switch (selection) { + case 0: + core.status.event.selection = 0; + core.playSound("确定"); + core.ui._drawSwitchs(); + break; + case 1: + // core.playSound('确定'); + core.ui._drawKeyBoard(); + break; + case 2: + // core.playSound('确定'); + core.clearUI(); + core.useItem("fly"); + break; + case 3: + core.status.event.selection = 0; + core.playSound("确定"); + core.ui._drawNotes(); + break; + case 4: + core.status.event.selection = 0; + core.playSound("确定"); + core.ui._drawSyncSave(); + break; + case 5: + core.status.event.selection = 0; + core.playSound("确定"); + core.ui._drawGameInfo(); + break; + case 6: + return core.confirmRestart(); + case 7: + core.playSound("取消"); + core.ui.closePanel(); + break; + } + } + return; }; + ////// 查看地图界面时的点击操作 ////// + actions.prototype._clickViewMaps = function (x, y, px, py) { + if (core.status.event.data == null) { + core.ui._drawViewMaps(core.floorIds.indexOf(core.status.floorId)); + return; + } + let now = core.floorIds.indexOf(core.status.floorId); + let index = core.status.event.data.index; + let cx = core.status.event.data.x, + cy = core.status.event.data.y; + let floorId = core.floorIds[index], + mw = core.floors[floorId].width, + mh = core.floors[floorId].height; + let perpx = core.__PIXELS__ / 5, + cornerpx = (perpx * 3) / 4; + const bfs = core.plugin.bfsSearch(floorId, 1, true); + const mapdir = bfs.mapdir[floorId]; + const res = bfs.res; + const formto = {}; + for (let from in res) { + const to = res[from]; + const [fromfloorId, fromsx, fromsy, dir] = from.split("_"); + const [tofloorId, tosx, tosy] = to.split("_"); + if (!formto[fromfloorId]) formto[fromfloorId] = {}; + if (!formto[fromfloorId][dir]) formto[fromfloorId][dir] = tofloorId; + } + const areas = core.getFlag("areas"); + let i = areas.findIndex((v) => v.maps.includes(floorId)); + + if (px >= 11 && px <= 54 && py >= 11 && py <= 54) { + core.ui._drawViewMaps(core.floorIds.indexOf(core.status.floorId)); + } else if (px >= 362 && px <= 407 && py >= 191 && py <= 318) { + flags.showEnemy = !flags.showEnemy; + core.ui._drawViewMaps(index); + } else if (px >= 364 && px <= 407 && py >= 364 && py <= 407) { + core.clearMap("data"); + core.playSound("取消"); + core.ui.closePanel(); + core.getItemDetail(); + core.redrawMap(); + core.updateStatusBar(); + core.ui.statusBar._update_map(); + return; + } else if (px >= 55 && px <= 317 && py >= 11 && py <= 54) { + if (mapdir.includes("up")) + core.ui._drawViewMaps(core.floorIds.indexOf(formto[floorId].up)); + } else if (px >= 55 && px <= 317 && py >= 319 && py <= 362) { + if (mapdir.includes("down")) + core.ui._drawViewMaps(core.floorIds.indexOf(formto[floorId].down)); + } else if (px >= 11 && px <= 54 && py >= 55 && py <= 317) { + if (mapdir.includes("left")) + core.ui._drawViewMaps(core.floorIds.indexOf(formto[floorId].left)); + } else if (px >= 319 && px <= 362 && py >= 55 && py <= 317) { + if (mapdir.includes("right")) + core.ui._drawViewMaps(core.floorIds.indexOf(formto[floorId].right)); + } else if (px >= 319 && px <= 407 && py >= 11 && py <= 54) { + if (mapdir.includes("upFloor")) + core.ui._drawViewMaps(core.floorIds.indexOf(formto[floorId].upFloor)); + } else if (px >= 319 && px <= 407 && py >= 319 && py <= 362) { + if (mapdir.includes("downFloor")) + core.ui._drawViewMaps( + core.floorIds.indexOf(formto[floorId].downFloor) + ); + } else if ( + px >= 55 && + px <= 317 && + py >= 55 && + py <= 317 && + core.isPlaying() + ) { + core.useFly(false); + return; + } else if (px >= 11 && px <= 54 && py >= 364 && py <= 407) { + if (i > 0) { + i -= 1; + core.ui._drawViewMaps(core.floorIds.indexOf(areas[i].maps[0])); + } + } else if (px >= 319 && px <= 362 && py >= 364 && py <= 407) { + if (i < areas.length - 1) { + i += 1; + core.ui._drawViewMaps(core.floorIds.indexOf(areas[i].maps[0])); + } + } + }; + const replayAction_fly = function (action) { + //楼层传送的录像操作 + if (action.indexOf("fly:") != 0) return false; + var floorId = action.substring(4); + var toIndex = core.floorIds.indexOf(floorId); + if ( + !core.canUseItem("fly") || + (core.flags.flyNearStair && !core.nearStair() && !flags.canMoveFloor) + ) + return false; + core.ui._drawViewMaps(toIndex); + if (core.status.replay.speed == 24) { + if (!core.flyTo(floorId, core.replay)) + core.control._replay_error(action); + return true; + } + setTimeout(function () { + if (!core.flyTo(floorId, core.replay)) + core.control._replay_error(action); + }, core.control.__replay_getTimeout()); + return true; + }; + core.registerReplayAction("fly", replayAction_fly); + ////// 查看地图界面时,放开某个键的操作 ////// + + actions.prototype._keyUpViewMaps = function (keycode) { + if (core.status.event.data == null) { + core.ui._drawViewMaps(core.floorIds.indexOf(core.status.floorId)); + return; + } + var floorId = core.floorIds[core.status.event.data.index]; + + if (keycode == 27 || keycode == 71) { + core.clearMap("data"); + core.playSound("取消"); + core.ui.closePanel(); + core.getItemDetail(); + core.redrawMap(); + core.ui.statusBar._update_map(); + core.updateStatusBar(); + return; + } + + if (keycode == 86) { + core.status.event.data.damage = !core.status.event.data.damage; + core.playSound("光标移动"); + core.ui._drawViewMaps(core.status.event.data); + return; + } + if (keycode == 66 || keycode == 88) { + if (core.isReplaying()) { + core.control._replay_book(); + } else { + core.openBook(false); + } + return; + } + if ( + (keycode == 13 || keycode == 32 || keycode == 67) && + !core.isReplaying() + ) { + core.useFly(false); + return; + } + return; + }; + actions.prototype._keyDownViewMaps = function (keycode) { + if (core.status.event.data == null) return; + + var floorId = core.floorIds[core.status.event.data.index], + mh = core.floors[floorId].height; + + if (keycode == 39) this._clickViewMaps(9, 1, 330, 250); + if (keycode == 37) this._clickViewMaps(9, 8, 25, 200); + if (keycode == 40) this._clickViewMaps(9, 6, 250, 330); + if (keycode == 38) this._clickViewMaps(9, 3, 200, 25); + if (keycode == 34) this._clickViewMaps(9, 3, 350, 330); + if (keycode == 33) this._clickViewMaps(9, 3, 350, 25); + return; + }; + + actions.prototype._sys_onmousewheel = function (direct) { + // 向下滚动是 -1 ,向上是 1 + + if (this._checkReplaying()) { + // 滚轮控制速度 + if (direct == 1) core.speedUpReplay(); + if (direct == -1) core.speedDownReplay(); + return; + } + + // 楼层飞行器 + if (core.status.lockControl && core.status.event.id == "fly") { + if (direct == 1) core.ui.drawFly(this._getNextFlyFloor(1)); + if (direct == -1) core.ui.drawFly(this._getNextFlyFloor(-1)); + return; + } + + // 怪物手册 + if (core.status.lockControl && core.status.event.id == "book") { + var pageinfo = core.ui._drawBook_pageinfo(); + if (direct == 1) + core.ui.drawBook(core.status.event.data - pageinfo.per_page); + if (direct == -1) + core.ui.drawBook(core.status.event.data + pageinfo.per_page); + return; + } + + // 存读档 + if ( + core.status.lockControl && + (core.status.event.id == "save" || core.status.event.id == "load") + ) { + var index = + core.status.event.data.page * 10 + core.status.event.data.offset; + if (direct == 1) core.ui._drawSLPanel(index - 10); + if (direct == -1) core.ui._drawSLPanel(index + 10); + return; + } + + // 浏览地图 + if (core.status.lockControl && core.status.event.id == "viewMaps") { + let floorId = core.floorIds[core.status.event.data.index]; + if (!flags.__visited__[floorId]) floorId = core.status.floorId; + const visit = Object.keys(flags.__visited__); + let index = visit.indexOf(floorId); + if (direct == 1) { + if (index > 0) + core.ui._drawViewMaps(core.floorIds.indexOf(visit[index - 1])); + } + if (direct == -1) { + if (index < visit.length - 1) + core.ui._drawViewMaps(core.floorIds.indexOf(visit[index + 1])); + } + return; + } + + // wait事件 + if ( + core.status.lockControl && + core.status.event.id == "action" && + core.status.event.data.type == "wait" + ) { + var timeout = + Math.max(0, core.status.event.timeout - new Date().getTime()) || 0; + core.setFlag("type", 0); + var keycode = direct == 1 ? 33 : 34; + core.setFlag("keycode", keycode); + core.setFlag("timeout", timeout); + var executed = core.events.__action_wait_afterGet( + core.status.event.data.current + ); + if (executed || !core.status.event.data.current.forceChild) { + core.status.route.push("input:" + (1e8 * timeout + keycode)); + clearTimeout(core.status.event.interval); + delete core.status.event.timeout; + core.doAction(); + } + return; + } + }; + core.registerAction( + "onmousewheel", + "_sys_onmousewheel", + actions.prototype._sys_onmousewheel, + 0 + ); }, + "CG回廊": function () { + // 在此增加新插件 + const CGUI = document.createElement("canvas"); //CGui画布设置 + CGUI.style.position = "absolute"; + CGUI.style.zIndex = 300; + CGUI.style.display = "none"; + CGUI.id = "CGUI"; + main.dom.gameGroup.insertAdjacentElement("afterend", CGUI); + CGUI.style.top = "50%"; + CGUI.style.left = "50%"; + CGUI.style.transform = "translate(-50%,-50%)"; + const ctx = CGUI.getContext("2d"); + main.dom.CGUI = CGUI; + let page = 0; //初始页面 + let show = false; //展示状态 + CGUI.onclick = function (e) { + try { + e.preventDefault(); + if (core.isPlaying()) return false; + const left = core.dom.gameGroup.offsetLeft; + const top = core.dom.gameGroup.offsetTop; + const px = Math.floor((e.clientX - left) / core.domStyle.scale), + py = Math.floor((e.clientY - top) / core.domStyle.scale); + core.ui.CG.onclick(px * 3, py * 3); + } catch (ee) { + main.log(ee); + } + }; + + class CG { + constructor() { + this.cgs; + //cg列表 + this.UIMx = [ + //空位用‘none’填充,当前ui3*2 + [ + ["eve_010102.webp", "eve_010203.webp", "eve_010304.webp"], + ["eve_010501.webp", "eve_010601.webp", "eve_010701.webp"], + ], + [ + ["eve_010801.webp", "eve_010902.webp", "eve_011001.webp"], + ["eve_011101.webp", "eve_011202.webp", "eve_011302.webp"], + ], + [ + ["eve_011402.webp", "eve_020102.webp", "eve_020201.webp"], + ["eve_020301.webp", "eve_020401.webp", "eve_020501.webp"], + ], + [ + ["eve_020605.webp", "eve_020701.webp", "eve_020801.webp"], + ["eve_030101.webp", "eve_030206.webp", "eve_030302.webp"], + ], + [ + ["eve_030508.webp", "eve_030601.webp", "eve_030801.webp"], + ["eve_030901.webp", "eve_031002.webp", "eve_031101.webp"], + ], + [ + ["eve_040201.webp", "eve_040401.webp", "eve_040501.webp"], + ["eve_040601.webp", "eve_040702.webp", "eve_040801.webp"], + ], + [ + ["eve_050101.webp", "eve_050201.webp", "eve_050401.webp"], + ["eve_050501.webp", "eve_050601.webp", "eve_050704.webp"], + ], + [ + ["eve_050801.webp", "eve_070101.webp", "bg_1511.webp"], + ["bg_1521.webp", "bg_2011.webp", "bg_2521.webp"], + ], + [ + ["bg_3042.webp", "bg_3551.webp", "bg_3571.webp"], + ["bg_3721.webp", "bg_5033.webp", "bg_5044.webp"], + ], + ]; + } + + //更新 + update() { + this.background(); + this.drawUI(); + } + background() { + //画布大小设置 + if (core.domStyle.isVertical) { + CGUI.width = 1248; + CGUI.height = 2028; + } else { + CGUI.width = 2028; + CGUI.height = 1248; + } + core.setTextAlign(ctx, "center"); + } + onclick(px, py) { + //点击 + + if (show) { + show = !show; + core.clearMap(ctx); + this.update(); + return; + } + const makeBox = ([x, y], [w, h]) => { + return [ + [x, y], + [x + w, y + h], + ]; + }; + const inRect = ([x, y], [ + [sx, sy], + [dx, dy] + ]) => { + return sx <= x && x <= dx && sy <= y && y <= dy; + }; + const pos = [px, py]; + const backbox = makeBox([15, 35], [210, 90]); + if (inRect(pos, backbox)) { + //离开按钮是一致的,其余的记区分横竖屏 + CGUI.style.display = "none"; + core.clearMap(ctx); + core.restart(); + return; + } + if (core.domStyle.isVertical) { + //竖屏 + const pageupbox = makeBox([200, 1830], [200, 100]); + const pagedownbox = makeBox([900, 1830], [200, 100]); + + const imagebox0 = makeBox([50, 200], [560, 420]); + const imagebox1 = makeBox([50, 750], [560, 420]); + const imagebox2 = makeBox([50, 1300], [560, 420]); + + const imagebox3 = makeBox([650, 200], [560, 420]); + const imagebox4 = makeBox([650, 750], [560, 420]); + const imagebox5 = makeBox([650, 1300], [560, 420]); + if (inRect(pos, pagedownbox)) { + //2代表当前最大页数-1 + if (page < this.UIMx.length - 1) { + page++; + core.clearMap(ctx); + this.update(); + } + } else if (inRect(pos, pageupbox)) { + if (page > 0) { + page--; + core.clearMap(ctx); + this.update(); + } + } else if (inRect(pos, imagebox0)) { + if (this.cgs.includes(this.UIMx[page][0][0])) { + const img = core.material.images.images[this.UIMx[page][0][0]]; + if (img) { + ctx.save(); //保存设置 + ctx.translate(1248, 0); //重新定位右上角为基准 + ctx.rotate(Math.PI / 2); //旋转90度 + ctx.drawImage(img, 0, 0, 2028, 1248); + ctx.restore(); //重置画布设置 + show = !show; + } + } + } else if (inRect(pos, imagebox1)) { + if (this.cgs.includes(this.UIMx[page][0][1])) { + const img = core.material.images.images[this.UIMx[page][0][1]]; + if (img) { + ctx.save(); //保存设置 + ctx.translate(1248, 0); //重新定位右上角为基准 + ctx.rotate(Math.PI / 2); //旋转90度 + ctx.drawImage(img, 0, 0, 2028, 1248); + ctx.restore(); //重置画布设置 + show = !show; + } + } + } else if (inRect(pos, imagebox2)) { + if (this.cgs.includes(this.UIMx[page][0][2])) { + const img = core.material.images.images[this.UIMx[page][0][2]]; + if (img) { + ctx.save(); //保存设置 + ctx.translate(1248, 0); //重新定位右上角为基准 + ctx.rotate(Math.PI / 2); //旋转90度 + ctx.drawImage(img, 0, 0, 2028, 1248); + ctx.restore(); //重置画布设置 + show = !show; + } + } + } else if (inRect(pos, imagebox3)) { + if (this.cgs.includes(this.UIMx[page][1][0])) { + const img = core.material.images.images[this.UIMx[page][1][0]]; + if (img) { + ctx.save(); //保存设置 + ctx.translate(1248, 0); //重新定位右上角为基准 + ctx.rotate(Math.PI / 2); //旋转90度 + ctx.drawImage(img, 0, 0, 2028, 1248); + ctx.restore(); //重置画布设置 + show = !show; + } + } + } else if (inRect(pos, imagebox4)) { + if (this.cgs.includes(this.UIMx[page][1][1])) { + const img = core.material.images.images[this.UIMx[page][1][1]]; + if (img) { + ctx.save(); //保存设置 + ctx.translate(1248, 0); //重新定位右上角为基准 + ctx.rotate(Math.PI / 2); //旋转90度 + ctx.drawImage(img, 0, 0, 2028, 1248); + ctx.restore(); //重置画布设置 + show = !show; + } + } + } else if (inRect(pos, imagebox5)) { + if (this.cgs.includes(this.UIMx[page][1][2])) { + const img = core.material.images.images[this.UIMx[page][1][2]]; + if (img) { + ctx.save(); //保存设置 + ctx.translate(1248, 0); //重新定位右上角为基准 + ctx.rotate(Math.PI / 2); //旋转90度 + ctx.drawImage(img, 0, 0, 2028, 1248); + ctx.restore(); //重置画布设置 + show = !show; + } + } + } + } else { + const pageupbox = makeBox([200, 1110], [200, 100]); + const pagedownbox = makeBox([1600, 1110], [200, 100]); + const imagebox0 = makeBox([75, 150], [600, 450]); + const imagebox1 = makeBox([725, 150], [600, 450]); + const imagebox2 = makeBox([1300, 150], [600, 450]); + const imagebox3 = makeBox([75, 650], [600, 450]); + const imagebox4 = makeBox([725, 650], [600, 450]); + const imagebox5 = makeBox([1375, 650], [600, 450]); + if (inRect(pos, pagedownbox)) { + if (page < this.UIMx.length - 1) { + page++; + core.clearMap(ctx); + this.update(); + } + } else if (inRect(pos, pageupbox)) { + if (page > 0) { + page--; + core.clearMap(ctx); + this.update(); + } + } else if (inRect(pos, imagebox0)) { + if (this.cgs.includes(this.UIMx[page][0][0])) { + const img = core.material.images.images[this.UIMx[page][0][0]]; + if (img) { + ctx.drawImage(img, 0, 0, 2028, 1248); + show = !show; + } + } + } else if (inRect(pos, imagebox1)) { + if (this.cgs.includes(this.UIMx[page][0][1])) { + const img = core.material.images.images[this.UIMx[page][0][1]]; + if (img) { + ctx.drawImage(img, 0, 0, 2028, 1248); + show = !show; + } + } + } else if (inRect(pos, imagebox2)) { + if (this.cgs.includes(this.UIMx[page][0][2])) { + const img = core.material.images.images[this.UIMx[page][0][2]]; + if (img) { + ctx.drawImage(img, 0, 0, 2028, 1248); + show = !show; + } + } + } else if (inRect(pos, imagebox3)) { + if (this.cgs.includes(this.UIMx[page][1][0])) { + const img = core.material.images.images[this.UIMx[page][1][0]]; + if (img) { + ctx.drawImage(img, 0, 0, 2028, 1248); + show = !show; + } + } + } else if (inRect(pos, imagebox4)) { + if (this.cgs.includes(this.UIMx[page][1][1])) { + const img = core.material.images.images[this.UIMx[page][1][1]]; + if (img) { + ctx.drawImage(img, 0, 0, 2028, 1248); + show = !show; + } + } + } else if (inRect(pos, imagebox5)) { + if (this.cgs.includes(this.UIMx[page][1][2])) { + const img = core.material.images.images[this.UIMx[page][1][2]]; + if (img) { + ctx.drawImage(img, 0, 0, 2028, 1248); + show = !show; + } + } + } + } + } + drawUI() { + //绘制页面 + core.clearMap(CGUI); + const bgVertical = core.material.images.images["bg_2010.webp"]; //竖屏背景 + const bg = core.material.images.images["bg_5043.webp"]; //横屏背景 + + if (core.domStyle.isVertical) { + //竖屏 + + core.fillRect(ctx, 0, 0, 1248, 2028, "#000000"); //黑色背景 + ctx.globalAlpha = 0.5; //透明度 + if (bgVertical) + ctx.drawImage(bgVertical, 0, 0, 1280, 1500, 0, 0, 1248, 2028); //绘制半透明背景图片 + ctx.globalAlpha = 1; //恢复为不透明 + + core.setTextAlign(ctx, "center"); + core.fillBoldText1( + ctx, + "◀离开", + 100, + 110, + "#FFFFFF", + "#000000", + 6, + core.ui._buildFont(66, true) + ); + + core.fillBoldText1( + ctx, + "上一页", + 300, + 1900, + page === 0 ? "#444444" : "#FFFFFF", + "#000000", + 6, + core.ui._buildFont(66, true) + ); + + core.fillBoldText1( + ctx, + page + 1 + "/" + this.UIMx.length, + 650, + 1900, + "#FFFFFF", + "#000000", + 6, + core.ui._buildFont(66, true) + ); + core.fillBoldText1( + ctx, + "下一页", + 1000, + 1900, + page === this.UIMx.length - 1 ? "#444444" : "#FFFFFF", + "#000000", + 6, + core.ui._buildFont(66, true) + ); + // 添加向上翻页和向下翻页的按钮 + + // 添加3*2个4:3的画框,及图片 + for (let i = 0; i < 3; i++) { + for (let j = 0; j < 2; j++) { + const img = core.material.images.images[this.UIMx[page][j][i]]; + core.strokeRect( + ctx, + 50 + j * 600, + 200 + i * 550, + 560, + 420, + "#444444", + 5 + ); + if (this.cgs.includes(this.UIMx[page][j][i])) { + if (img) + ctx.drawImage( + img, + 50 + j * 600 + 15, + 200 + i * 550 + 15, + 560 - 30, + 420 - 30 + ); + } else { + ctx.fillStyle = "#000000"; + ctx.fillRect( + 50 + j * 600 + 15, + 200 + i * 550 + 15, + 560 - 30, + 420 - 30 + ); + const img = core.material.images.images["LOGO.webp"]; + if (img) + ctx.drawImage( + img, + 50 + j * 600 + 15, + 200 + i * 550 + 15, + 560 - 30, + 420 - 30 + ); + } + } + } + } else { + //横屏 + core.fillRect(ctx, 0, 0, 2028, 1248, "#000000"); //黑色背景 + ctx.globalAlpha = 0.5; //透明度 + if (bg) ctx.drawImage(bg, 0, 0, 1280, 720, 0, 0, 2028, 1248); //绘制半透明背景图片 + ctx.globalAlpha = 1; //恢复为不透明 + + core.setTextAlign(ctx, "center"); + core.fillBoldText1( + ctx, + "◀离开", + 110, + 100, + "#FFFFFF", + "#000000", + 6, + core.ui._buildFont(66, true) + ); + + // 添加向上翻页和向下翻页的按钮 + core.fillBoldText1( + ctx, + "上一页", + 300, + 1180, + page === 0 ? "#444444" : "#FFFFFF", + "#000000", + 6, + core.ui._buildFont(66, true) + ); + + core.fillBoldText1( + ctx, + page + 1 + "/" + this.UIMx.length, + 1000, + 1180, + "#FFFFFF", + "#000000", + 6, + core.ui._buildFont(66, true) + ); + core.fillBoldText1( + ctx, + "下一页", + 1700, + 1180, + page === this.UIMx.length - 1 ? "#444444" : "#FFFFFF", + "#000000", + 6, + core.ui._buildFont(66, true) + ); + + // 添加3*2个4:3的画框 + for (let i = 0; i < 2; i++) { + for (let j = 0; j < 3; j++) { + core.strokeRect( + ctx, + 75 + j * 650, + 150 + i * 500, + 600, + 450, + "#444444", + 2 + ); + if (this.cgs.includes(this.UIMx[page][i][j])) { + const img = core.material.images.images[this.UIMx[page][i][j]]; + if (img) + ctx.drawImage( + img, + 75 + j * 650 + 15, + 150 + i * 500 + 15, + 600 - 30, + 450 - 30 + ); + } else { + ctx.fillStyle = "#000000"; + ctx.fillRect( + 75 + j * 650 + 15, + 150 + i * 500 + 15, + 600 - 30, + 450 - 30 + ); + const img = core.material.images.images["LOGO.webp"]; + if (img) + ctx.drawImage( + img, + 75 + j * 650 + 15, + 150 + i * 500 + 15, + 600 - 30, + 450 - 30 + ); + } + } + } + } + } + } + this.setcgs = function (img) { + const a = core.getLocalStorage("cgs", []); + if (img) { + if (!a.includes(img)) a.push(img); + core.setLocalStorage("cgs", a); + } else core.setLocalStorage("cgs"); + }; + core.ui.CG = new CG(); + main.dom.CGMode.onclick = function () { + //点击开始页面的CG MODE进入cg回廊 + main.core.control.checkBgm(); + page = 0; + main.core.ui.CG.cgs = core.getLocalStorage("cgs", []); + CGUI.style.display = "block"; + main.core.ui.CG.update(); + }; +}, "光标设置": function () { // 在此增加新插件 this.changeMouse = function ( @@ -15203,12 +15221,15 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 = const pageupboxVertical = makeBox([18, 300], [100, 200]); const pagedownbox = makeBox([1500, 1130], [200, 100]); const pagedownboxVertical = makeBox([18, 1500], [100, 200]); + const soundbox = makeBox([550, 150], [100, 900]); + const soundboxVertical = makeBox([198, 550], [900, 100]); if (this.log) { if ( (core.domStyle.isVertical && inRect(pos, backboxVertical)) || (!core.domStyle.isVertical && inRect(pos, backbox)) ) { core.clearMap(logctx); + core.stopSound() main.dom.logcanvas.style.display = "none"; this.log = false; } else if ( @@ -15225,6 +15246,17 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 = core.clearMap(logctx); if (this.page < this.overpage) this.page++; this.logdraw(this.page); + } else if ((core.domStyle.isVertical && inRect(pos, soundboxVertical)) || + (!core.domStyle.isVertical && inRect(pos, soundbox))) { + if (core.domStyle.isVertical) { + const sound = this.textList[(this.page - 1) * 6 + Math.min(Math.floor((px - 198) / 150), 5)][2] + core.stopSound() + core.playSound(sound) + } else { + const sound = this.textList[(this.page - 1) * 6 + Math.min(Math.floor((py - 150) / 150), 5)][2] + core.stopSound() + core.playSound(sound) + } } } else { if ( @@ -15536,6 +15568,7 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 = const name = this.textList[i][0] ? "【" + this.textList[i][0] + "】" : ""; + const sound = this.textList[i][2] if (name) { core.fillBoldText1( logctx, @@ -15548,6 +15581,7 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 = core.ui._buildFont(42, true) ); } + if (sound) core.drawImage(logctx, "sound.webp", 550, posy + 30) if (text.length < 30) { core.fillBoldText1( logctx, @@ -17945,205 +17979,207 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 = }; }, "帧动画特效(游戏界面)": function () { - // 在此增加新插件 - const animate2 = document.createElement("canvas"); //画布设置 - animate2.style.zIndex = 91; - animate2.id = "animate2"; - animate2.classList.add("gameCanvas", "anti-aliasing"); - animate2.style.display = "block"; - animate2.width = 416; - animate2.height = 416; - animate2.style.width = core.__PIXELS__ * core.domStyle.scale + "px"; - animate2.style.height = core.__PIXELS__ * core.domStyle.scale + "px"; - main.dom.animate2 = animate2; - const anctx = animate2.getContext("2d"); + // 在此增加新插件 + const animate2 = document.createElement("canvas"); //画布设置 + animate2.style.zIndex = 91; + animate2.id = "animate2"; + animate2.classList.add("gameCanvas", "anti-aliasing"); + animate2.style.display = "block"; + animate2.width = 416; + animate2.height = 416; + animate2.style.width = core.__PIXELS__ * core.domStyle.scale + "px"; + animate2.style.height = core.__PIXELS__ * core.domStyle.scale + "px"; + main.dom.animate2 = animate2; + const anctx = animate2.getContext("2d"); - main.dom.gameDraw.appendChild(animate2); + main.dom.gameDraw.appendChild(animate2); - core.plugin.playing = new Set(); + core.plugin.playing = new Set(); - this.setanimate = function ( - name, - px, - py, - width, - height, - allFarme, - imageList, - soundList - ) { - const data = { - px: px, - py: py, - width: width, - height: height, - allFarme: allFarme, - imageList: imageList, - soundList: soundList, - }; - core.setFlag("animate_" + name, data); - }; - this.deleteanimate = function (name) { - core.setFlag("animate_" + name); - }; - let thistime = 0; - this.playanimate = function (name, x, y, hero, scalex, scaley, callback) { - const data = { - name: name, - x: x, - y: y, - hero: hero, - scalex: scalex, - scaley: scaley, - farme: 0, - callback - }; + this.setanimate = function ( + name, + px, + py, + width, + height, + allFarme, + imageList, + soundList + ) { + const data = { + px: px, + py: py, + width: width, + height: height, + allFarme: allFarme, + imageList: imageList, + soundList: soundList, + }; + core.setFlag("animate_" + name, data); + }; + this.deleteanimate = function (name) { + core.setFlag("animate_" + name); + }; + let thistime = 0; + this.playanimate = function (name, x, y, hero, scalex, scaley, callback) { + const data = { + name: name, + x: x, + y: y, + hero: hero, + scalex: scalex, + scaley: scaley, + farme: 0, + callback, + }; - core.plugin.playing.add(data); - }; - core.registerAnimationFrame("animateonmap", true, function (timestamp) { - if (timestamp - thistime > 1000 / 60) { - thistime = timestamp; - core.clearMap(anctx); - core.plugin.playing.forEach((one) => { - const data = flags["animate_" + one.name]; - if (!data) { - core.plugin.playing.delete(one); - } else { - data.imageList.forEach(function (image) { - if ( - one.farme >= (image.beforefarme ?? 0) && - one.farme <= (image.afterfarme ?? data.allFarme) - ) { - const img = core.material.images.images?.[image.image]; - if (img) { - const gla = image.globalAlpha ?? 100; - const agla = image.aglobalAlpha ?? gla, - beforefarme = image.beforefarme ?? 0; - const afterfarme = image.afterfarme ?? data.allFarme; + core.plugin.playing.add(data); + }; + core.registerAnimationFrame("animateonmap", true, function (timestamp) { + if (timestamp - thistime > 1000 / 60) { + thistime = timestamp; + core.clearMap(anctx); + core.plugin.playing.forEach((one) => { + const data = flags["animate_" + one.name]; + if (!data) { + core.plugin.playing.delete(one); + } else { + data.imageList.forEach(function (image) { + if ( + one.farme >= (image.beforefarme ?? 0) && + one.farme <= (image.afterfarme ?? data.allFarme) + ) { + const img = core.material.images.images?.[image.image]; + if (img) { + const gla = image.globalAlpha ?? 100; + const agla = image.aglobalAlpha ?? gla, + beforefarme = image.beforefarme ?? 0; + const afterfarme = image.afterfarme ?? data.allFarme; - anctx.globalAlpha = - (gla + - ((agla - gla) * (one.farme - beforefarme)) / - (afterfarme - beforefarme || 1)) / - 100; + anctx.globalAlpha = + (gla + + ((agla - gla) * (one.farme - beforefarme)) / + (afterfarme - beforefarme || 1)) / + 100; - const cx = - (image.cx ?? 0) + - (((image.acx ?? 0) - (image.cx ?? 0)) * - (one.farme - beforefarme)) / - (afterfarme - beforefarme || 1), - cy = - (image.cy ?? 0) + - (((image.acy ?? 0) - (image.cy ?? 0)) * - (one.farme - beforefarme)) / - (afterfarme - beforefarme || 1), - cw = - (image.cw ?? img.width) + - (((image.acw ?? img.width) - (image.cw ?? img.width)) * - (one.farme - beforefarme)) / - (afterfarme - beforefarme || 1), - ch = - (image.ch ?? img.height) + - (((image.acw ?? img.height) - (image.cw ?? img.height)) * - (one.farme - beforefarme)) / - (afterfarme - beforefarme || 1), - x = - (image.x ?? 0) + - (((image.ax ?? 0) - (image.x ?? 0)) * - (one.farme - beforefarme)) / - (afterfarme - beforefarme || 1), - y = - (image.y ?? 0) + - (((image.ay ?? 0) - (image.y ?? 0)) * - (one.farme - beforefarme)) / - (afterfarme - beforefarme || 1), - w = - (image.w ?? one.width) + - (((image.aw ?? one.width) - (image.w ?? one.width)) * - (one.farme - beforefarme)) / - (afterfarme - beforefarme || 1), - h = - (image.h ?? one.height) + - (((image.aw ?? one.height) - (image.w ?? one.height)) * - (one.farme - beforefarme)) / - (afterfarme - beforefarme || 1), - angle = - (Math.PI * - ((image.image.angle ?? 0) + - (((image.aangle ?? 0) - (image.image.angle ?? 0)) * - (one.farme - beforefarme)) / - (afterfarme - beforefarme || 1))) / - 180; + const cx = + (image.cx ?? 0) + + (((image.acx ?? 0) - (image.cx ?? 0)) * + (one.farme - beforefarme)) / + (afterfarme - beforefarme || 1), + cy = + (image.cy ?? 0) + + (((image.acy ?? 0) - (image.cy ?? 0)) * + (one.farme - beforefarme)) / + (afterfarme - beforefarme || 1), + cw = + (image.cw ?? img.width) + + (((image.acw ?? img.width) - (image.cw ?? img.width)) * + (one.farme - beforefarme)) / + (afterfarme - beforefarme || 1), + ch = + (image.ch ?? img.height) + + (((image.acw ?? img.height) - (image.cw ?? img.height)) * + (one.farme - beforefarme)) / + (afterfarme - beforefarme || 1), + x = + (image.x ?? 0) + + (((image.ax ?? 0) - (image.x ?? 0)) * + (one.farme - beforefarme)) / + (afterfarme - beforefarme || 1), + y = + (image.y ?? 0) + + (((image.ay ?? 0) - (image.y ?? 0)) * + (one.farme - beforefarme)) / + (afterfarme - beforefarme || 1), + w = + (image.w ?? one.width) + + (((image.aw ?? one.width) - (image.w ?? one.width)) * + (one.farme - beforefarme)) / + (afterfarme - beforefarme || 1), + h = + (image.h ?? one.height) + + (((image.aw ?? one.height) - (image.w ?? one.height)) * + (one.farme - beforefarme)) / + (afterfarme - beforefarme || 1), + angle = + (Math.PI * + ((image.image.angle ?? 0) + + (((image.aangle ?? 0) - (image.image.angle ?? 0)) * + (one.farme - beforefarme)) / + (afterfarme - beforefarme || 1))) / + 180; - if (one.hero) { - let sx, sy; - if (core.status.heroMoving < 0) { - sx = 0; - sy = 0; - } else { - sx = - core.utils.scan[core.status.hero.loc.direction].x * - 4 * - core.status.heroMoving; - sy = - core.utils.scan[core.status.hero.loc.direction].y * - 4 * - core.status.heroMoving; - } - const herox = core.status.hero.loc.x * 32 + 16 + sx; - const heroy = core.status.hero.loc.y * 32 + 16 + sy; - core.drawImage( - anctx, - img, - cx, - cy, - cw, - ch, - herox + (x - data.px) * one.scalex, - heroy + (y - data.py) * one.scaley, - w * one.scalex, - h * one.scaley, - angle - ); - } else { - core.drawImage( - anctx, - img, - cx, - cy, - cw, - ch, - one.x + (x - data.px) * one.scalex, - one.y + (y - data.py) * one.scaley, - w * one.scalex, - h * one.scaley, - angle - ); - } - } - } - }); - data.soundList.forEach(function (sound) { - const lisen = - sound.sound && - core.sounds[sound.sound] && - core.musicStatus.soundStatus; - if (one.farme == sound.startfarme && lisen) { - if (sound.stopbefore) core.stopSound(); - core.playSound(sound.sound); - } - }); - one.farme++; - if (one.farme > data.allFarme) { - core.plugin.playing.delete(one) - if (one.callback) { one.callback() } - }; - } - }); - } - }); -}, + if (one.hero) { + let sx, sy; + if (core.status.heroMoving < 0) { + sx = 0; + sy = 0; + } else { + sx = + core.utils.scan[core.status.hero.loc.direction].x * + 4 * + core.status.heroMoving; + sy = + core.utils.scan[core.status.hero.loc.direction].y * + 4 * + core.status.heroMoving; + } + const herox = core.status.hero.loc.x * 32 + 16 + sx; + const heroy = core.status.hero.loc.y * 32 + 16 + sy; + core.drawImage( + anctx, + img, + cx, + cy, + cw, + ch, + herox + (x - data.px) * one.scalex, + heroy + (y - data.py) * one.scaley, + w * one.scalex, + h * one.scaley, + angle + ); + } else { + core.drawImage( + anctx, + img, + cx, + cy, + cw, + ch, + one.x + (x - data.px) * one.scalex, + one.y + (y - data.py) * one.scaley, + w * one.scalex, + h * one.scaley, + angle + ); + } + } + } + }); + data.soundList.forEach(function (sound) { + const lisen = + sound.sound && + core.sounds[sound.sound] && + core.musicStatus.soundStatus; + if (one.farme == sound.startfarme && lisen) { + if (sound.stopbefore) core.stopSound(); + core.playSound(sound.sound); + } + }); + one.farme++; + if (one.farme > data.allFarme) { + core.plugin.playing.delete(one); + if (one.callback) { + one.callback(); + } + } + } + }); + } + }); + }, "intro&loop": function () { // 在此增加新插件 this.introAndLoop = function (intro, time, loop) { @@ -18489,1022 +18525,1044 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 = }; }, "回合战斗动画": function () { - // 在此增加新插件 - const animateAttack = document.createElement("canvas"); //画布设置 - animateAttack.style.zIndex = 80; - animateAttack.id = "animateAttack"; - animateAttack.classList.add("gameCanvas", "anti-aliasing"); - animateAttack.style.display = "block"; - animateAttack.width = 416; - animateAttack.height = 416; - animateAttack.style.width = core.__PIXELS__ * core.domStyle.scale + "px"; - animateAttack.style.height = core.__PIXELS__ * core.domStyle.scale + "px"; - main.dom.animateAttack = animateAttack; - const ctx = animateAttack.getContext("2d"); + // 在此增加新插件 + const animateAttack = document.createElement("canvas"); //画布设置 + animateAttack.style.zIndex = 80; + animateAttack.id = "animateAttack"; + animateAttack.classList.add("gameCanvas", "anti-aliasing"); + animateAttack.style.display = "block"; + animateAttack.width = 416; + animateAttack.height = 416; + animateAttack.style.width = core.__PIXELS__ * core.domStyle.scale + "px"; + animateAttack.style.height = core.__PIXELS__ * core.domStyle.scale + "px"; + main.dom.animateAttack = animateAttack; + const ctx = animateAttack.getContext("2d"); - main.dom.gameDraw.appendChild(animateAttack); + main.dom.gameDraw.appendChild(animateAttack); - this.drawAttackAnimate = function ( - heroInfo, - oneTurn, - enemyInfo, - equipInfo, - farme, - damageInfo - ) { - let attack = false - if (heroInfo.isAttack) attack = true - if (enemyInfo.isAttack) attack = true - equipInfo.forEach(function (v) { if (v.isAttack) attack = true }) - core.clearMap(ctx); - let animate = Math.floor(farme / 30); - core.fillRect(ctx, 64, 64, 288, 288, "rgba(0,0,0,0.5)"); - core.strokeRect(ctx, 64, 64, 288, 288, "rgba(255,255,255,0.5)", 4); - core.setTextAlign(ctx, "center"); - core.fillBoldText( - ctx, - hero.name, - 127, - 128, - "#FFFFFF", - "#000000", - "bold 14px pala" - ); - core.setTextAlign(ctx, "left"); - core.drawIcon(ctx, "hp", 70, 190, 16, 16); - core.drawIcon(ctx, "atk", 70, 210, 16, 16); - core.drawIcon(ctx, "def", 70, 230, 16, 16); - core.drawIcon(ctx, "I374", 70, 250, 16, 16); - core.drawIcon(ctx, "I375", 70, 270, 16, 16); - core.drawIcon(ctx, "mdef", 70, 290, 16, 16); - core.drawIcon(ctx, "amulet", 70, 310, 16, 16); - core.drawIcon(ctx, "jumpShoes", 70, 330, 16, 16); - core.fillBoldText( - ctx, - "生命 " + - core.formatBigNumber(heroInfo.hp, true) + - " / " + - core.formatBigNumber(heroInfo.hpmax, true), - 90, - 205, - "#FFFFFF", - "#000000", - "bold 14px pala" - ); - core.fillBoldText( - ctx, - "攻击 " + core.formatBigNumber(heroInfo.atk), - 90, - 225, - "#FFFFFF", - "#000000", - "bold 14px pala" - ); - core.fillBoldText( - ctx, - "防御 " + core.formatBigNumber(heroInfo.def), - 90, - 245, - "#FFFFFF", - "#000000", - "bold 14px pala" - ); - core.fillBoldText( - ctx, - "法强 " + core.formatBigNumber(heroInfo.spell), - 90, - 265, - "#FFFFFF", - "#000000", - "bold 14px pala" - ); - core.fillBoldText( - ctx, - "法攻 " + - core.formatBigNumber((heroInfo.matk / 100) * heroInfo.spell) + - "(" + - heroInfo.matk + - "%)", - 90, - 285, - "#FFFFFF", - "#000000", - "bold 14px pala" - ); - core.fillBoldText( - ctx, - "护盾 " + - core.formatBigNumber((heroInfo.mhp / 100) * heroInfo.spell) + - "(" + - heroInfo.mhp + - "%)", - 90, - 305, - "#FFFFFF", - "#000000", - "bold 14px pala" - ); - core.fillBoldText( - ctx, - "法抗 " + heroInfo.mdef + "%", - 90, - 325, - "#FFFFFF", - "#000000", - "bold 14px pala" - ); - core.fillBoldText( - ctx, - "速度 " + core.formatBigNumber(heroInfo.speed), - 90, - 345, - "#FFFFFF", - "#000000", - "bold 14px pala" - ); + this.drawAttackAnimate = function ( + heroInfo, + oneTurn, + enemyInfo, + equipInfo, + farme, + damageInfo + ) { + let attack = false; + if (heroInfo.isAttack) attack = true; + if (enemyInfo.isAttack) attack = true; + equipInfo.forEach(function (v) { + if (v.isAttack) attack = true; + }); + core.clearMap(ctx); + let animate = Math.floor(farme / 30); + core.fillRect(ctx, 64, 64, 288, 288, "rgba(0,0,0,0.5)"); + core.strokeRect(ctx, 64, 64, 288, 288, "rgba(255,255,255,0.5)", 4); + core.setTextAlign(ctx, "center"); + core.fillBoldText( + ctx, + hero.name, + 127, + 128, + "#FFFFFF", + "#000000", + "bold 14px pala" + ); + core.setTextAlign(ctx, "left"); + core.drawIcon(ctx, "hp", 70, 190, 16, 16); + core.drawIcon(ctx, "atk", 70, 210, 16, 16); + core.drawIcon(ctx, "def", 70, 230, 16, 16); + core.drawIcon(ctx, "I374", 70, 250, 16, 16); + core.drawIcon(ctx, "I375", 70, 270, 16, 16); + core.drawIcon(ctx, "mdef", 70, 290, 16, 16); + core.drawIcon(ctx, "amulet", 70, 310, 16, 16); + core.drawIcon(ctx, "jumpShoes", 70, 330, 16, 16); + core.fillBoldText( + ctx, + "生命 " + + core.formatBigNumber(heroInfo.hp, true) + + " / " + + core.formatBigNumber(heroInfo.hpmax, true), + 90, + 205, + "#FFFFFF", + "#000000", + "bold 14px pala" + ); + core.fillBoldText( + ctx, + "攻击 " + core.formatBigNumber(heroInfo.atk), + 90, + 225, + "#FFFFFF", + "#000000", + "bold 14px pala" + ); + core.fillBoldText( + ctx, + "防御 " + core.formatBigNumber(heroInfo.def), + 90, + 245, + "#FFFFFF", + "#000000", + "bold 14px pala" + ); + core.fillBoldText( + ctx, + "法强 " + core.formatBigNumber(heroInfo.spell), + 90, + 265, + "#FFFFFF", + "#000000", + "bold 14px pala" + ); + core.fillBoldText( + ctx, + "法攻 " + + core.formatBigNumber((heroInfo.matk / 100) * heroInfo.spell) + + "(" + + heroInfo.matk + + "%)", + 90, + 285, + "#FFFFFF", + "#000000", + "bold 14px pala" + ); + core.fillBoldText( + ctx, + "护盾 " + + core.formatBigNumber((heroInfo.mhp / 100) * heroInfo.spell) + + "(" + + heroInfo.mhp + + "%)", + 90, + 305, + "#FFFFFF", + "#000000", + "bold 14px pala" + ); + core.fillBoldText( + ctx, + "法抗 " + heroInfo.mdef + "%", + 90, + 325, + "#FFFFFF", + "#000000", + "bold 14px pala" + ); + core.fillBoldText( + ctx, + "速度 " + core.formatBigNumber(heroInfo.speed), + 90, + 345, + "#FFFFFF", + "#000000", + "bold 14px pala" + ); - core.strokeRect(ctx, 112, 139, 32, 48, "rgba(255,255,255,1)", 1); - core.drawImage( - ctx, - "hero.webp", - 32 * (animate % 4), - 0, - 32, - 48, - 112, - 139, - 32, - 48 - ); + core.strokeRect(ctx, 112, 139, 32, 48, "rgba(255,255,255,1)", 1); + core.drawImage( + ctx, + "hero.webp", + 32 * (animate % 4), + 0, + 32, + 48, + 112, + 139, + 32, + 48 + ); - core.setTextAlign(ctx, "center"); - core.fillBoldText( - ctx, - enemyInfo.name, - 289, - 128, - "#FFFFFF", - "#000000", - "bold 14px pala" - ); + core.setTextAlign(ctx, "center"); + core.fillBoldText( + ctx, + enemyInfo.name, + 289, + 128, + "#FFFFFF", + "#000000", + "bold 14px pala" + ); - core.setTextAlign(ctx, "right"); - if (enemyInfo.cls === "enemys") { - core.strokeRect(ctx, 272, 155, 32, 32, "rgba(255,255,255,1)", 1); + core.setTextAlign(ctx, "right"); + if (enemyInfo.cls === "enemys") { + core.strokeRect(ctx, 272, 155, 32, 32, "rgba(255,255,255,1)", 1); - core.drawImage( - ctx, - core.getBlockInfo(enemyInfo.id).image, - 32 * (animate % 2), - core.getBlockInfo(enemyInfo.id).posY * 32, - 32, - 32, - 272, - 155, - 32, - 32 - ); - } else { - core.strokeRect(ctx, 272, 139, 32, 48, "rgba(255,255,255,1)", 1); + core.drawImage( + ctx, + core.getBlockInfo(enemyInfo.id).image, + 32 * (animate % 2), + core.getBlockInfo(enemyInfo.id).posY * 32, + 32, + 32, + 272, + 155, + 32, + 32 + ); + } else { + core.strokeRect(ctx, 272, 139, 32, 48, "rgba(255,255,255,1)", 1); - core.drawImage( - ctx, - core.getBlockInfo(enemyInfo.id).image, - 32 * (animate % 4), - core.getBlockInfo(enemyInfo.id).posY * 48, - 32, - 48, - 272, - 139, - 32, - 48 - ); - } - core.drawIcon(ctx, "hp", 330, 190, 16, 16); - core.drawIcon(ctx, "atk", 330, 210, 16, 16); - core.drawIcon(ctx, "def", 330, 230, 16, 16); - core.drawIcon(ctx, "amulet", 330, 250, 16, 16); - core.drawIcon(ctx, "jumpShoes", 330, 270, 16, 16); - core.fillBoldText( - ctx, - core.formatBigNumber(enemyInfo.hp, true) + " 生命", - 330, - 205, - "#FFFFFF", - "#000000", - "bold 14px pala" - ); - core.fillBoldText( - ctx, - core.formatBigNumber(enemyInfo.atk) + " 攻击", - 330, - 225, - "#FFFFFF", - "#000000", - "bold 14px pala" - ); - core.fillBoldText( - ctx, - core.formatBigNumber(enemyInfo.def) + " 防御", - 330, - 245, - "#FFFFFF", - "#000000", - "bold 14px pala" - ); + core.drawImage( + ctx, + core.getBlockInfo(enemyInfo.id).image, + 32 * (animate % 4), + core.getBlockInfo(enemyInfo.id).posY * 48, + 32, + 48, + 272, + 139, + 32, + 48 + ); + } + core.drawIcon(ctx, "hp", 330, 190, 16, 16); + core.drawIcon(ctx, "atk", 330, 210, 16, 16); + core.drawIcon(ctx, "def", 330, 230, 16, 16); + core.drawIcon(ctx, "amulet", 330, 250, 16, 16); + core.drawIcon(ctx, "jumpShoes", 330, 270, 16, 16); + core.fillBoldText( + ctx, + core.formatBigNumber(enemyInfo.hp, true) + " 生命", + 330, + 205, + "#FFFFFF", + "#000000", + "bold 14px pala" + ); + core.fillBoldText( + ctx, + core.formatBigNumber(enemyInfo.atk) + " 攻击", + 330, + 225, + "#FFFFFF", + "#000000", + "bold 14px pala" + ); + core.fillBoldText( + ctx, + core.formatBigNumber(enemyInfo.def) + " 防御", + 330, + 245, + "#FFFFFF", + "#000000", + "bold 14px pala" + ); - core.fillBoldText( - ctx, - (enemyInfo.mdef ?? 0) * 100 + "% 法抗", - 330, - 265, - "#FFFFFF", - "#000000", - "bold 14px pala" - ); - core.fillBoldText( - ctx, - core.formatBigNumber(enemyInfo.speed) + " 速度", - 330, - 285, - "#FFFFFF", - "#000000", - "bold 14px pala" - ); - core.fillBoldText( - ctx, - "V", - 219, - 163, - "#FFFFFF", - "#000000", - "bold 48px pala" - ); - core.fillBoldText( - ctx, - "s", - 231, - 163, - "#FFFFFF", - "#000000", - "bold 36px pala" - ); + core.fillBoldText( + ctx, + (enemyInfo.mdef ?? 0) * 100 + "% 法抗", + 330, + 265, + "#FFFFFF", + "#000000", + "bold 14px pala" + ); + core.fillBoldText( + ctx, + core.formatBigNumber(enemyInfo.speed) + " 速度", + 330, + 285, + "#FFFFFF", + "#000000", + "bold 14px pala" + ); + core.fillBoldText( + ctx, + "V", + 219, + 163, + "#FFFFFF", + "#000000", + "bold 48px pala" + ); + core.fillBoldText( + ctx, + "s", + 231, + 163, + "#FFFFFF", + "#000000", + "bold 36px pala" + ); - if (!attack) enemyInfo.now += enemyInfo.speed / oneTurn * 215 - let enemynow = Math.min(100 + enemyInfo.now, 315) - ctx.fillStyle = "#FFFFFF" - ctx.beginPath() - ctx.moveTo(enemynow, 100) - ctx.lineTo(enemynow + 3, 90) - ctx.lineTo(enemynow - 3, 90) - ctx.closePath() - ctx.fill() + if (!attack) enemyInfo.now += (enemyInfo.speed / oneTurn) * 215; + let enemynow = Math.min(100 + enemyInfo.now, 315); + ctx.fillStyle = "#FFFFFF"; + ctx.beginPath(); + ctx.moveTo(enemynow, 100); + ctx.lineTo(enemynow + 3, 90); + ctx.lineTo(enemynow - 3, 90); + ctx.closePath(); + ctx.fill(); - if (enemyInfo.cls === "enemys") { + if (enemyInfo.cls === "enemys") { + core.drawImage( + ctx, + core.getBlockInfo(enemyInfo.id).image, + 32, + core.getBlockInfo(enemyInfo.id).posY * 32, + 32, + 32, + enemynow - 16, + 64, + 32, + 32 + ); + } else { + core.drawImage( + ctx, + core.getBlockInfo(enemyInfo.id).image, + 32, + core.getBlockInfo(enemyInfo.id).posY * 48, + 32, + 19, + enemynow - 16, + 70, + 32, + 19 + ); + } + core.drawLine(ctx, 100, 105, 315, 105, "#FFFFFF", 5); + equipInfo.forEach(function (v) { + if (!attack) v.now += (v.speed / oneTurn) * 215; + let vnow = Math.min(100 + v.now, 315); + ctx.beginPath(); + ctx.moveTo(vnow, 100); + ctx.lineTo(vnow + 3, 90); + ctx.lineTo(vnow - 3, 90); + ctx.closePath(); + ctx.fill(); - core.drawImage( - ctx, - core.getBlockInfo(enemyInfo.id).image, - 32, - core.getBlockInfo(enemyInfo.id).posY * 32, - 32, - 32, - enemynow - 16, - 64, - 32, - 32 - ); - } else { + core.drawIcon(ctx, v.id, vnow - 16, 64, 32, 32); + }); + if (!attack) heroInfo.now += (heroInfo.speed / oneTurn) * 215; + let heronow = Math.min(100 + heroInfo.now, 315); + ctx.beginPath(); + ctx.moveTo(heronow, 100); + ctx.lineTo(heronow + 3, 90); + ctx.lineTo(heronow - 3, 90); + ctx.closePath(); + ctx.fill(); + core.drawImage(ctx, "hero.webp", 0, 0, 32, 19, heronow - 16, 70, 32, 19); - core.drawImage( - ctx, - core.getBlockInfo(enemyInfo.id).image, - 32, - core.getBlockInfo(enemyInfo.id).posY * 48, - 32, - 19, - enemynow - 16, - 70, - 32, - 19 - ); - } - core.drawLine(ctx, 100, 105, 315, 105, '#FFFFFF', 5) - equipInfo.forEach(function (v) { - if (!attack) v.now += v.speed / oneTurn * 215 - let vnow = Math.min(100 + v.now, 315) - ctx.beginPath() - ctx.moveTo(vnow, 100) - ctx.lineTo(vnow + 3, 90) - ctx.lineTo(vnow - 3, 90) - ctx.closePath() + if (heroInfo.now >= 215 && !heroInfo.isAttack) { + heroInfo.isAttack = true; + animateOnAttack("sword", true, () => { + heroInfo.now -= 215; + heroInfo.isAttack = false; + }); + } + if (enemyInfo.now >= 215 && !enemyInfo.isAttack) { + enemyInfo.isAttack = true; + animateOnAttack("sword", false, () => { + enemyInfo.now -= 215; + enemyInfo.isAttack = false; + }); + } + equipInfo.forEach((v) => { + if (v.now >= 215 && !v.isAttack) { + v.isAttack = true; - ctx.fill() + animateOnAttack("sword", true, () => { + v.now -= 215; + v.isAttack = false; + }); + } + }); + }; - core.drawIcon(ctx, - v.id, - vnow - 16, - 64, - 32, - 32) + function animateOnAttack(name, onenemy, callback) { + if (onenemy) { + core.playanimate(name, 290, 160, null, 1, 1, callback); + } else { + core.playanimate(name, 130, 160, null, 1, 1, callback); + } + } - }) - if (!attack) heroInfo.now += heroInfo.speed / oneTurn * 215 - let heronow = Math.min(100 + heroInfo.now, 315) - ctx.beginPath() - ctx.moveTo(heronow, 100) - ctx.lineTo(heronow + 3, 90) - ctx.lineTo(heronow - 3, 90) - ctx.closePath() + this.attackAnimate = function ( + enemyId, + enemyInfo, + damageInfo, + equipInfo = [] + ) { + //参数分别为怪物真实属性,战斗信息,特殊装备(如火焰风衣)属性特殊装备属性为以元组{equipId,oneDamage,speed,now:0}构成的数组(列出每个需要计算的特殊装备,没有则为空数组或不填) + core.lockControl(); + core.clearMap(ctx); + core.status.event.id = "attackAnimate"; + let hero_hp = core.getRealStatusOrDefault(hero, "hp"), + hero_atk = core.getRealStatusOrDefault(hero, "atk"), + hero_def = core.getRealStatusOrDefault(hero, "def"), + hero_spell = core.getRealStatusOrDefault(hero, "spell"), + hero_matk = core.getRealStatusOrDefault(hero, "matk"), + hero_mdef = core.getRealStatusOrDefault(hero, "mdef"), + hero_speed = core.getRealStatusOrDefault(hero, "speed"), + hero_hpmax = core.getRealStatusOrDefault(hero, "hpmax"), + hero_mhp = core.getRealStatusOrDefault(hero, "mhp"); + const heroInfo = { + hp: hero_hp, + hpmax: hero_hpmax, + atk: hero_atk, + def: hero_def, + spell: hero_spell, + mhp: hero_mhp, + matk: hero_matk, + mdef: hero_mdef, + speed: hero_speed, + now: 0, + isAttack: false, + }; + enemyInfo.id = enemyId; + enemyInfo.cls = core.getClsFromId(enemyId); + enemyInfo.name = core.material.enemys[enemyId].name; + enemyInfo.now = 0; + enemyInfo.isAttack = false; + let oneTurn = heroInfo.speed + enemyInfo.speed; + if (equipInfo.length > 0) { + for (let i; i < equipInfo.length - 1; i++) { + equipInfo[i].now = 0; + equipInfo[i].isAttack = false; + oneTurn += equipInfo[i].speed; + } + } + oneTurn *= 25; + let time = 0, + farme = 0; - ctx.fill() - core.drawImage(ctx, - "hero.webp", - 0, - 0, - 32, - 19, - heronow - 16, - 70, - 32, - 19) - - if (heroInfo.now >= 215 && !heroInfo.isAttack) { - heroInfo.isAttack = true; - animateOnAttack("sword", true, () => { - heroInfo.now -= 215 - heroInfo.isAttack = false - - }) - - } - if (enemyInfo.now >= 215 && !enemyInfo.isAttack) { - enemyInfo.isAttack = true - animateOnAttack("sword", false, () => { - enemyInfo.now -= 215 - enemyInfo.isAttack = false - - }) - } - equipInfo.forEach(v => { - if (v.now >= 215 && !v.isAttack) { - v.isAttack = true - - animateOnAttack("sword", true, () => { - v.now -= 215 - v.isAttack = false - - }) - } - }) - }; - - function animateOnAttack(name, onenemy, callback) { - if (onenemy) { - core.playanimate(name, 290, 160, null, 1, 1, callback) - } else { - core.playanimate(name, 130, 160, null, 1, 1, callback) - } - } - - this.attackAnimate = function ( - enemyId, - enemyInfo, - damageInfo, - equipInfo = [] - ) { - //参数分别为怪物真实属性,战斗信息,特殊装备(如火焰风衣)属性特殊装备属性为以元组{equipId,oneDamage,speed,now:0}构成的数组(列出每个需要计算的特殊装备,没有则为空数组或不填) - core.lockControl(); - core.clearMap(ctx); - core.status.event.id = "attackAnimate"; - let hero_hp = core.getRealStatusOrDefault(hero, "hp"), - hero_atk = core.getRealStatusOrDefault(hero, "atk"), - hero_def = core.getRealStatusOrDefault(hero, "def"), - hero_spell = core.getRealStatusOrDefault(hero, "spell"), - hero_matk = core.getRealStatusOrDefault(hero, "matk"), - hero_mdef = core.getRealStatusOrDefault(hero, "mdef"), - hero_speed = core.getRealStatusOrDefault(hero, "speed"), - hero_hpmax = core.getRealStatusOrDefault(hero, "hpmax"), - hero_mhp = core.getRealStatusOrDefault(hero, "mhp"); - const heroInfo = { - hp: hero_hp, - hpmax: hero_hpmax, - atk: hero_atk, - def: hero_def, - spell: hero_spell, - mhp: hero_mhp, - matk: hero_matk, - mdef: hero_mdef, - speed: hero_speed, - now: 0, - isAttack: false - }; - enemyInfo.id = enemyId; - enemyInfo.cls = core.getClsFromId(enemyId); - enemyInfo.name = core.material.enemys[enemyId].name; - enemyInfo.now = 0; - enemyInfo.isAttack = false - let oneTurn = heroInfo.speed + enemyInfo.speed; - if (equipInfo.length > 0) { - for (let i; i < equipInfo.length - 1; i++) { - equipInfo[i].now = 0 - equipInfo[i].isAttack = false - oneTurn += equipInfo[i].speed; - } - } - oneTurn *= 25; - let time = 0, - farme = 0; - - - - core.registerAnimationFrame("attackAnimate", true, (temptime) => { - if (temptime - time > 1000 / 60) { - time = temptime; - this.drawAttackAnimate( - heroInfo, - oneTurn, - enemyInfo, - equipInfo, - farme, - damageInfo - ); - farme++; - } - }); - }; -}, + core.registerAnimationFrame("attackAnimate", true, (temptime) => { + if (temptime - time > 1000 / 60) { + time = temptime; + this.drawAttackAnimate( + heroInfo, + oneTurn, + enemyInfo, + equipInfo, + farme, + damageInfo + ); + farme++; + } + }); + }; + }, "剧情内容": function () { - // 在此增加新插件 - // 每项为一个数组,第一项是名字,第二项是对话内容 - // 回放只会在同一个this下回放,进入剧情前请以事件块声明进入哪个剧情数组 - // 可以自由添加,但不能与已有插件及函数名相同,可以使用中文。 - this.chapter0 = [ - ["", "这些天,街道不曾下雨。"], - ["", "所以,那浸湿地面的,定是那些女孩们流落的鲜血无疑。"], - ["", "我蹲在充斥着铁锈味般恶臭的小巷中,悠闲地如是想着。"], - ["", "扑哧。"], - ["", "耳旁再次响起象征着某个女孩子死去的声音。"], - ["", "再一次——"], - ["", "再一次。"], - ["", "女子们被肢解成单纯的肉块。"], - ["", "我任由流下的血浸满全身,屏住自己的呼吸。"], - ["", "祈求自己能拥有从猎人手中逃脱的幸运。"], - ["", "扑哧。"], - ["", "直到刚才,我们还坐在去往娼馆的马车的路上。"], - ["", "而在这之中的某些人,已经不在这个世上了。"], - ["", "不,应该把“某些”换成“几乎所有”才更为恰当吧。"], - ["", "恐怕,不久之后我也会变成小巷中血腥的装饰品。"], - ["", "我是为了得到这种死法,才辛苦苟活至今的吗?"], - ["", "来个人告诉我啊——"], - ["", "谁都好。"], - ["", "来人啊!!"], - ["少女", "「呃······!?」"], //小动物01 - ["", "漆黑的物体充斥了我的整个视野"], - ["", "我很快意识到,那是只很大的脚。"], - ["", "必须要出声求救。"], - ["", "可是,耳中却只能听到自己的牙关不停交战的声音。"], - ["", "我是如此的无助。"], - ["", "逃跑也好,道歉也罢。"], - ["", "就连抬头看一眼将要杀掉我的人的面孔都做不到。"], - ["少女", "「······被杀」"], //小动物02 - ["", "会被杀。"], - ["", "会被杀!!"], - ["", "来自内心深处的冰冷预感,渐渐地在体内蔓延开来。"], - ["少女", "「不,不要······」"], //小动物03 - ["", "浮游都市,《诺瓦斯·艾蒂尔》。"], - ["", "《特别受灾地区》——"], - ["", "通称,《牢狱》"], - ["", "是被险峻的峭壁环绕,与世隔绝的,都市的最底部。"], - ["年轻人", "「放开我!」"], //龙套1-01 - ["年轻人", "「我只是在帮那个女人而已!」"], //龙套1-02 - ["年轻人", "「你们没听到吗!?」"], //龙套1-03 - ["年轻人", "「她是被受骗才会被卖到娼馆来的」"], //龙套1-04 - ["年轻人", "「用肮脏的手段把钱借给她父母的,就是你们这些家伙吧!?」"], //龙套1-05 - ["年轻人", "「给我说些什么啊」"], //龙套1-06 - ["凯伊姆", "「这些话等到了娼馆再说吧」"], //男主01 - ["凯伊姆", "「我来抓你,只是受雇于人而已」"], //男主02 - ["", "我走进娼馆《莉莉乌姆》的接待室。"], - ["", "正在桌旁整理账簿的奥兹停下手头的工作,抬起头向我看来。"], - ["奥兹", "「这不是凯伊姆先生吗,辛苦了」"], //金锁高官01 - ["奥兹", "「委托已经完成了吗?」"], //金锁高官02 - ["凯伊姆", "「啊啊,是这家伙没错吧」"], //男主03 - ["", "奥兹用只要接触到就能杀人般的眼神在男人脸上搜过。"], - ["奥兹", "「没错,就是这个人」"], //金锁高官03 - ["凯伊姆", "「是么」"], //男主04 - ["年轻人", "「你,你们要对我做什么」"], //龙套1-07 - ["奥兹", "「······」"], //金锁高官04 - ["", "奥兹用一个眼神,就让男人闭上了嘴。"], - ["", "然后,向我这边转过身来。"], - ["奥兹", "「抱歉啊,总是麻烦你去做这些无聊的事」"], //金锁高官05 - ["奥兹", "「都怪我们这边的年轻人太没用」"], //金锁高官06 - ["凯伊姆", "「客套话就免了」"], //男主05 - ["奥兹", "「这还真是失礼了」"], //金锁高官07 - ["奥兹", "「喂,来个人」"], //金锁高官08 - ["光头男人", "「是」"], //龙套2-01 - ["奥兹", "「凯伊姆先生做完工作回来了」"], //金锁高官09 - ["光头男人", "「是,是,那个······」"], //龙套2-02 - ["奥兹", "「我是要你拿些酒来,这个蠢材!」"], //金锁高官10 - ["", "喀!"], - ["", "奥兹扔出的烟灰缸砸中了手下的额头。"], - ["", "鲜血四溅。"], - ["凯伊姆", "「不用这么麻烦」"], //男主06 - ["凯伊姆", "「我接下来要去《菲诺列塔》」"], //男主07 - ["奥兹", "「喔唷」"], //金锁高官11 - ["奥兹", "「既然如此,我就不留您在这里喝难饮的劣质酒了」"], //金锁高官12 - ["", "奥兹斜眼看着正捂住额头呻吟的手下,轻描淡写地说道。"], - ["凯伊姆", "「用这些钱去买药」"], //男主08 - ["", "我将几枚铜钱仍在那个手下的身前。"], - ["奥兹", "「凯伊姆先生,不用对他们这么好」"], //金锁高官13 - ["凯伊姆", "「无妨」"], //男主09 - ["凯伊姆", "「话说回来,那个要落跑的女人呢?」"], //男主10 - ["奥兹", "「我把她交给那些年轻人了,现在应该正在体会人生的严苛吧」"], //金锁高官14 - ["奥兹", "「正好,趁此机会凯伊姆先生也来享受一番如何?」"], //金锁高官15 - ["年轻人", "「你,你们这些家伙,要对她做什么!?」"], //龙套1-08 - ["", "咣!"], - ["", "奥兹给了他一拳。"], - ["", "一击即倒。"], - ["", "喀,咚,咯!"], - ["", "奥兹毫不留情地向男人的脸上踩去。"], - ["年轻人", "「咕······呃咳······」"], //龙套1-09 - ["", "折断的牙齿伴着血泡被吐出。"], - ["", "这份白色在鲜红色的液体中格外显眼。"], - ["年轻人", "「你们以为做出这种事······卫兵会坐视不理吗······」"], //龙套1-10 - ["奥兹", "「啊啊,不会坐视不理的」"], //金锁高官16 - ["奥兹", "「应该会拿出你的钱包,和我们商量如何瓜分吧」"], //金锁高官17 - ["年轻人", "「那,那种事······」"], //龙套1-11 - ["", "这在牢狱是理所当然的事。"], - ["奥兹", "「怎么,头一回来牢狱么?」"], //金锁高官18 - ["", "男人点了点头。"], - ["奥兹", "「为了被骗的女人而来到牢狱,真是个规矩人啊」"], //金锁高官19 - ["奥兹", "「······前提是,被骗的人不是你」"], //金锁高官20 - ["年轻人", "「你说······我被骗了?」"], //龙套1-12 - ["年轻人", "「那,那是怎么回事!?」"], //龙套1-13 - ["奥兹", "「不用急,今天晚上会好好告诉你的」"], //金锁高官21 - ["", "奥兹抓起男人的脸。"], - ["", "为引诱客人的怜悯之心而装纯,是娼妇的惯用手段。"], - ["", "双亲被骗而借钱,结果作为抵押而将自己卖到这里,这是典型的说法。"], - [ - "", - "如果只是头脑发热而成为常客也就罢了,这次的男人热血过头,居然想出了要带女人私奔的计划。", - ], - [ - "", - "虽然女人半开玩笑地予以拒绝,但不知天高地厚的这家伙还是拉着她逃跑了。", - ], - ["", "不过,想要逃脱追击本来就是不可能的任务。"], - ["", "但即便如此,这种事情还是会一再的出现。"], - ["", "说谎的女人和被骗的男人。"], - ["", "在娼馆街,这是令人看到生厌的日常的风景。"], - ["凯伊姆", "「我要走了」"], //男主11 - ["奥兹", "「好的,下次再麻烦您」"], //金锁高官22 - ["奥兹", "「之后吉克先生会将谢礼交给您的」"], //金锁高官23 - ["凯伊姆", "「啊啊」"], //男主12 - ["", "我背向奥兹走出娼馆。"], - ["凯伊姆", "「······?」"], //男主13 - ["", "从远方传来微弱的歌声。"], - ["", "是关卡广场的方向。"], - ["", "对了。"], - ["", "今天有觐见圣女的仪式。"], - ["", "当代的圣女伊莲——"], - ["", "俗称《盲眼之圣女》,据说即使在历代的圣女中,人气也是数一数二的。"], - ["", "广场上的人估计相当多吧。"], - ["", "虽然我也想去看看她长什么样,不过要在人潮中挤来挤去就免了。"], - ["", "还是老老实实去菲诺列塔喝烧酒吧。"], - ["", "正当我这样想着的时候,一个身影自小巷的那头走来。"], - ["凯伊姆", "「艾莉斯」"], //男主14 - ]; - this.chapter01 = [ - ["艾莉斯", "「啊,凯伊姆」"], //医生00.5 - ["艾莉斯", "「正好,我还想要去找你呢」"], //医生01 - ["艾莉斯", "「没想到凯伊姆会主动出现······这是命运吗?」"], //医生02 - ["凯伊姆", "「显然不是吧」"], //男主15 - ["艾莉斯", "「啊,是么」"], //医生03 - ["", "艾莉斯挑了挑整齐的双眉,微微地哼了一声。"], - [ - "", - "虽然是个相当引人注目的美人,但她这个将亲切儿子丢入无底深渊的性格,为自己扣了不少的分", - ], - ["", "给人印象最深的,就是那潭水般的双瞳。"], - ["", "在漆黑的瞳孔中,完全看不出感情的波动。"], - ["艾莉斯", "「喜欢我的眼睛吗?」"], //医生04 - ["艾莉斯", "「如果想要的话就给你吧?」"], //医生05 - ["凯伊姆", "「用不着」"], //男主16 - ["艾莉斯", "「阿拉,可惜」"], //医生06 - ["凯伊姆", "「那么,找我有什么事」"], //男主17 - ["艾莉斯", "「梅尔特的钱好像被偷了」"], //医生07 - ["凯伊姆", "「钱被偷了?都几岁了还这么没用」"], //男主18 - ["艾莉斯", "「不要对我说啊」"], //医生08 - ["凯伊姆", "「那家伙,该不会说要让我去抓那个小偷吧?」"], //男主19 - ["艾莉斯", "「就是这样」"], //医生09 - ["凯伊姆", "「笨蛋吗」"], //男主20 - ["凯伊姆", "「如果是小钱的话,就当做是买个教训吧」"], //男主21 - ["艾莉斯", "「说起来,被盗的是这个月的上纳金」"], //医生10 - ["凯伊姆", "「你说什么?」"], //男主22 - ["艾莉斯", "「用这些钱买教训,也太过奢侈了呢」"], //医生11 - ["凯伊姆", "「知道了,我去找」"], //男主23 - ["凯伊姆", "「小偷的特征呢」"], //男主24 - ["艾莉斯", "「男孩子」"], //医生12 - ["艾莉斯", "「······而且,背后有翅膀」"], //医生13 - ["艾莉斯", "「虽然姑且是藏在身后,但是仔细观察的话是很明显的」"], //医生14 - ["凯伊姆", "「羽化病吗」"], //男主25 - [ - "艾莉斯", - "「那些人可是毫不留情的,所以即使是为了那个孩子,也要赶快抓到他」", - ], //医生15 - ["凯伊姆", "「注意到他逃窜的方向了吗?」"], //男主26 - ["艾莉斯", "「广场那边」"], //医生16 - ["艾莉斯", "「虽然刚才《不蚀金锁》的人去追了,不过多半是······」"], //医生17 - ["凯伊姆", "「偏偏还是广场吗」"], //男主28 - ["艾莉斯", "「今天是觐见圣女大人的日子」"], //医生18 - ["凯伊姆", "「我知道」"], //男主29 - ["凯伊姆", "「尽量找找看就好」"], //男主30 - ]; - this.chapter02 = [ - ["不蚀金锁成员", "「凯伊姆先生,凯伊姆先生」"], - ["不蚀金锁成员", "「您已经和艾莉斯大夫见过面了吗?」"], - ["凯伊姆", "「啊啊,所以才会追过来的」"], //男主31 - ["凯伊姆", "「看到小偷了吗?」"], //男主32 - [ - "不蚀金锁成员", - "「没有,他向广场那边逃了过去,今天这么拥挤,我们也只能放弃了」", - ], - [ - "不蚀金锁成员", - "「不过,我也只是刚好在店里所以才追了过去,并不是受人所托」", - ], - ["不蚀金锁成员", "「我已经准备撤退了」"], - ["不蚀金锁成员", "「凯伊姆先生还要继续追吗?」"], - ["凯伊姆", "「啊啊」"], //男主33 - ["", "做完情报交换之后,我跟男人道别。"], - ["凯伊姆", "「和我想的一样啊······」"], //男主34 - ["", "在牢狱中最大的广场上,聚集着看不到尽头的人群。"], - ["", "就算是来参见圣女祈祷,这人数也太多了点吧。"], - ["", "自然,我也找不到逃跑的孩子。"], - ["", "是混杂到人群中了吧。"], - ["", "如果已经从广场上脱身了的话,就更难发现了。"], - ["", "只好赌他还在这里了。"], - ["", "我先移动到了一个视野良好的地方。"], - ["", "从这里,一眼就可以看到人群的变化。"], - ["", "广场还是沸腾起来。"], - ["", "抬头望去,原来是在天台之上出现了一个人影"], - ["", "但是,与周围的期待不同,现身的是一名中年的神官。"], - ["", "骂声四溢。"], - ["", "神官则是笑着摆正衣领"], - ["神官", "「从现在开始,举行谒见的仪式」"], - [ - "神官", - "「在参见那位大人之前,我希望牢狱的诸位再次思考这个《诺瓦斯·艾蒂尔》存在的意义······」", - ], - [ - "神官", - "「初代圣女伊莲大人,便是也难怪这崇高的祈祷之力,令《诺瓦斯·艾蒂尔》浮在空中,拯救了我们的祖先」", - ], - [ - "神官", - "「这之后的几百年来,传承了初代大人力量的历代圣女伊莲大人,让这里留在了空中」", - ], - [ - "神官", - "「这座都市是被圣女大人守护的人类最后的圣域,而我们则是被选召的虔诚的信徒」", - ], - ["神官", "「怀着对圣女的感激祈祷吧,感谢圣女伊莲吧!并献上祈祷!」"], - ["圣女", "「不忘感谢与祈祷,神才会拯救我们」"], - ["圣女", "「与我一起,向神虔诚地祈祷吧」"], - ["", "广场上欢声雷动。"], - ["", "圣女没有回应喧嚣的人声,而是静静地合上双眼面向广场。"], - ["", "虽然感觉有些冷淡,但总比像个傻瓜似的笑着向这群人挥手要强。"], - ["", "她掌握着这条街道,还有在这条街上生活的人的命运。"], - ["", "比起揽得人气,她更想要为了街道的继续存在而献出全力。"], - ["", "也是为了不让《大崩落》的惨剧再度发生。"], - ["", "十几年前的那场悲剧。"], - [ - "", - "虽然在我脑海中的记忆已经相当模糊,但哪怕只是稍有触及,不快的感觉都会在胸口蔓延开。", - ], - ["凯伊姆", "「······」"], //男主35 - ["", "这时我才想起,现在不是我在这里看圣女的时候。"], - ["女声", "「——っ!?」"], - ["围观的女人", "「羽,羽化病人!?」"], - ["围观的中年人", "「喂,谁去叫下羽狩」"], - ["惊慌的观众", "「你这家伙不要靠近我,要是传染了可怎么办」"], - ["粗鲁的观众", "「你这小鬼赶快滚开」"], - ["凯伊姆", "「接下来」"], - ["圣女", "「发生什么事了?看上去似乎很嘈杂」"], - ["随从", "「似乎是某个人逃跑了······具体的我也不是很清楚」"], - ["神官", "「圣女大人,继续待在天台上可能会出事,请您先回到室内吧」"], - ["圣女", "「不用在意我,比起那个,我更关心究竟发生了什么事」"], - ["神官", "「对不起,我真的不知道」"], - ["圣女", "「······是吗」"], - ["男", "「恕我僭越,请准许我说明情况」"], - ["男", "「在来觐见的人群中出现了《羽化病》的患者」"], - ["男", "「围观的人群因而产生了骚动」"], - [ - "男", - "「现在,《防疫局》已经派遣了部队。我想不久之后,他们就会安静下来了」", - ], - ["圣女", "「羽化病······」"], - ["男", "「怎么了?」"], - ["圣女", "「没什么」"], - ["圣女", "「辛苦了,你的名字是?」"], - ["男", "「属下是在防疫局任职的,鲁基乌斯· 迪斯·米利尤」"], - ["神官", "「噢噢,阁下就是鲁基乌斯卿吗,我听说过你的传闻」"], - ["神官", "「阁下是在工作上相当出色的人呢」"], - ["鲁基乌斯", "「不敢当」"], - [ - "鲁基乌斯", - "「话说回来,这次是属下警备工作的失职。让圣女大人见到这不成体统的一面,请您见谅」", - ], - [ - "圣女", - "「即使是目不见物的我,也能感受到聚集于此的民众数量之多。警备工作难以展开也在情理之中」", - ], - ["鲁基乌斯", "「属下不胜惶恐」"], - ["鲁基乌斯", "「接下来属下还要回到工作岗位上,在这里就先告退了」"], - ["圣女", "「鲁基乌斯先生」"], - ["鲁基乌斯", "「属下在」"], - ["圣女", "「你是怎样看待羽狩的工作的呢?」"], - ["神官", "「圣,圣女大人」"], - [ - "鲁基乌斯", - "「防疫局的工作是国王陛下赐予的重要职务。属下非常荣幸能够为这个都市的繁荣尽一份微薄之力」", - ], - ["神官", "「不,不亏是鲁基乌斯卿,相当优秀的想法」"], - ["圣女", "「是吗。辛苦你了」"], - ["随从", "「圣女大人······」"], - ["鲁基乌斯", "「······」"], - ["鲁基乌斯", "「那么,属下就回岗位去了」"], - ]; - this.chapter03 = [ - ["", "从羽化病的少年纷乱的足音中,可以听得出相当的疲劳。"], - ["", "显然,他并没有想到我会捷足先登吧。"], - ["", "少年惶恐地回头看了一眼后,微微露出安心的表情,双手拄在膝盖上。。"], - ["凯伊姆", "「辛苦你了」"], //男主37 - ["羽化病患少年", "「稀!?」"], - ["凯伊姆", "「逃到贫民区是个不错的想法」"], //男主38 - ["羽化病患少年", "「你,你是,羽狩吗?」"], - ["凯伊姆", "「不是」"], //男主39 - ["羽化病患少年", "「什,什么啊······混蛋,不要吓我啊」"], - ["凯伊姆", "「我对令你受惊这件事致以歉意」"], //男主40 - ["凯伊姆", "「作为回报,麻烦你把从店里偷的钱交出来吧」"], //男主41 - ["羽化病患少年", "「钱?你在说什么」"], - ["凯伊姆", "「你要找的腰上的东西,掉在你身后了」"], //男主42 - ["羽化病患少年", "「哎?」"], - ["羽化病患少年", "「呃呀」"], - ["羽化病患少年", "「你······你这混蛋」"], - ["凯伊姆", "「······」"], //男主43 - ["凯伊姆", "「把偷的钱交出来」"], //男主44 - ["羽化病患少年", "「我不知道你在······咕」"], - ["羽化病患少年", "「你,你说是我偷的······有什么证据吗」"], - ["凯伊姆", "「你还挺倔的啊」"], //男主45 - ["凯伊姆", "「不过,给我听好了」"], //男主46 - ["凯伊姆", "「你偷的那些钱,是要上缴给《不蚀金锁》的上纳金」"], //男主47 - ["凯伊姆", "「而且,钱的主人是从前和吉克颇有渊源的女人」"], //男主48 - ["羽化病患少年", "「吉克?」"], - ["凯伊姆", "「他是《不蚀金锁》的主人,这么说你就明白了吧」"], //男主49 - ["羽化病患少年", "「哎?哎?怎么会······」"], - ["凯伊姆", "「再问你一遍,钱在哪里?」"], //男主50 - ["羽化病患少年", "「是,是,是,在我的怀里」"], - ["凯伊姆", "「你没有擅自拿掉一部分吧」"], //男主51 - ["羽化病患少年", "「是,是的」"], - ["羽化病患少年", "「那,那个,您是《不蚀金锁》的人吗?」"], - ["凯伊姆", "「算是吧」"], //男主52 - ["羽化病患少年", "「我什么都可以做,请您一定要帮帮我」"], - ["凯伊姆", "「抱歉,我并没有兴趣去帮助他人」"], //男主53+54 - ["羽化病患少年", "「我什么······什么,都会做的······」"], - ["羽化病患少年", "「我一直都是生活在下层的」"], - [ - "羽化病患少年", - "「可是,不知何时染上了羽化病······背后长出了翅膀······」", - ], - ["羽化病患少年", "「被寄宿工作的店赶了出来,只得流落到牢狱这里」"], - ["羽化病患少年", "「因为独自实在是饿的不行了,所以才会偷这些钱的」"], - [ - "羽化病患少年", - "「我明明没有做任何坏事······为什么······会遇到这种事······」", - ], - ["凯伊姆", "「谁知道」"], //男主55 - ["羽化病患少年", "「呜······呜呜······接下来,要对我做什么?」"], - ["凯伊姆", "「我要把你带到组织那里」"], //男主56 - ["羽化病患少年", "「怎,怎么这样」"], - ["凯伊姆", "「不过,那样做的前提是你不是羽化病人」"], - ["凯伊姆", "「组织也没有笨到把羽化病人招待到家里的程度」"], - ["羽化病患少年", "「那么,是要放我逃走吗?」"], - ["凯伊姆", "「我要让你学到教训」"], - ["凯伊姆", "「如果换做是组织的制裁,至少要有断条胳膊的觉悟」"], - ["凯伊姆", "「你的运气不错」"], - ["羽化病患少年", "「唔······啊,是的······」"], - ["凯伊姆", "「滚」"], - ["羽化病患少年", "「非常感谢」"], - ["羽化病患少年", "「唔啊!?」"], - ["男", "「到这里就结束了,羽化病人」"], - ["男", "「确认他的翅膀」"], - ["", "趁还没有被卷入麻烦的事情之前,赶快离开这里吧"], - ["羽狩的队长", "「那边的那个人」"], - ["凯伊姆", "「······有什么事?」"], - ["羽狩的队长", "「可以稍微让我问几句话吗」"], - ["凯伊姆", "「······」"], - ["凯伊姆", "「啊啊,无妨」"], - ["羽狩的队长", "「感谢您的合作」"], - ["", "队长殷勤地致以谢礼。"], - ["", "而在他的眼前,少年的衣服已经被他的补下们扯破。"], - ["", "在瘦骨嶙峋的裸露后背上,长有纯白的羽翼。"], - ["红发的羽狩", "「副队长,确认翅膀的持有了」"], - ["羽狩的副队长", "「保护他」"], - ["羽化病患少年", "「不要······请原谅,我······」"], - [ - "羽狩的副队长", - "「我们只是要带你去治愈院治疗羽化病,不是什么应该感到害怕的事情」", - ], - ["羽化病患少年", "「可是,可是」"], - ["羽狩的副队长", "「没关系的」"], - ["羽化病患少年", "「······哥,哥哥」"], - ["羽狩的副队长", "「你是羽化病人的亲属吗?」"], - ["凯伊姆", "「只是路人而已」"], - ["凯伊姆", "「顺带一提,我也没有打算找你们的麻烦」"], - [ - "羽狩的副队长", - "「前几天,有个和你说了同样的话的人,在我们背向他的瞬间对我们发动了袭击」", - ], - ["羽狩的副队长", "「我的一个部下就此永久失去了半截胳膊」"], - ["凯伊姆", "「我表示同情」"], - ["凯伊姆", "「我马上就会消失的,这样就没问题了吧?」"], - ["羽狩的副队长", "「嘛,不要这么慌张」"], - ["", "副队长看着羽化的少年。"], - ["羽狩的副队长", "「你与这个人是什么关系?没有被他殴打吗?」"], - ["羽化病患少年", "「没,没有」"], - [ - "羽狩的副队长", - "「如何对我们保持合作,你就可以在治愈院得到优先的治疗」", - ], - ["羽化病患少年", "「······」"], - ["羽化病患少年", "「那个人,是《不蚀金锁》的组织成员······」"], - ["羽化病患少年", "「突然说让我拿出钱来,我刚一拒绝他就打我」"], - ["羽狩的副队长", "「原来如此······」"], - [ - "羽狩的副队长", - "「那位少年说你是《不蚀金锁》的一员,不知此事是否属实?」", - ], - ["凯伊姆", "「当然不是」"], - ["凯伊姆", "「我只是从那里接受工作而已,并不是他们的成员」"], - ["羽狩的副队长", "「你的意思是说,少年在说谎吗?」"], - ["凯伊姆", "「啊啊」"], - [ - "凯伊姆", - "「如果你们和组织有关系的话,只要问问我是不是那里的成员就能明白事实了吧」", - ], - ["羽狩的副队长", "「就算我去询问,也无法从他们那里得到事实」"], - [ - "羽狩的副队长", - "「《不蚀金锁》的那些人一向都不对我们合作,我对此深感困扰」", - ], - ["凯伊姆", "「真是辛苦啊」"], - ["羽狩的副队长", "「说的是啊」"], - ["羽狩的副队长", "「其实,砍下我部下胳膊的似乎也是组织的成员呢」"], - [ - "羽狩的副队长", - "「无需如此警戒,我只是想在看守所向你咨询一些事情而已」", - ], - [ - "羽狩的副队长", - "「如果能够知晓牢狱与组织的事情,我们也可以尽可能地对更多的羽化病人进行保护」", - ], - ["羽狩的副队长", "「那和整条街道的和平也是紧密相关的吧?」"], - ["凯伊姆", "「我知道,你们有逮捕干扰狩猎羽化病人的权力」"], - [ - "凯伊姆", - "「但是,我没有对你们做出任何干扰,为什么要对我如此纠缠不休呢」", - ], - ["羽狩的副队长", "「那些话,我们会在看守所对你详细说明的」"], - ["凯伊姆", "「······」"], - ["", "在这里起争执的话,就会被羽狩加害。"], - ["", "就算能从这里脱身,今后只要碰面就会产生纠纷也是摆明的事情。"], - ["", "就算逃跑,也没有好的结果。"], - ["", "正当我想要打圆场的时候,刚才的气氛一瞬间产生了转变。"], - ["", "发生了什么事······"], - ["???", "「我认为,那位先生是正确的」"], - ["", "羽狩们一起回头。"], - ["", "而在他们视线的焦点处,"], - ["", "伫立着一位女性。"], - ["", "在端正的容颜下,代表着强烈意志的双眉十分显眼。"], - ["", "身体的柔软与紧紧包裹在其身上的羽狩制服,两者显得十分的不搭配。"], - ["", "我还是第一次看到女性的羽狩。"], - ["羽狩的副队长", "「队长,这是获得《不蚀金锁》情报的好机会」"], - [ - "羽狩的队长", - "「兰格副队长,就算是为了获得情报,也不能做出恫吓的发言啊」", - ], - ["兰格副队长", "「我并没有打算去恫吓他······」"], - ["羽狩的队长", "「告诉我那个被砍掉胳膊的队员的名字」"], - ["羽狩的队长", "「我会去探望他的」"], - ["兰格副队长", "「那个是······」"], - ["羽狩的队长", "「我知道,你一直在为有所收获而努力工作」"], - ["羽狩的队长", "「但是,正因为我们的工作是为民众提供帮助」"], - ["羽狩的队长", "「所以就更不能损害人与人之间的信赖」"], - ["兰格副队长", "「我会铭记在心」"], - ["羽狩的队长", "「这位先生,我的部下失礼了」"], - ["凯伊姆", "「只要不对我再来一次就好」"], - ["羽狩的队长", "「请稍等」"], - ["凯伊姆", "「有什么事?」"], - ["羽狩的队长", "「我想确认一件事」"], - ["羽狩的队长", "「你真的不是《不蚀金锁》的成员吗?」"], - ["凯伊姆", "「真的」"], - ["凯伊姆", "「如果我说是的话,你有什么打算?」"], - ["羽狩的队长", "「我听过传闻,说他们是用依靠暴力而得的钱在生活」"], - ["凯伊姆", "「······这样啊」"], - ["凯伊姆", "「如果能有收获就好了啊」"], - ]; - this.chapter04 = [ - ["梅尔特", "「欢迎光临」"], - ["梅尔特", "「辛苦了」"], - ["梅尔特", "「抱歉,又拜托给你了个这么麻烦的工作」"], - ["凯伊姆", "「没什么,比想象中完成的更容易」"], - ["梅尔特", "「那就好」"], - ["梅尔特", "「这是我的一点谢意」"], - ["凯伊姆", "「味道有些变化啊」"], - ["梅尔特", "「啊,被发现了?」"], - ["梅尔特", "「最近,没能到手什么好的原料呢」"], - ["凯伊姆", "「去拜托吉克如何?」"], - [ - "梅尔特", - "「话是这么说,但是总不能用店里采购的这种小事去麻烦他吧······」", - ], - ["凯伊姆", "「那希望你也不要来麻烦我」"], - ["梅尔特", "「那 是 两 码 事」"], - ["梅尔特", "「再说,凯伊姆是靠着工作来生活的吧」"], - [ - "梅尔特", - "「而且,自己的钱被偷了这么害羞的事,向凯伊姆意外的其他人都说不出口」", - ], - ["凯伊姆", "「反正,也已经传到吉克的耳朵里了」"], - ["梅尔特", "「这是面子问题啊,面子问题」"], - ["凯伊姆", "「嘛,算了」"], - ["凯伊姆", "「这样就好了吧?」"], - ["梅尔特", "「这是钱包呢」"], - ["梅尔特", "「嗯,东西没少」"], - ["梅尔特", "「太好啦—这个月的上纳金,我可全部都放在里面了呢」"], - ["梅尔特", "「如果没有找到的话,说不定就又会被送到娼馆里了呢」"], - ["凯伊姆", "「在那边不是来钱更快吗?」"], - ["梅尔特", "「阿拉,你是在说我还能有魅力吗?」"], - ["凯伊姆", "「这是客套话而已」"], - ["梅尔特", "「欺负人」"], - ["梅尔特", "「总而言之,今天帮大忙了」"], - ["梅尔特", "「谢礼嘛······」"], - ["凯伊姆", "「就记在账单上吧」"], - ["梅尔特", "「了解—盛谢惠顾了哦?」"], - ["", "喀啷喀啷"], - ["", "门铃响起"], - ["", "喧哗瞬间安静下来。"], - ["", "进来的人是吉克。"], - ["", "是掌控着牢狱的组织之一,《不蚀金锁》的头目。"], - ["", "不仅组织的成员,就连店内一般的客人也对他以注目礼表示敬意。"], - ["吉克", "「各位继续吧」"], - ["", "仿佛停滞的时钟重新转动了一般,店内恢复了热闹的气氛。"], - ["吉克", "「抱歉,今天拜托你去做了无聊的工作」。"], - ["凯伊姆", "「不用介意」"], - ["", "吉克轻轻点了点头,在我右边坐了下来"], - ["凯伊姆", "「逃跑的男人怎么样了?」"], - ["吉克", "「嗯?已经不在这个世上了」。"], - ["吉克", "「有什么想要知道的事吗?」"], - ["凯伊姆", "「不,没什么」"], - ["吉克", "「那个无聊的家伙,完全没有趣味呢」"], - ["吉克", "「真希望他也替我负责清扫的部下也考虑考虑」"], - ["凯伊姆", "「真是灾难啊」"], - ["吉克", "「比起那个,我听说了哦。你去追羽化病人了啊」"], - ["凯伊姆", "「消息真灵通」"], - ["吉克", "「梅尔特也注意点」"], - ["吉克", "「你丢钱已经不是一回两回了」"], - ["梅尔特", "「好的—我会注意的。」"], - ["梅尔特", "「吉克还是平常的点单吧」"], - ["梅尔特", "「凯伊姆要再来一杯吗?」"], - ["", "我们用眼神点头示意后,梅尔特开始准备起酒来。"], - ["", "悠然地吐出眼圈后,吉克取出一个纸包放在柜台上。"], - ["吉克", "「这是抓捕逃跑男人的报酬」"], - ["凯伊姆", "「下次有什么事再告诉我」"], - ["梅尔特", "「来,久等了」"], - ["凯伊姆", "「话说回来梅尔特,为什么会被那种孩子偷到钱?」"], - ["吉克", "「让我猜猜看」"], - ["吉克", "「是那个吧,看某个特立独行的男人入迷了,所以就有了空隙?」"], - ["梅尔特", "「可惜—」"], - ["梅尔特", "「事实恰恰相反,是那家伙一直在纠缠我」"], - ["凯伊姆", "「完全把你当成新进的女佣了么」"], - ["梅尔特", "「我从前可是很有名的,不会被当成这种下人吧」"], - ["梅尔特", "「······而且,我没法对对我这么钟情的人发火啊」"], - ["凯伊姆&吉克", "「你傻啊」"], - ["梅尔特", "「异口同声呢,不亏是兄弟」"], - ["凯伊姆", "「别用这种称呼,怪恶心的」"], - ["吉克", "「说得没错」"], - ["吉克", "「······说起来······」"], - ["梅尔特", "「怎么了?」"], - ["吉克", "「有件事我一直很在意,我和凯伊姆,哪个是哥哥啊?」"], - ["凯伊姆", "「你也说这么无聊的话题」"], - ["吉克", "「不,这是很重要的事情」"], - ["吉克", "「梅尔特,事实是怎么样的?」"], - ["梅尔特", "「啊~是怎么样的呢~」"], - ["梅尔特", "「我忘记了」"], - ["吉克", "「骗人」"], - ]; -} + // 在此增加新插件 + // 每项为一个数组,第一项是名字,第二项是对话内容 + // 回放只会在同一个this下回放,进入剧情前请以事件块声明进入哪个剧情数组 + // 可以自由添加,但不能与已有插件及函数名相同,可以使用中文。 + this.chapter0 = [ + ["", "这些天,街道不曾下雨。"], + ["", "所以,那浸湿地面的,定是那些女孩们流落的鲜血无疑。"], + ["", "我蹲在充斥着铁锈味般恶臭的小巷中,悠闲地如是想着。"], + ["", "扑哧。"], + ["", "耳旁再次响起象征着某个女孩子死去的声音。"], + ["", "再一次——"], + ["", "再一次。"], + ["", "女子们被肢解成单纯的肉块。"], + ["", "我任由流下的血浸满全身,屏住自己的呼吸。"], + ["", "祈求自己能拥有从猎人手中逃脱的幸运。"], + ["", "扑哧。"], + ["", "直到刚才,我们还坐在去往娼馆的马车的路上。"], + ["", "而在这之中的某些人,已经不在这个世上了。"], + ["", "不,应该把“某些”换成“几乎所有”才更为恰当吧。"], + ["", "恐怕,不久之后我也会变成小巷中血腥的装饰品。"], + ["", "我是为了得到这种死法,才辛苦苟活至今的吗?"], + ["", "来个人告诉我啊——"], + ["", "谁都好。"], + ["", "来人啊!!"], + ["少女", "「呃······!?」", "aiy010000010.opus"], //小动物01 + ["", "漆黑的物体充斥了我的整个视野"], + ["", "我很快意识到,那是只很大的脚。"], + ["", "必须要出声求救。"], + ["", "可是,耳中却只能听到自己的牙关不停交战的声音。"], + ["", "我是如此的无助。"], + ["", "逃跑也好,道歉也罢。"], + ["", "就连抬头看一眼将要杀掉我的人的面孔都做不到。"], + ["少女", "「······被杀」", "aiy010000020.opus"], //小动物02 + ["", "会被杀。"], + ["", "会被杀!!"], + ["", "来自内心深处的冰冷预感,渐渐地在体内蔓延开来。"], + ["少女", "「不,不要······」", "aiy010000030.opus"], //小动物03 + ["", "浮游都市,《诺瓦斯·艾蒂尔》。"], + ["", "《特别受灾地区》——"], + ["", "通称,《牢狱》"], + ["", "是被险峻的峭壁环绕,与世隔绝的,都市的最底部。"], + ["年轻人", "「放开我!」", "aiy710000010.opus"], //龙套1-01 + ["年轻人", "「我只是在帮那个女人而已!」", "aiy710000020.opus"], //龙套1-02 + ["年轻人", "「你们没听到吗!?」", "aiy710000030.opus"], //龙套1-03 + ["年轻人", "「她是被受骗才会被卖到娼馆来的」", "aiy710000040.opus"], //龙套1-04 + [ + "年轻人", + "「用肮脏的手段把钱借给她父母的,就是你们这些家伙吧!?」", + "aiy710000050.opus", + ], //龙套1-05 + ["年轻人", "「给我说些什么啊」", "aiy710000060.opus"], //龙套1-06 + ["凯伊姆", "「这些话等到了娼馆再说吧」", "aiy310000010.opus"], //男主01 + ["凯伊姆", "「我来抓你,只是受雇于人而已」", "aiy310000020.opus"], //男主02 + ["", "我走进娼馆《莉莉乌姆》的接待室。"], + ["", "正在桌旁整理账簿的奥兹停下手头的工作,抬起头向我看来。"], + ["奥兹", "「这不是凯伊姆先生吗,辛苦了」", "aiy350000010.opus"], //金锁高官01 + ["奥兹", "「委托已经完成了吗?」", "aiy350000020.opus"], //金锁高官02 + ["凯伊姆", "「啊啊,是这家伙没错吧」", "aiy310000030.opus"], //男主03 + ["", "奥兹用只要接触到就能杀人般的眼神在男人脸上搜过。"], + ["奥兹", "「没错,就是这个人」", "aiy350000030.opus"], //金锁高官03 + ["凯伊姆", "「是么」", "aiy310000040.opus"], //男主04 + ["年轻人", "「你,你们要对我做什么」", "aiy710000070.opus"], //龙套1-07 + ["奥兹", "「······」", "aiy350000040.opus"], //金锁高官04 + ["", "奥兹用一个眼神,就让男人闭上了嘴。"], + ["", "然后,向我这边转过身来。"], + ["奥兹", "「抱歉啊,总是麻烦你去做这些无聊的事」", "aiy350000050.opus"], //金锁高官05 + ["奥兹", "「都怪我们这边的年轻人太没用」", "aiy350000060.opus"], //金锁高官06 + ["凯伊姆", "「客套话就免了」", "aiy310000050.opus"], //男主05 + ["奥兹", "「这还真是失礼了」", "aiy350000070.opus"], //金锁高官07 + ["奥兹", "「喂,来个人」", "aiy350000080.opus"], //金锁高官08 + ["光头男人", "「是」", "aiy820000010.opus"], //龙套2-01 + ["奥兹", "「凯伊姆先生做完工作回来了」", "aiy350000090.opus"], //金锁高官09 + ["光头男人", "「是,是,那个······」", "aiy820000020.opus"], //龙套2-02 + ["奥兹", "「我是要你拿些酒来,这个蠢材!」", "aiy350000100.opus"], //金锁高官10 + ["", "喀!"], + ["", "奥兹扔出的烟灰缸砸中了手下的额头。"], + ["", "鲜血四溅。"], + ["凯伊姆", "「不用这么麻烦」", "aiy310000060.opus"], //男主06 + ["凯伊姆", "「我接下来要去《菲诺列塔》」", "aiy310000070.opus"], //男主07 + ["奥兹", "「喔唷」", "aiy350000110.opus"], //金锁高官11 + [ + "奥兹", + "「既然如此,我就不留您在这里喝难饮的劣质酒了」", + "aiy350000120.opus", + ], //金锁高官12 + ["", "奥兹斜眼看着正捂住额头呻吟的手下,轻描淡写地说道。"], + ["凯伊姆", "「用这些钱去买药」", "aiy310000080.opus"], //男主08 + ["", "我将几枚铜钱仍在那个手下的身前。"], + ["奥兹", "「凯伊姆先生,不用对他们这么好」", "aiy350000130.opus"], //金锁高官13 + ["凯伊姆", "「无妨」", "aiy310000090.opus"], //男主09 + ["凯伊姆", "「话说回来,那个要落跑的女人呢?」", "aiy310000100.opus"], //男主10 + [ + "奥兹", + "「我把她交给那些年轻人了,现在应该正在体会人生的严苛吧」", + "aiy350000140.opus", + ], //金锁高官14 + [ + "奥兹", + "「正好,趁此机会凯伊姆先生也来享受一番如何?」", + "aiy350000150.opus", + ], //金锁高官15 + ["年轻人", "「你,你们这些家伙,要对她做什么!?」", "aiy710000080.opus"], //龙套1-08 + ["", "咣!"], + ["", "奥兹给了他一拳。"], + ["", "一击即倒。"], + ["", "喀,咚,咯!"], + ["", "奥兹毫不留情地向男人的脸上踩去。"], + ["年轻人", "「咕······呃咳······」", "aiy710000090.opus"], //龙套1-09 + ["", "折断的牙齿伴着血泡被吐出。"], + ["", "这份白色在鲜红色的液体中格外显眼。"], + [ + "年轻人", + "「你们以为做出这种事······卫兵会坐视不理吗······」", + "aiy710000100.opus", + ], //龙套1-10 + ["奥兹", "「啊啊,不会坐视不理的」", "aiy350000160.opus"], //金锁高官16 + [ + "奥兹", + "「应该会拿出你的钱包,和我们商量如何瓜分吧」", + "aiy350000170.opus", + ], //金锁高官17 + ["年轻人", "「那,那种事······」", "aiy710000110.opus"], //龙套1-11 + ["", "这在牢狱是理所当然的事。"], + ["奥兹", "「怎么,头一回来牢狱么?」", "aiy350000180.opus"], //金锁高官18 + ["", "男人点了点头。"], + [ + "奥兹", + "「为了被骗的女人而来到牢狱,真是个规矩人啊」", + "aiy350000190.opus", + ], //金锁高官19 + ["奥兹", "「······前提是,被骗的人不是你」", "aiy350000200.opus"], //金锁高官20 + ["年轻人", "「你说······我被骗了?」", "aiy710000120.opus"], //龙套1-12 + ["年轻人", "「那,那是怎么回事!?」", "aiy710000130.opus"], //龙套1-13 + ["奥兹", "「不用急,今天晚上会好好告诉你的」", "aiy350000210.opus"], //金锁高官21 + ["", "奥兹抓起男人的脸。"], + ["", "为引诱客人的怜悯之心而装纯,是娼妇的惯用手段。"], + ["", "双亲被骗而借钱,结果作为抵押而将自己卖到这里,这是典型的说法。"], + [ + "", + "如果只是头脑发热而成为常客也就罢了,这次的男人热血过头,居然想出了要带女人私奔的计划。", + ], + [ + "", + "虽然女人半开玩笑地予以拒绝,但不知天高地厚的这家伙还是拉着她逃跑了。", + ], + ["", "不过,想要逃脱追击本来就是不可能的任务。"], + ["", "但即便如此,这种事情还是会一再的出现。"], + ["", "说谎的女人和被骗的男人。"], + ["", "在娼馆街,这是令人看到生厌的日常的风景。"], + ["凯伊姆", "「我要走了」", "aiy310000110.opus"], //男主11 + ["奥兹", "「好的,下次再麻烦您」", "aiy350000220.opus"], //金锁高官22 + ["奥兹", "「之后吉克先生会将谢礼交给您的」", "aiy350000230.opus"], //金锁高官23 + ["凯伊姆", "「啊啊」", "aiy310000120.opus"], //男主12 + ["", "我背向奥兹走出娼馆。"], + ["凯伊姆", "「······?」", "aiy310000130.opus"], //男主13 + ["", "从远方传来微弱的歌声。"], + ["", "是关卡广场的方向。"], + ["", "对了。"], + ["", "今天有觐见圣女的仪式。"], + ["", "当代的圣女伊莲——"], + ["", "俗称《盲眼之圣女》,据说即使在历代的圣女中,人气也是数一数二的。"], + ["", "广场上的人估计相当多吧。"], + ["", "虽然我也想去看看她长什么样,不过要在人潮中挤来挤去就免了。"], + ["", "还是老老实实去菲诺列塔喝烧酒吧。"], + ["", "正当我这样想着的时候,一个身影自小巷的那头走来。"], + ["凯伊姆", "「艾莉斯」", "aiy310000140.opus"], //男主14 + ]; + this.chapter01 = [ + ["艾莉斯", "「啊,凯伊姆」", "aiy020000005.opus"], //医生00.5 + ["艾莉斯", "「正好,我还想要去找你呢」", "aiy020000010.opus"], //医生01 + [ + "艾莉斯", + "「没想到凯伊姆会主动出现······这是命运吗?」", + "aiy020000020.opus", + ], //医生02 + ["凯伊姆", "「显然不是吧」", "aiy310000150.opus"], //男主15 + ["艾莉斯", "「啊,是么」", "aiy020000030.opus"], //医生03 + ["", "艾莉斯挑了挑整齐的双眉,微微地哼了一声。"], + [ + "", + "虽然是个相当引人注目的美人,但她这个将亲切儿子丢入无底深渊的性格,为自己扣了不少的分", + ], + ["", "给人印象最深的,就是那潭水般的双瞳。"], + ["", "在漆黑的瞳孔中,完全看不出感情的波动。"], + ["艾莉斯", "「喜欢我的眼睛吗?」", "aiy020000040.opus"], //医生04 + ["艾莉斯", "「如果想要的话就给你吧?」", "aiy020000050.opus"], //医生05 + ["凯伊姆", "「用不着」", "aiy310000160.opus"], //男主16 + ["艾莉斯", "「阿拉,可惜」", "aiy020000060.opus"], //医生06 + ["凯伊姆", "「那么,找我有什么事」", "aiy310000170.opus"], //男主17 + ["艾莉斯", "「梅尔特的钱好像被偷了」", "aiy020000070.opus"], //医生07 + ["凯伊姆", "「钱被偷了?都几岁了还这么没用」", "aiy310000180.opus"], //男主18 + ["艾莉斯", "「不要对我说啊」", "aiy020000080.opus"], //医生08 + [ + "凯伊姆", + "「那家伙,该不会说要让我去抓那个小偷吧?」", + "aiy310000190.opus", + ], //男主19 + ["艾莉斯", "「就是这样」", "aiy020000090.opus"], //医生09 + ["凯伊姆", "「笨蛋吗」", "aiy310000200.opus"], //男主20 + ["凯伊姆", "「如果是小钱的话,就当做是买个教训吧」", "aiy310000210.opus"], //男主21 + ["艾莉斯", "「说起来,被盗的是这个月的上纳金」", "aiy020000100.opus"], //医生10 + ["凯伊姆", "「你说什么?」", "aiy310000220.opus"], //男主22 + ["艾莉斯", "「用这些钱买教训,也太过奢侈了呢」", "aiy020000110.opus"], //医生11 + ["凯伊姆", "「知道了,我去找」", "aiy310000230.opus"], //男主23 + ["凯伊姆", "「小偷的特征呢」", "aiy310000240.opus"], //男主24 + ["艾莉斯", "「男孩子」", "aiy020000120.opus"], //医生12 + ["艾莉斯", "「······而且,背后有翅膀」", "aiy020000130.opus"], //医生13 + [ + "艾莉斯", + "「虽然姑且是藏在身后,但是仔细观察的话是很明显的」", + "aiy020000140.opus", + ], //医生14 + ["凯伊姆", "「羽化病吗」", "aiy310000250.opus"], //男主25 + [ + "艾莉斯", + "「那些人可是毫不留情的,所以即使是为了那个孩子,也要赶快抓到他」", + "aiy020000150.opus", + ], //医生15 + ["凯伊姆", "「注意到他逃窜的方向了吗?」", "aiy310000260.opus"], //男主26 + ["艾莉斯", "「广场那边」", "aiy020000160.opus"], //医生16 + [ + "艾莉斯", + "「虽然刚才《不蚀金锁》的人去追了,不过多半是······」", + "aiy020000170.opus", + ], //医生17 + ["凯伊姆", "「偏偏还是广场吗」", "aiy310000280.opus"], //男主28 + ["艾莉斯", "「今天是觐见圣女大人的日子」", "aiy020000180.opus"], //医生18 + ["凯伊姆", "「我知道」", "aiy310000290.opus"], //男主29 + ["凯伊姆", "「尽量找找看就好」", "aiy310000300.opus"], //男主30 + ]; + this.chapter02 = [ + ["不蚀金锁成员", "「凯伊姆先生,凯伊姆先生」"], + ["不蚀金锁成员", "「您已经和艾莉斯大夫见过面了吗?」"], + ["凯伊姆", "「啊啊,所以才会追过来的」"], //男主31 + ["凯伊姆", "「看到小偷了吗?」"], //男主32 + [ + "不蚀金锁成员", + "「没有,他向广场那边逃了过去,今天这么拥挤,我们也只能放弃了」", + ], + [ + "不蚀金锁成员", + "「不过,我也只是刚好在店里所以才追了过去,并不是受人所托」", + ], + ["不蚀金锁成员", "「我已经准备撤退了」"], + ["不蚀金锁成员", "「凯伊姆先生还要继续追吗?」"], + ["凯伊姆", "「啊啊」"], //男主33 + ["", "做完情报交换之后,我跟男人道别。"], + ["凯伊姆", "「和我想的一样啊······」"], //男主34 + ["", "在牢狱中最大的广场上,聚集着看不到尽头的人群。"], + ["", "就算是来参见圣女祈祷,这人数也太多了点吧。"], + ["", "自然,我也找不到逃跑的孩子。"], + ["", "是混杂到人群中了吧。"], + ["", "如果已经从广场上脱身了的话,就更难发现了。"], + ["", "只好赌他还在这里了。"], + ["", "我先移动到了一个视野良好的地方。"], + ["", "从这里,一眼就可以看到人群的变化。"], + ["", "广场还是沸腾起来。"], + ["", "抬头望去,原来是在天台之上出现了一个人影"], + ["", "但是,与周围的期待不同,现身的是一名中年的神官。"], + ["", "骂声四溢。"], + ["", "神官则是笑着摆正衣领"], + ["神官", "「从现在开始,举行谒见的仪式」"], + [ + "神官", + "「在参见那位大人之前,我希望牢狱的诸位再次思考这个《诺瓦斯·艾蒂尔》存在的意义······」", + ], + [ + "神官", + "「初代圣女伊莲大人,便是也难怪这崇高的祈祷之力,令《诺瓦斯·艾蒂尔》浮在空中,拯救了我们的祖先」", + ], + [ + "神官", + "「这之后的几百年来,传承了初代大人力量的历代圣女伊莲大人,让这里留在了空中」", + ], + [ + "神官", + "「这座都市是被圣女大人守护的人类最后的圣域,而我们则是被选召的虔诚的信徒」", + ], + ["神官", "「怀着对圣女的感激祈祷吧,感谢圣女伊莲吧!并献上祈祷!」"], + ["圣女", "「不忘感谢与祈祷,神才会拯救我们」"], + ["圣女", "「与我一起,向神虔诚地祈祷吧」"], + ["", "广场上欢声雷动。"], + ["", "圣女没有回应喧嚣的人声,而是静静地合上双眼面向广场。"], + ["", "虽然感觉有些冷淡,但总比像个傻瓜似的笑着向这群人挥手要强。"], + ["", "她掌握着这条街道,还有在这条街上生活的人的命运。"], + ["", "比起揽得人气,她更想要为了街道的继续存在而献出全力。"], + ["", "也是为了不让《大崩落》的惨剧再度发生。"], + ["", "十几年前的那场悲剧。"], + [ + "", + "虽然在我脑海中的记忆已经相当模糊,但哪怕只是稍有触及,不快的感觉都会在胸口蔓延开。", + ], + ["凯伊姆", "「······」"], //男主35 + ["", "这时我才想起,现在不是我在这里看圣女的时候。"], + ["女声", "「——っ!?」"], + ["围观的女人", "「羽,羽化病人!?」"], + ["围观的中年人", "「喂,谁去叫下羽狩」"], + ["惊慌的观众", "「你这家伙不要靠近我,要是传染了可怎么办」"], + ["粗鲁的观众", "「你这小鬼赶快滚开」"], + ["凯伊姆", "「接下来」"], + ["圣女", "「发生什么事了?看上去似乎很嘈杂」"], + ["随从", "「似乎是某个人逃跑了······具体的我也不是很清楚」"], + ["神官", "「圣女大人,继续待在天台上可能会出事,请您先回到室内吧」"], + ["圣女", "「不用在意我,比起那个,我更关心究竟发生了什么事」"], + ["神官", "「对不起,我真的不知道」"], + ["圣女", "「······是吗」"], + ["男", "「恕我僭越,请准许我说明情况」"], + ["男", "「在来觐见的人群中出现了《羽化病》的患者」"], + ["男", "「围观的人群因而产生了骚动」"], + [ + "男", + "「现在,《防疫局》已经派遣了部队。我想不久之后,他们就会安静下来了」", + ], + ["圣女", "「羽化病······」"], + ["男", "「怎么了?」"], + ["圣女", "「没什么」"], + ["圣女", "「辛苦了,你的名字是?」"], + ["男", "「属下是在防疫局任职的,鲁基乌斯· 迪斯·米利尤」"], + ["神官", "「噢噢,阁下就是鲁基乌斯卿吗,我听说过你的传闻」"], + ["神官", "「阁下是在工作上相当出色的人呢」"], + ["鲁基乌斯", "「不敢当」"], + [ + "鲁基乌斯", + "「话说回来,这次是属下警备工作的失职。让圣女大人见到这不成体统的一面,请您见谅」", + ], + [ + "圣女", + "「即使是目不见物的我,也能感受到聚集于此的民众数量之多。警备工作难以展开也在情理之中」", + ], + ["鲁基乌斯", "「属下不胜惶恐」"], + ["鲁基乌斯", "「接下来属下还要回到工作岗位上,在这里就先告退了」"], + ["圣女", "「鲁基乌斯先生」"], + ["鲁基乌斯", "「属下在」"], + ["圣女", "「你是怎样看待羽狩的工作的呢?」"], + ["神官", "「圣,圣女大人」"], + [ + "鲁基乌斯", + "「防疫局的工作是国王陛下赐予的重要职务。属下非常荣幸能够为这个都市的繁荣尽一份微薄之力」", + ], + ["神官", "「不,不亏是鲁基乌斯卿,相当优秀的想法」"], + ["圣女", "「是吗。辛苦你了」"], + ["随从", "「圣女大人······」"], + ["鲁基乌斯", "「······」"], + ["鲁基乌斯", "「那么,属下就回岗位去了」"], + ]; + this.chapter03 = [ + ["", "从羽化病的少年纷乱的足音中,可以听得出相当的疲劳。"], + ["", "显然,他并没有想到我会捷足先登吧。"], + ["", "少年惶恐地回头看了一眼后,微微露出安心的表情,双手拄在膝盖上。。"], + ["凯伊姆", "「辛苦你了」"], //男主37 + ["羽化病患少年", "「稀!?」"], + ["凯伊姆", "「逃到贫民区是个不错的想法」"], //男主38 + ["羽化病患少年", "「你,你是,羽狩吗?」"], + ["凯伊姆", "「不是」"], //男主39 + ["羽化病患少年", "「什,什么啊······混蛋,不要吓我啊」"], + ["凯伊姆", "「我对令你受惊这件事致以歉意」"], //男主40 + ["凯伊姆", "「作为回报,麻烦你把从店里偷的钱交出来吧」"], //男主41 + ["羽化病患少年", "「钱?你在说什么」"], + ["凯伊姆", "「你要找的腰上的东西,掉在你身后了」"], //男主42 + ["羽化病患少年", "「哎?」"], + ["羽化病患少年", "「呃呀」"], + ["羽化病患少年", "「你······你这混蛋」"], + ["凯伊姆", "「······」"], //男主43 + ["凯伊姆", "「把偷的钱交出来」"], //男主44 + ["羽化病患少年", "「我不知道你在······咕」"], + ["羽化病患少年", "「你,你说是我偷的······有什么证据吗」"], + ["凯伊姆", "「你还挺倔的啊」"], //男主45 + ["凯伊姆", "「不过,给我听好了」"], //男主46 + ["凯伊姆", "「你偷的那些钱,是要上缴给《不蚀金锁》的上纳金」"], //男主47 + ["凯伊姆", "「而且,钱的主人是从前和吉克颇有渊源的女人」"], //男主48 + ["羽化病患少年", "「吉克?」"], + ["凯伊姆", "「他是《不蚀金锁》的主人,这么说你就明白了吧」"], //男主49 + ["羽化病患少年", "「哎?哎?怎么会······」"], + ["凯伊姆", "「再问你一遍,钱在哪里?」"], //男主50 + ["羽化病患少年", "「是,是,是,在我的怀里」"], + ["凯伊姆", "「你没有擅自拿掉一部分吧」"], //男主51 + ["羽化病患少年", "「是,是的」"], + ["羽化病患少年", "「那,那个,您是《不蚀金锁》的人吗?」"], + ["凯伊姆", "「算是吧」"], //男主52 + ["羽化病患少年", "「我什么都可以做,请您一定要帮帮我」"], + ["凯伊姆", "「抱歉,我并没有兴趣去帮助他人」"], //男主53+54 + ["羽化病患少年", "「我什么······什么,都会做的······」"], + ["羽化病患少年", "「我一直都是生活在下层的」"], + [ + "羽化病患少年", + "「可是,不知何时染上了羽化病······背后长出了翅膀······」", + ], + ["羽化病患少年", "「被寄宿工作的店赶了出来,只得流落到牢狱这里」"], + ["羽化病患少年", "「因为独自实在是饿的不行了,所以才会偷这些钱的」"], + [ + "羽化病患少年", + "「我明明没有做任何坏事······为什么······会遇到这种事······」", + ], + ["凯伊姆", "「谁知道」"], //男主55 + ["羽化病患少年", "「呜······呜呜······接下来,要对我做什么?」"], + ["凯伊姆", "「我要把你带到组织那里」"], //男主56 + ["羽化病患少年", "「怎,怎么这样」"], + ["凯伊姆", "「不过,那样做的前提是你不是羽化病人」"], + ["凯伊姆", "「组织也没有笨到把羽化病人招待到家里的程度」"], + ["羽化病患少年", "「那么,是要放我逃走吗?」"], + ["凯伊姆", "「我要让你学到教训」"], + ["凯伊姆", "「如果换做是组织的制裁,至少要有断条胳膊的觉悟」"], + ["凯伊姆", "「你的运气不错」"], + ["羽化病患少年", "「唔······啊,是的······」"], + ["凯伊姆", "「滚」"], + ["羽化病患少年", "「非常感谢」"], + ["羽化病患少年", "「唔啊!?」"], + ["男", "「到这里就结束了,羽化病人」"], + ["男", "「确认他的翅膀」"], + ["", "趁还没有被卷入麻烦的事情之前,赶快离开这里吧"], + ["羽狩的队长", "「那边的那个人」"], + ["凯伊姆", "「······有什么事?」"], + ["羽狩的队长", "「可以稍微让我问几句话吗」"], + ["凯伊姆", "「······」"], + ["凯伊姆", "「啊啊,无妨」"], + ["羽狩的队长", "「感谢您的合作」"], + ["", "队长殷勤地致以谢礼。"], + ["", "而在他的眼前,少年的衣服已经被他的补下们扯破。"], + ["", "在瘦骨嶙峋的裸露后背上,长有纯白的羽翼。"], + ["红发的羽狩", "「副队长,确认翅膀的持有了」"], + ["羽狩的副队长", "「保护他」"], + ["羽化病患少年", "「不要······请原谅,我······」"], + [ + "羽狩的副队长", + "「我们只是要带你去治愈院治疗羽化病,不是什么应该感到害怕的事情」", + ], + ["羽化病患少年", "「可是,可是」"], + ["羽狩的副队长", "「没关系的」"], + ["羽化病患少年", "「······哥,哥哥」"], + ["羽狩的副队长", "「你是羽化病人的亲属吗?」"], + ["凯伊姆", "「只是路人而已」"], + ["凯伊姆", "「顺带一提,我也没有打算找你们的麻烦」"], + [ + "羽狩的副队长", + "「前几天,有个和你说了同样的话的人,在我们背向他的瞬间对我们发动了袭击」", + ], + ["羽狩的副队长", "「我的一个部下就此永久失去了半截胳膊」"], + ["凯伊姆", "「我表示同情」"], + ["凯伊姆", "「我马上就会消失的,这样就没问题了吧?」"], + ["羽狩的副队长", "「嘛,不要这么慌张」"], + ["", "副队长看着羽化的少年。"], + ["羽狩的副队长", "「你与这个人是什么关系?没有被他殴打吗?」"], + ["羽化病患少年", "「没,没有」"], + [ + "羽狩的副队长", + "「如何对我们保持合作,你就可以在治愈院得到优先的治疗」", + ], + ["羽化病患少年", "「······」"], + ["羽化病患少年", "「那个人,是《不蚀金锁》的组织成员······」"], + ["羽化病患少年", "「突然说让我拿出钱来,我刚一拒绝他就打我」"], + ["羽狩的副队长", "「原来如此······」"], + [ + "羽狩的副队长", + "「那位少年说你是《不蚀金锁》的一员,不知此事是否属实?」", + ], + ["凯伊姆", "「当然不是」"], + ["凯伊姆", "「我只是从那里接受工作而已,并不是他们的成员」"], + ["羽狩的副队长", "「你的意思是说,少年在说谎吗?」"], + ["凯伊姆", "「啊啊」"], + [ + "凯伊姆", + "「如果你们和组织有关系的话,只要问问我是不是那里的成员就能明白事实了吧」", + ], + ["羽狩的副队长", "「就算我去询问,也无法从他们那里得到事实」"], + [ + "羽狩的副队长", + "「《不蚀金锁》的那些人一向都不对我们合作,我对此深感困扰」", + ], + ["凯伊姆", "「真是辛苦啊」"], + ["羽狩的副队长", "「说的是啊」"], + ["羽狩的副队长", "「其实,砍下我部下胳膊的似乎也是组织的成员呢」"], + [ + "羽狩的副队长", + "「无需如此警戒,我只是想在看守所向你咨询一些事情而已」", + ], + [ + "羽狩的副队长", + "「如果能够知晓牢狱与组织的事情,我们也可以尽可能地对更多的羽化病人进行保护」", + ], + ["羽狩的副队长", "「那和整条街道的和平也是紧密相关的吧?」"], + ["凯伊姆", "「我知道,你们有逮捕干扰狩猎羽化病人的权力」"], + [ + "凯伊姆", + "「但是,我没有对你们做出任何干扰,为什么要对我如此纠缠不休呢」", + ], + ["羽狩的副队长", "「那些话,我们会在看守所对你详细说明的」"], + ["凯伊姆", "「······」"], + ["", "在这里起争执的话,就会被羽狩加害。"], + ["", "就算能从这里脱身,今后只要碰面就会产生纠纷也是摆明的事情。"], + ["", "就算逃跑,也没有好的结果。"], + ["", "正当我想要打圆场的时候,刚才的气氛一瞬间产生了转变。"], + ["", "发生了什么事······"], + ["???", "「我认为,那位先生是正确的」"], + ["", "羽狩们一起回头。"], + ["", "而在他们视线的焦点处,"], + ["", "伫立着一位女性。"], + ["", "在端正的容颜下,代表着强烈意志的双眉十分显眼。"], + ["", "身体的柔软与紧紧包裹在其身上的羽狩制服,两者显得十分的不搭配。"], + ["", "我还是第一次看到女性的羽狩。"], + ["羽狩的副队长", "「队长,这是获得《不蚀金锁》情报的好机会」"], + [ + "羽狩的队长", + "「兰格副队长,就算是为了获得情报,也不能做出恫吓的发言啊」", + ], + ["兰格副队长", "「我并没有打算去恫吓他······」"], + ["羽狩的队长", "「告诉我那个被砍掉胳膊的队员的名字」"], + ["羽狩的队长", "「我会去探望他的」"], + ["兰格副队长", "「那个是······」"], + ["羽狩的队长", "「我知道,你一直在为有所收获而努力工作」"], + ["羽狩的队长", "「但是,正因为我们的工作是为民众提供帮助」"], + ["羽狩的队长", "「所以就更不能损害人与人之间的信赖」"], + ["兰格副队长", "「我会铭记在心」"], + ["羽狩的队长", "「这位先生,我的部下失礼了」"], + ["凯伊姆", "「只要不对我再来一次就好」"], + ["羽狩的队长", "「请稍等」"], + ["凯伊姆", "「有什么事?」"], + ["羽狩的队长", "「我想确认一件事」"], + ["羽狩的队长", "「你真的不是《不蚀金锁》的成员吗?」"], + ["凯伊姆", "「真的」"], + ["凯伊姆", "「如果我说是的话,你有什么打算?」"], + ["羽狩的队长", "「我听过传闻,说他们是用依靠暴力而得的钱在生活」"], + ["凯伊姆", "「······这样啊」"], + ["凯伊姆", "「如果能有收获就好了啊」"], + ]; + this.chapter04 = [ + ["梅尔特", "「欢迎光临」"], + ["梅尔特", "「辛苦了」"], + ["梅尔特", "「抱歉,又拜托给你了个这么麻烦的工作」"], + ["凯伊姆", "「没什么,比想象中完成的更容易」"], + ["梅尔特", "「那就好」"], + ["梅尔特", "「这是我的一点谢意」"], + ["凯伊姆", "「味道有些变化啊」"], + ["梅尔特", "「啊,被发现了?」"], + ["梅尔特", "「最近,没能到手什么好的原料呢」"], + ["凯伊姆", "「去拜托吉克如何?」"], + [ + "梅尔特", + "「话是这么说,但是总不能用店里采购的这种小事去麻烦他吧······」", + ], + ["凯伊姆", "「那希望你也不要来麻烦我」"], + ["梅尔特", "「那 是 两 码 事」"], + ["梅尔特", "「再说,凯伊姆是靠着工作来生活的吧」"], + [ + "梅尔特", + "「而且,自己的钱被偷了这么害羞的事,向凯伊姆意外的其他人都说不出口」", + ], + ["凯伊姆", "「反正,也已经传到吉克的耳朵里了」"], + ["梅尔特", "「这是面子问题啊,面子问题」"], + ["凯伊姆", "「嘛,算了」"], + ["凯伊姆", "「这样就好了吧?」"], + ["梅尔特", "「这是钱包呢」"], + ["梅尔特", "「嗯,东西没少」"], + ["梅尔特", "「太好啦—这个月的上纳金,我可全部都放在里面了呢」"], + ["梅尔特", "「如果没有找到的话,说不定就又会被送到娼馆里了呢」"], + ["凯伊姆", "「在那边不是来钱更快吗?」"], + ["梅尔特", "「阿拉,你是在说我还能有魅力吗?」"], + ["凯伊姆", "「这是客套话而已」"], + ["梅尔特", "「欺负人」"], + ["梅尔特", "「总而言之,今天帮大忙了」"], + ["梅尔特", "「谢礼嘛······」"], + ["凯伊姆", "「就记在账单上吧」"], + ["梅尔特", "「了解—盛谢惠顾了哦?」"], + ["", "喀啷喀啷"], + ["", "门铃响起"], + ["", "喧哗瞬间安静下来。"], + ["", "进来的人是吉克。"], + ["", "是掌控着牢狱的组织之一,《不蚀金锁》的头目。"], + ["", "不仅组织的成员,就连店内一般的客人也对他以注目礼表示敬意。"], + ["吉克", "「各位继续吧」"], + ["", "仿佛停滞的时钟重新转动了一般,店内恢复了热闹的气氛。"], + ["吉克", "「抱歉,今天拜托你去做了无聊的工作」。"], + ["凯伊姆", "「不用介意」"], + ["", "吉克轻轻点了点头,在我右边坐了下来"], + ["凯伊姆", "「逃跑的男人怎么样了?」"], + ["吉克", "「嗯?已经不在这个世上了」。"], + ["吉克", "「有什么想要知道的事吗?」"], + ["凯伊姆", "「不,没什么」"], + ["吉克", "「那个无聊的家伙,完全没有趣味呢」"], + ["吉克", "「真希望他也替我负责清扫的部下也考虑考虑」"], + ["凯伊姆", "「真是灾难啊」"], + ["吉克", "「比起那个,我听说了哦。你去追羽化病人了啊」"], + ["凯伊姆", "「消息真灵通」"], + ["吉克", "「梅尔特也注意点」"], + ["吉克", "「你丢钱已经不是一回两回了」"], + ["梅尔特", "「好的—我会注意的。」"], + ["梅尔特", "「吉克还是平常的点单吧」"], + ["梅尔特", "「凯伊姆要再来一杯吗?」"], + ["", "我们用眼神点头示意后,梅尔特开始准备起酒来。"], + ["", "悠然地吐出眼圈后,吉克取出一个纸包放在柜台上。"], + ["吉克", "「这是抓捕逃跑男人的报酬」"], + ["凯伊姆", "「下次有什么事再告诉我」"], + ["梅尔特", "「来,久等了」"], + ["凯伊姆", "「话说回来梅尔特,为什么会被那种孩子偷到钱?」"], + ["吉克", "「让我猜猜看」"], + ["吉克", "「是那个吧,看某个特立独行的男人入迷了,所以就有了空隙?」"], + ["梅尔特", "「可惜—」"], + ["梅尔特", "「事实恰恰相反,是那家伙一直在纠缠我」"], + ["凯伊姆", "「完全把你当成新进的女佣了么」"], + ["梅尔特", "「我从前可是很有名的,不会被当成这种下人吧」"], + ["梅尔特", "「······而且,我没法对对我这么钟情的人发火啊」"], + ["凯伊姆&吉克", "「你傻啊」"], + ["梅尔特", "「异口同声呢,不亏是兄弟」"], + ["凯伊姆", "「别用这种称呼,怪恶心的」"], + ["吉克", "「说得没错」"], + ["吉克", "「······说起来······」"], + ["梅尔特", "「怎么了?」"], + ["吉克", "「有件事我一直很在意,我和凯伊姆,哪个是哥哥啊?」"], + ["凯伊姆", "「你也说这么无聊的话题」"], + ["吉克", "「不,这是很重要的事情」"], + ["吉克", "「梅尔特,事实是怎么样的?」"], + ["梅尔特", "「啊~是怎么样的呢~」"], + ["梅尔特", "「我忘记了」"], + ["吉克", "「骗人」"], + ]; + } } \ No newline at end of file