diff --git a/_server/MotaAction.g4 b/_server/MotaAction.g4 index eaa641e..7cfcd64 100644 --- a/_server/MotaAction.g4 +++ b/_server/MotaAction.g4 @@ -1137,7 +1137,7 @@ return code; */; cgtext_s - : '背景' EvalString? '回忆滤镜' Bool? '移除对话框' Bool? '剧情库序列' Int '头像' EvalString?'坐标PX' Number'打字间隔' Int? BGNL? Newline + : '背景' EvalString? '不使用背景' Bool? '回忆滤镜' Bool? '移除对话框' Bool? '剧情库序列' Int '头像' EvalString?'坐标PX' Number'打字间隔' Int? BGNL? Newline '自动等待时长' Int BGNL? Newline textcgDrawingList+? Newline @@ -1146,10 +1146,11 @@ cgtext_s tooltip : cgtext:显示一段包含cg的文字(剧情) helpUrl : /_docs/#/instruction allImages : ['EvalString_0','EvalString_1'] -default : ["bg_5043.webp",false,false,0,"face_050445.webp",-300,0,2000,"","这句话显示在对话框内",[{ "name":"tati_050145a.webp" , "px": 100,"filter":false }]] +default : ["bg_5043.webp",false,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+list+' },\n'; +Bool_0=Bool_0?',"nobg":'+Bool_0:'' +var code = '{"type": "cgtext", "bg":"'+EvalString_0+'"'+Bool_0+',"memory":'+Bool_1+',"WindowSkin":'+Bool_2+',"head":'+head+' ,"index":"'+Int_0+'","time":'+Int_1+',"wait":'+Int_2+list+' },\n'; return code; */; textcgDrawingList @@ -4624,8 +4625,8 @@ IdString ; FixedId_List - : '生命'|'生命上限'|'攻击'|'防御'|'法强'|'魔攻比例'|'护盾比例'|'黄钥匙'|'蓝钥匙'|'红钥匙'|'金币'|'经验'|'魔力'|'魔力上限'|'当前横坐标'|'当前纵坐标'|'当前朝向'|'攻击增益'|'防御增益'|'护盾增益' - /*FixedId_List ['status:hp','status:hpmax','status:atk','status:def','status:spell','status:matk','status:mdef','item:yellowKey','item:blueKey','item:redKey','status:money','status:exp','status:mana','status:manamax','status:x','status:y','status:direction','buff:atk','buff:def','buff:mdef']*/; + : '生命'|'生命上限'|'攻击'|'防御'|'法强'|'魔攻比例'|'护盾比例'|'法抗比例'|'黄钥匙'|'蓝钥匙'|'红钥匙'|'金币'|'经验'|'魔力'|'魔力上限'|'当前横坐标'|'当前纵坐标'|'当前朝向'|'攻击增益'|'防御增益'|'法强增益'|'魔攻增益'|'法抗增益'|'护盾增益' + /*FixedId_List ['status:hp','status:hpmax','status:atk','status:def','status:spell','status:matk','status:mhp','status:mdef','item:yellowKey','item:blueKey','item:redKey','status:money','status:exp','status:mana','status:manamax','status:x','status:y','status:direction','buff:atk','buff:def','buff:spell','buff:matk','buff:mdef','buff:mhp']*/; Id_List : '变量' | '状态' | '物品' | '增益' | '独立开关' | '临时变量' |'全局存储' @@ -4640,8 +4641,8 @@ EnemyPoint_List /*EnemyPoint_List ['hp','atk','def','money','exp','point','name']*/; Equip_List - : '生命'|'生命上限'|'攻击'|'防御'|'法强'|'魔攻比例'|'护盾比例'|'魔力'|'魔力上限'|'速度' - /*Equip_List ['hp','hpmax','atk','def','spell','matk','mdef','mana','manamax','speed']*/; + : '生命'|'生命上限'|'攻击'|'防御'|'法强'|'魔攻比例'|'护盾比例'|'法抗百分比'|'魔力'|'魔力上限'|'速度' + /*Equip_List ['hp','hpmax','atk','def','spell','matk','mhp','mdef','mana','manamax','speed']*/; Key_List : '黄钥匙'|'蓝钥匙'|'红钥匙'|'绿钥匙'|'铁门钥匙' diff --git a/_server/MotaActionParser.js b/_server/MotaActionParser.js index db8cf0b..c4ce5b7 100644 --- a/_server/MotaActionParser.js +++ b/_server/MotaActionParser.js @@ -567,6 +567,7 @@ MotaActionParser = function () { }; this.next = MotaActionBlocks["cgtext_s"].xmlText([ data.bg, + data.nobg??false, data.memory, data.WindowSkin, data.index, diff --git a/_server/table/comment.js b/_server/table/comment.js index 3cf5699..b8ae4ff 100644 --- a/_server/table/comment.js +++ b/_server/table/comment.js @@ -116,6 +116,14 @@ var comment_c456ea59_6018_45ef_8bcc_211a24c627dc = { "_lint": true, "_docs": "能否使用或装备", "_data": "当前能否使用或装备该道具,仅对cls不为items有效。null表示始终不可使用但可装备" + }, + "canBatchUse": { + "_leaf": true, + "_type": "textarea", + "_string": true, + "_lint": true, + "_docs": "能否批量使用", + "_data": "该道具是否允许批量使用,仅对cls为tools或constants有效,true表示可批量使用。建议同时勾选【回放不绘制道具栏】" } } }, @@ -196,6 +204,11 @@ var comment_c456ea59_6018_45ef_8bcc_211a24c627dc = { "_data": "百分数,如10为10%法抗,怪物受到勇士的法术伤害减免比例" }, + "spell": { + "_leaf": true, + "_type": "textarea", + "_data": "法强" + }, "speed": { "_leaf": true, "_type": "textarea", @@ -368,7 +381,7 @@ var comment_c456ea59_6018_45ef_8bcc_211a24c627dc = { "_docs": "退化扣防", "_data": "退化时勇士下降的防御力点数" }, - "damage": { + "damage2": { "_leaf": true, "_type": "textarea", "_range": "thiseval==~~thiseval||thiseval==null", @@ -391,7 +404,7 @@ var comment_c456ea59_6018_45ef_8bcc_211a24c627dc = { } } }, - "enemys_template": { 'name': '新敌人', 'hp': 0, 'atk': 0, 'def': 0, 'mdef': 0, 'speed': 0, 'money': 0, 'exp': 0, 'point': 0, 'special': [] }, + "enemys_template": { 'name': '新敌人', 'hp': 0, 'atk': 0, 'def': 0, 'mdef': 0, 'speed': 1, 'money': 0, 'exp': 0, 'point': 0, 'special': [] }, // --------------------------- 【图块属性】相关的表格配置 --------------------------- // diff --git a/_server/table/data.comment.js b/_server/table/data.comment.js index 358881b..17faa7f 100644 --- a/_server/table/data.comment.js +++ b/_server/table/data.comment.js @@ -452,6 +452,12 @@ var data_comment_c456ea59_6018_45ef_8bcc_211a24c627dc = { "_type": "textarea", "_docs": "绿宝石值", }, + "yellowGem": { + "_leaf": true, + "_type": "textarea", + "_docs": "黄宝石值", + }, + "redPotion": { "_leaf": true, "_type": "textarea", diff --git a/index.html b/index.html index c49e005..a316bc3 100644 --- a/index.html +++ b/index.html @@ -47,6 +47,20 @@ startImageDiv.classList.add("startImageDivAnimation"); // 注释下面这句话以禁止单击立刻跳过开场动画 startImageBackgroundDiv.onclick = onAnimationEnd; + // 新增加载图片轮播逻辑 + const slides = document.querySelectorAll('.loading-slide'); + let currentSlide = 0; + + const slideInterval = setInterval(() => { + slides[currentSlide].classList.remove('active'); + currentSlide = (currentSlide + 1) % slides.length; + slides[currentSlide].classList.add('active'); + }, 3000); + + // 在加载完成时清除定时器 + window.addEventListener('load', () => { + clearInterval(slideInterval); + }); }; startImageLogo.onerror = function () {}; startImageLogo.src = "logo.png"; @@ -58,6 +72,14 @@
+ +
+ + + + + +
diff --git a/main.js b/main.js index 05f0435..0295c32 100644 --- a/main.js +++ b/main.js @@ -276,7 +276,7 @@ main.prototype.init = function (mode, callback) { coreData[t] = main[t]; }); main.core.init(coreData, callback); - main.core.resize(); + core.resize(); // 自动放缩最大化 if (!main.replayChecking) { if (core.getLocalStorage("autoScale") == null) { diff --git a/project/data.js b/project/data.js index 2d71931..5326837 100644 --- a/project/data.js +++ b/project/data.js @@ -35,10 +35,15 @@ var data_a1e2fb4a_e986_4524_b0da_9b7ba7c0874d = "guangchang3", "guangchang4", "guangchang6", - "guangchang5" + "guangchang5", + "jiaocheng01", + "jiaocheng02" ], "floorPartitions": [], "images": [ + "005-Attack03.webp", + "012-Heal01.webp", + "015-Fire01.webp", "HPGaugeEnemy_A.webp", "HPGaugeEnemy_B.webp", "LOGO.webp", @@ -455,6 +460,7 @@ var data_a1e2fb4a_e986_4524_b0da_9b7ba7c0874d = "r.webp", "sound.webp", "status.webp", + "statusBackground.webp", "suiji.webp", "tati_020101.webp", "tati_020101a.webp", @@ -786,6 +792,7 @@ var data_a1e2fb4a_e986_4524_b0da_9b7ba7c0874d = "tati_120128.webp", "tati_120131.webp", "tati_120132.webp", + "tati_310101.webp", "tati_340101.webp", "tati_340101a.webp", "tati_340101y.webp", @@ -941,6 +948,143 @@ var data_a1e2fb4a_e986_4524_b0da_9b7ba7c0874d = "aiy020000160.opus", "aiy020000170.opus", "aiy020000180.opus", + "aiy020000190.ogg", + "aiy020000200.ogg", + "aiy020000210.ogg", + "aiy020000220.ogg", + "aiy020000230.ogg", + "aiy020000240.ogg", + "aiy020000250.ogg", + "aiy020000260.ogg", + "aiy020000270.ogg", + "aiy020000280.ogg", + "aiy020000290.ogg", + "aiy020000300.ogg", + "aiy020000310.ogg", + "aiy020000320.ogg", + "aiy020000330.ogg", + "aiy020000340.ogg", + "aiy020000350.ogg", + "aiy020000360.ogg", + "aiy020000370.ogg", + "aiy030000010.ogg", + "aiy030000020.ogg", + "aiy030000030.ogg", + "aiy030000050.ogg", + "aiy030000060.ogg", + "aiy030000070.ogg", + "aiy030000080.ogg", + "aiy030000090.ogg", + "aiy030000100.ogg", + "aiy030000110.ogg", + "aiy030000120.ogg", + "aiy030000130.ogg", + "aiy050000010.ogg", + "aiy050000020.ogg", + "aiy050000030.ogg", + "aiy050000040.ogg", + "aiy050000050.ogg", + "aiy050000060.ogg", + "aiy050000070.ogg", + "aiy050000080.ogg", + "aiy050000090.ogg", + "aiy050000100.ogg", + "aiy050000110.ogg", + "aiy050000120.ogg", + "aiy120000020.ogg", + "aiy120000030.ogg", + "aiy120000040.ogg", + "aiy120000050.ogg", + "aiy120000060.ogg", + "aiy120000070.ogg", + "aiy120000080.ogg", + "aiy120000090.ogg", + "aiy120000100.ogg", + "aiy120000110.ogg", + "aiy120000120.ogg", + "aiy120000130.ogg", + "aiy120000140.ogg", + "aiy120000150.ogg", + "aiy120000160.ogg", + "aiy120000170.ogg", + "aiy120000180.ogg", + "aiy120000190.ogg", + "aiy120000200.ogg", + "aiy120000210.ogg", + "aiy120000220.ogg", + "aiy120000230.ogg", + "aiy120000240.ogg", + "aiy120000250.ogg", + "aiy120000260.ogg", + "aiy120000270.ogg", + "aiy120000280.ogg", + "aiy120000290.ogg", + "aiy120000300.ogg", + "aiy120000310.ogg", + "aiy120000320.ogg", + "aiy120000330.ogg", + "aiy120000340.ogg", + "aiy120000350.ogg", + "aiy120000360.ogg", + "aiy120000370.ogg", + "aiy120000380.ogg", + "aiy120000390.ogg", + "aiy120000400.ogg", + "aiy120000410.ogg", + "aiy120000420.ogg", + "aiy120000430.ogg", + "aiy120000440.ogg", + "aiy120000450.ogg", + "aiy120000460.ogg", + "aiy120000470.ogg", + "aiy120000480.ogg", + "aiy120000490.ogg", + "aiy120000500.ogg", + "aiy120000510.ogg", + "aiy120000520.ogg", + "aiy120000530.ogg", + "aiy120000540.ogg", + "aiy120000550.ogg", + "aiy120000560.ogg", + "aiy120000570.ogg", + "aiy120000580.ogg", + "aiy120000590.ogg", + "aiy120000600.ogg", + "aiy120000610.ogg", + "aiy120000620.ogg", + "aiy120000630.ogg", + "aiy120000640.ogg", + "aiy120000650.ogg", + "aiy120000670.ogg", + "aiy120000680.ogg", + "aiy120000690.ogg", + "aiy130000010.ogg", + "aiy130000020.ogg", + "aiy150000010.ogg", + "aiy150000020.ogg", + "aiy150000030.ogg", + "aiy150000040.ogg", + "aiy150000050.ogg", + "aiy150000060.ogg", + "aiy150000070.ogg", + "aiy150000080.ogg", + "aiy150000090.ogg", + "aiy150000100.ogg", + "aiy150000110.ogg", + "aiy150000120.ogg", + "aiy150000130.ogg", + "aiy150000140.ogg", + "aiy150000150.ogg", + "aiy150000160.ogg", + "aiy150000170.ogg", + "aiy150000180.ogg", + "aiy150000190.ogg", + "aiy150000200.ogg", + "aiy150000210.ogg", + "aiy150000220.ogg", + "aiy150000230.ogg", + "aiy150000240.ogg", + "aiy150000250.ogg", "aiy310000010.opus", "aiy310000020.opus", "aiy310000030.opus", @@ -970,6 +1114,170 @@ var data_a1e2fb4a_e986_4524_b0da_9b7ba7c0874d = "aiy310000280.opus", "aiy310000290.opus", "aiy310000300.opus", + "aiy310000310.ogg", + "aiy310000320.ogg", + "aiy310000330.ogg", + "aiy310000340.ogg", + "aiy310000350.ogg", + "aiy310000360.ogg", + "aiy310000370.ogg", + "aiy310000380.ogg", + "aiy310000390.ogg", + "aiy310000400.ogg", + "aiy310000410.ogg", + "aiy310000420.ogg", + "aiy310000430.ogg", + "aiy310000440.ogg", + "aiy310000450.ogg", + "aiy310000460.ogg", + "aiy310000470.ogg", + "aiy310000480.ogg", + "aiy310000490.ogg", + "aiy310000510.ogg", + "aiy310000520.ogg", + "aiy310000530.ogg", + "aiy310000540.ogg", + "aiy310000550.ogg", + "aiy310000560.ogg", + "aiy310000570.ogg", + "aiy310000580.ogg", + "aiy310000590.ogg", + "aiy310000600.ogg", + "aiy310000610.ogg", + "aiy310000620.ogg", + "aiy310000630.ogg", + "aiy310000640.ogg", + "aiy310000650.ogg", + "aiy310000660.ogg", + "aiy310000670.ogg", + "aiy310000680.ogg", + "aiy310000690.ogg", + "aiy310000700.ogg", + "aiy310000710.ogg", + "aiy310000720.ogg", + "aiy310000730.ogg", + "aiy310000740.ogg", + "aiy310000750.ogg", + "aiy310000760.ogg", + "aiy310000770.ogg", + "aiy310000780.ogg", + "aiy310000790.ogg", + "aiy310000800.ogg", + "aiy310000810.ogg", + "aiy310000820.ogg", + "aiy310000830.ogg", + "aiy310000840.ogg", + "aiy310000850.ogg", + "aiy310000860.ogg", + "aiy310000870.ogg", + "aiy310000880.ogg", + "aiy310000890.ogg", + "aiy310000900.ogg", + "aiy310000910.ogg", + "aiy310000920.ogg", + "aiy310000930.ogg", + "aiy310000940.ogg", + "aiy310000950.ogg", + "aiy310000960.ogg", + "aiy310000970.ogg", + "aiy310000980.ogg", + "aiy310000990.ogg", + "aiy310001000.ogg", + "aiy310001010.ogg", + "aiy310001027.ogg", + "aiy310001030.ogg", + "aiy310001040.ogg", + "aiy310001050.ogg", + "aiy310001060.ogg", + "aiy310001070.ogg", + "aiy310001080.ogg", + "aiy310001090.ogg", + "aiy310001100.ogg", + "aiy310001110.ogg", + "aiy310001120.ogg", + "aiy310001130.ogg", + "aiy310001140.ogg", + "aiy310001150.ogg", + "aiy310001160.ogg", + "aiy310001170.ogg", + "aiy310001180.ogg", + "aiy310001190.ogg", + "aiy310001200.ogg", + "aiy310001210.ogg", + "aiy310001220.ogg", + "aiy310001230.ogg", + "aiy310001240.ogg", + "aiy310001250.ogg", + "aiy310001260.ogg", + "aiy310001270.ogg", + "aiy310001280.ogg", + "aiy310001290.ogg", + "aiy310001300.ogg", + "aiy310001310.ogg", + "aiy310001320.ogg", + "aiy310001330.ogg", + "aiy310001340.ogg", + "aiy310001350.ogg", + "aiy310001360.ogg", + "aiy310001370.ogg", + "aiy310001380.ogg", + "aiy310001390.ogg", + "aiy320000010.ogg", + "aiy320000020.ogg", + "aiy320000030.ogg", + "aiy320000040.ogg", + "aiy320000050.ogg", + "aiy320000060.ogg", + "aiy320000070.ogg", + "aiy320000080.ogg", + "aiy320000090.ogg", + "aiy320000100.ogg", + "aiy320000110.ogg", + "aiy320000120.ogg", + "aiy320000135.ogg", + "aiy320000140.ogg", + "aiy340000010.ogg", + "aiy340000020.ogg", + "aiy340000030.ogg", + "aiy340000040.ogg", + "aiy340000050.ogg", + "aiy340000060.ogg", + "aiy340000070.ogg", + "aiy340000080.ogg", + "aiy340000090.ogg", + "aiy340000100.ogg", + "aiy340000110.ogg", + "aiy340000120.ogg", + "aiy340000140.ogg", + "aiy340000150.ogg", + "aiy340000160.ogg", + "aiy340000170.ogg", + "aiy340000180.ogg", + "aiy340000190.ogg", + "aiy340000200.ogg", + "aiy340000210.ogg", + "aiy340000220.ogg", + "aiy340000230.ogg", + "aiy340000240.ogg", + "aiy340000250.ogg", + "aiy340000260.ogg", + "aiy340000270.ogg", + "aiy340000280.ogg", + "aiy340000290.ogg", + "aiy340000300.ogg", + "aiy340000310.ogg", + "aiy340000320.ogg", + "aiy340000330.ogg", + "aiy340000340.ogg", + "aiy340000350.ogg", + "aiy340000360.ogg", + "aiy340000370.ogg", + "aiy340000380.ogg", + "aiy340000390.ogg", + "aiy340000400.ogg", + "aiy340000410.ogg", + "aiy340000420.ogg", + "aiy340000430.ogg", "aiy350000010.opus", "aiy350000020.opus", "aiy350000030.opus", @@ -993,6 +1301,52 @@ var data_a1e2fb4a_e986_4524_b0da_9b7ba7c0874d = "aiy350000210.opus", "aiy350000220.opus", "aiy350000230.opus", + "aiy350000240.ogg", + "aiy350000250.ogg", + "aiy350000260.ogg", + "aiy430000010.ogg", + "aiy430000020.ogg", + "aiy430000030.ogg", + "aiy430000040.ogg", + "aiy430000050.ogg", + "aiy430000060.ogg", + "aiy430000070.ogg", + "aiy430000080.ogg", + "aiy430000090.ogg", + "aiy430000100.ogg", + "aiy430000110.ogg", + "aiy430000120.ogg", + "aiy430000130.ogg", + "aiy430000140.ogg", + "aiy430000150.ogg", + "aiy430000160.ogg", + "aiy430000170.ogg", + "aiy430000180.ogg", + "aiy430000190.ogg", + "aiy430000200.ogg", + "aiy430000210.ogg", + "aiy430000220.ogg", + "aiy430000230.ogg", + "aiy430000240.ogg", + "aiy430000250.ogg", + "aiy430000260.ogg", + "aiy430000270.ogg", + "aiy430000280.ogg", + "aiy430000290.ogg", + "aiy440000010.ogg", + "aiy440000020.ogg", + "aiy440000030.ogg", + "aiy440000040.ogg", + "aiy440000050.ogg", + "aiy440000060.ogg", + "aiy440000070.ogg", + "aiy440000080.ogg", + "aiy440000090.ogg", + "aiy440000100.ogg", + "aiy440000110.ogg", + "aiy440000120.ogg", + "aiy510000010.ogg", + "aiy510000020.ogg", "aiy710000010.opus", "aiy710000020.opus", "aiy710000030.opus", @@ -1006,8 +1360,68 @@ var data_a1e2fb4a_e986_4524_b0da_9b7ba7c0874d = "aiy710000110.opus", "aiy710000120.opus", "aiy710000130.opus", + "aiy720000010.ogg", + "aiy730000010.ogg", + "aiy740000010.ogg", + "aiy750000010.ogg", + "aiy750000020.ogg", + "aiy750000030.ogg", + "aiy750000040.ogg", + "aiy750000050.ogg", + "aiy750000060.ogg", + "aiy750000070.ogg", + "aiy750000080.ogg", + "aiy750000090.ogg", + "aiy750000100.ogg", + "aiy750000110.ogg", + "aiy750000120.ogg", + "aiy750000130.ogg", + "aiy750000140.ogg", + "aiy750000150.ogg", + "aiy750000160.ogg", + "aiy750000170.ogg", + "aiy750000180.ogg", + "aiy750000190.ogg", + "aiy750000200.ogg", + "aiy750000210.ogg", + "aiy750000220.ogg", + "aiy750000230.ogg", + "aiy750000240.ogg", + "aiy750000250.ogg", + "aiy750000260.ogg", + "aiy750000270.ogg", + "aiy750000280.ogg", + "aiy750000290.ogg", + "aiy750000300.ogg", + "aiy750000310.ogg", + "aiy750000320.ogg", + "aiy750000330.ogg", + "aiy750000340.ogg", + "aiy800000010.ogg", + "aiy800000020.ogg", + "aiy800000030.ogg", + "aiy800000040.ogg", + "aiy800000050.ogg", + "aiy800000060.ogg", + "aiy800000070.ogg", + "aiy800000080.ogg", + "aiy800000090.ogg", + "aiy800000100.ogg", + "aiy810000010.ogg", + "aiy810000020.ogg", + "aiy810000030.ogg", + "aiy810000040.ogg", + "aiy810000050.ogg", + "aiy810000060.ogg", + "aiy810000070.ogg", "aiy820000010.opus", "aiy820000020.opus", + "aiy860000010.ogg", + "aiy860000020.ogg", + "aiy860000030.ogg", + "aiy860000040.ogg", + "aiy860000050.ogg", + "aiy860000060.ogg", "attack.opus", "bomb.opus", "cancel.opus", @@ -1108,7 +1522,7 @@ var data_a1e2fb4a_e986_4524_b0da_9b7ba7c0874d = "title": "秽翼的尤斯蒂娅", "name": "Eustia", "version": "鸽子窝造塔小队", - "floorId": "guangchang", + "floorId": "jiaocheng01", "hero": { "image": "hero.webp", "animate": false, @@ -1118,10 +1532,10 @@ var data_a1e2fb4a_e986_4524_b0da_9b7ba7c0874d = "hp": 1000, "manamax": -1, "mana": 0, - "atk": 100, - "def": 100, - "mdef": 0, - "speed": 10, + "atk": 30, + "def": 20, + "mdef": 100, + "speed": 20, "money": 0, "exp": 0, "equipment": [], @@ -1133,18 +1547,20 @@ var data_a1e2fb4a_e986_4524_b0da_9b7ba7c0874d = "loc": { "direction": "up", "x": 6, - "y": 10 + "y": 12 }, "flags": { "itemDetail": true, - "useBetweenLight": true + "useBetweenLight": true, + "__mdef_buff__": 0, + "popmove": true }, "followers": [], "steps": 0, "matk": 0, - "spell": 0, + "spell": 20, "spelldef": 0, - "mhp": 0 + "mhp": 100 }, "startCanvas": [ { @@ -1499,9 +1915,33 @@ var data_a1e2fb4a_e986_4524_b0da_9b7ba7c0874d = } ], "startText": [ + { + "type": "if", + "condition": "false", + "true": [ + { + "type": "setText" + }, + { + "type": "setHeroOpacity", + "opacity": 0 + }, + { + "type": "setCurtain", + "color": [ + 0, + 0, + 0, + 1 + ], + "time": 500, + "keep": true + } + ] + }, { "type": "function", - "function": "function(){\ncore.getItem('book',1);core.getItem('fly',1)\n}" + "function": "function(){\ncore.getItem('book', 1);\ncore.getItem('fly', 1);\n}" }, { "type": "insert", @@ -1510,6 +1950,16 @@ var data_a1e2fb4a_e986_4524_b0da_9b7ba7c0874d = { "type": "insert", "name": "强制横屏" + }, + { + "type": "if", + "condition": "false", + "true": [ + { + "type": "insert", + "name": "chapter0" + } + ] } ], "shops": [ @@ -1678,13 +2128,13 @@ var data_a1e2fb4a_e986_4524_b0da_9b7ba7c0874d = "lavaDamage": 100, "poisonDamage": 10, "weakValue": 20, - "redGem": 3, - "blueGem": 3, + "redGem": 2, + "blueGem": 2, "greenGem": 5, "redPotion": 100, "bluePotion": 250, "yellowPotion": 500, - "greenPotion": 800, + "greenPotion": 900, "breakArmor": 0.9, "counterAttack": 0.1, "purify": 3, @@ -1692,7 +2142,8 @@ var data_a1e2fb4a_e986_4524_b0da_9b7ba7c0874d = "animateSpeed": 300, "moveSpeed": 100, "statusCanvasRowsOnMobile": 3, - "floorChangeTime": 500 + "floorChangeTime": 500, + "yellowGem": 2 }, "flags": { "statusBarItems": [ diff --git a/project/enemys.js b/project/enemys.js index 8c80082..265b918 100644 --- a/project/enemys.js +++ b/project/enemys.js @@ -1,84 +1,84 @@ var enemys_fcae963b_31c9_42b4_b48c_bb48d09f3f80 = { - "greenSlime": {"name":"绿头怪","hp":0,"atk":0,"def":0,"money":0,"exp":0,"point":0,"special":0,"magic":false,"mdef":0}, - "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":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}, - "skeleton": {"name":"骷髅人","hp":0,"atk":0,"def":0,"money":0,"exp":0,"point":0,"special":0}, - "skeletonCaptain": {"name":"骷髅队长","hp":0,"atk":0,"def":0,"money":0,"exp":0,"point":0,"special":0}, - "zombie": {"name":"兽人","hp":0,"atk":0,"def":0,"money":0,"exp":0,"point":0,"special":0,"magic":false}, - "zombieKnight": {"name":"兽人武士","hp":0,"atk":0,"def":0,"money":0,"exp":0,"point":0,"special":0}, - "rock": {"name":"石头人","hp":50,"atk":50,"def":0,"money":3,"exp":0,"point":0,"special":3}, - "bluePriest": {"name":"初级法师","hp":100,"atk":120,"def":0,"money":3,"exp":0,"point":1,"special":[9]}, - "redPriest": {"name":"高级法师","hp":0,"atk":0,"def":0,"money":0,"exp":0,"point":0,"special":0}, - "brownWizard": {"name":"初级巫师","hp":100,"atk":120,"def":0,"money":16,"exp":0,"point":0,"special":15,"value":100,"range":2}, - "redWizard": {"name":"高级巫师","hp":1000,"atk":1200,"def":0,"money":160,"exp":0,"point":0,"special":15,"value":200,"zoneSquare":true}, - "swordsman": {"name":"双手剑士","hp":100,"atk":120,"def":0,"money":6,"exp":3,"point":0,"special":4}, - "soldier": {"name":"冥战士","hp":120,"atk":50,"def":8,"money":10,"exp":7,"point":0,"special":0}, - "yellowKnight": {"name":"金骑士","hp":0,"atk":0,"def":0,"money":0,"exp":0,"point":0,"special":0}, - "redKnight": {"name":"红骑士","hp":500,"atk":200,"def":50,"money":0,"exp":0,"point":0,"special":[7]}, - "darkKnight": {"name":"黑骑士","hp":0,"atk":0,"def":0,"money":0,"exp":0,"point":0,"special":0}, - "blueKnight": {"name":"蓝骑士","hp":100,"atk":120,"def":0,"money":9,"exp":0,"point":0,"special":8}, - "goldSlime": {"name":"黄头怪","hp":0,"atk":0,"def":0,"money":0,"exp":0,"point":0,"special":0}, - "poisonSkeleton": {"name":"紫骷髅","hp":50,"atk":60,"def":70,"money":80,"exp":0,"point":0,"special":13}, - "poisonBat": {"name":"紫蝙蝠","hp":100,"atk":120,"def":0,"money":14,"exp":0,"point":0,"special":13}, - "skeletonPriest": {"name":"骷髅法师","hp":100,"atk":100,"def":0,"money":0,"exp":0,"point":0,"special":18,"value":20}, - "skeletonKing": {"name":"骷髅王","hp":0,"atk":0,"def":0,"money":0,"exp":0,"point":0,"special":0}, - "evilHero": {"name":"迷失勇者","hp":0,"atk":0,"def":0,"money":0,"exp":0,"point":0,"special":0}, - "demonPriest": {"name":"魔神法师","hp":0,"atk":0,"def":0,"money":0,"exp":0,"point":0,"special":0}, - "goldHornSlime": {"name":"金角怪","hp":0,"atk":0,"def":0,"money":0,"exp":0,"point":0,"special":0}, - "silverSlime": {"name":"银头怪","hp":100,"atk":120,"def":0,"money":15,"exp":0,"point":0,"special":14}, + "greenSlime": {"name":"绿头怪","hp":0,"atk":0,"def":0,"money":0,"exp":0,"point":0,"special":0,"mdef":0,"spell":0,"speed":1}, + "redSlime": {"name":"红头怪","hp":0,"atk":0,"def":0,"money":0,"exp":0,"point":0,"special":[],"value":10,"mdef":0,"spell":0,"speed":1}, + "blackSlime": {"name":"青头怪","hp":0,"atk":0,"def":0,"money":0,"exp":0,"point":0,"special":0,"mdef":0,"spell":0,"speed":1}, + "slimelord": {"name":"怪王","hp":790,"atk":48,"def":8,"money":10,"exp":0,"point":0,"special":[],"mdef":0,"spell":0,"speed":20}, + "bat": {"name":"小蝙蝠","hp":100,"atk":50,"def":30,"money":2,"exp":0,"point":0,"special":[1],"mdef":0,"speed":15,"spell":0}, + "bigBat": {"name":"大蝙蝠","hp":0,"atk":0,"def":0,"money":0,"exp":0,"point":0,"special":0,"mdef":0,"spell":0,"speed":1}, + "redBat": {"name":"红蝙蝠","hp":0,"atk":0,"def":0,"money":0,"exp":0,"point":0,"special":[],"mdef":0,"spell":0,"speed":1}, + "vampire": {"name":"冥灵魔王","hp":888,"atk":888,"def":888,"money":888,"exp":888,"point":0,"special":[6],"n":8,"mdef":0,"spell":0,"speed":1}, + "skeleton": {"name":"骷髅人","hp":0,"atk":0,"def":0,"money":0,"exp":0,"point":0,"special":0,"mdef":0,"spell":0,"speed":1}, + "skeletonCaptain": {"name":"骷髅队长","hp":0,"atk":0,"def":0,"money":0,"exp":0,"point":0,"special":0,"mdef":0,"spell":0,"speed":1}, + "zombie": {"name":"兽人","hp":0,"atk":0,"def":0,"money":0,"exp":0,"point":0,"special":[22],"mdef":0,"spell":0,"speed":1}, + "zombieKnight": {"name":"兽人武士","hp":10000,"atk":100,"def":100,"money":0,"exp":0,"point":0,"special":[22],"speed":10,"mdef":0,"damage2":20,"spell":0}, + "rock": {"name":"石头人","hp":50,"atk":50,"def":0,"money":3,"exp":0,"point":0,"special":3,"damage2":15,"mdef":0,"spell":0,"speed":1}, + "bluePriest": {"name":"初级法师","hp":100,"atk":120,"def":0,"money":3,"exp":0,"point":1,"special":[9],"mdef":0,"spell":0,"speed":1}, + "redPriest": {"name":"高级法师","hp":162,"atk":0,"def":1,"money":0,"exp":0,"point":0,"special":[1],"mdef":0,"spell":308,"speed":14}, + "brownWizard": {"name":"初级巫师","hp":162,"atk":120,"def":1,"money":16,"exp":0,"point":0,"special":[],"value":null,"range":2,"mdef":0,"spell":66,"speed":14}, + "redWizard": {"name":"高级巫师","hp":1000,"atk":1200,"def":0,"money":160,"exp":0,"point":0,"special":15,"value":200,"zoneSquare":true,"mdef":0,"spell":0,"speed":1}, + "swordsman": {"name":"双手剑士","hp":100,"atk":120,"def":0,"money":6,"exp":3,"point":0,"special":4,"mdef":0,"spell":0,"speed":1}, + "soldier": {"name":"冥战士","hp":120,"atk":50,"def":8,"money":10,"exp":7,"point":0,"special":0,"mdef":0,"spell":0,"speed":8}, + "yellowKnight": {"name":"金骑士","hp":0,"atk":0,"def":0,"money":0,"exp":0,"point":0,"special":0,"mdef":0,"spell":0,"speed":1}, + "redKnight": {"name":"红骑士","hp":500,"atk":200,"def":50,"money":0,"exp":0,"point":0,"special":[7],"mdef":0,"spell":0,"speed":1}, + "darkKnight": {"name":"黑骑士","hp":0,"atk":0,"def":0,"money":0,"exp":0,"point":0,"special":0,"mdef":0,"spell":0,"speed":1}, + "blueKnight": {"name":"蓝骑士","hp":100,"atk":120,"def":0,"money":9,"exp":0,"point":0,"special":8,"mdef":0,"spell":0,"speed":1}, + "goldSlime": {"name":"黄头怪","hp":0,"atk":0,"def":0,"money":0,"exp":0,"point":0,"special":0,"mdef":0,"spell":0,"speed":1}, + "poisonSkeleton": {"name":"紫骷髅","hp":50,"atk":60,"def":70,"money":80,"exp":0,"point":0,"special":13,"mdef":0,"spell":0,"speed":1}, + "poisonBat": {"name":"紫蝙蝠","hp":100,"atk":120,"def":0,"money":14,"exp":0,"point":0,"special":13,"mdef":0,"spell":0,"speed":1}, + "skeletonPriest": {"name":"骷髅法师","hp":100,"atk":100,"def":0,"money":0,"exp":0,"point":0,"special":18,"value":20,"mdef":0,"spell":0,"speed":1}, + "skeletonKing": {"name":"骷髅王","hp":0,"atk":0,"def":0,"money":0,"exp":0,"point":0,"special":0,"mdef":0,"spell":0,"speed":1}, + "evilHero": {"name":"迷失勇者","hp":0,"atk":0,"def":0,"money":0,"exp":0,"point":0,"special":0,"mdef":0,"spell":0,"speed":1}, + "demonPriest": {"name":"魔神法师","hp":0,"atk":0,"def":0,"money":0,"exp":0,"point":0,"special":0,"mdef":0,"spell":0,"speed":1}, + "goldHornSlime": {"name":"金角怪","hp":0,"atk":0,"def":0,"money":0,"exp":0,"point":0,"special":0,"mdef":0,"spell":0,"speed":1}, + "silverSlime": {"name":"银头怪","hp":100,"atk":120,"def":0,"money":15,"exp":0,"point":0,"special":14,"mdef":0,"spell":0,"speed":1}, "whiteHornSlime": {"name":"尖角怪","hp":0,"atk":0,"def":0,"money":0,"exp":0,"point":0,"special":0}, - "redSwordsman": {"name":"剑王","hp":0,"atk":0,"def":0,"money":0,"exp":0,"point":0,"special":[]}, - "poisonZombie": {"name":"绿兽人","hp":100,"atk":120,"def":0,"money":13,"exp":0,"point":0,"special":[12]}, - "octopus": {"name":"血影","hp":0,"atk":0,"def":0,"money":0,"exp":0,"point":0,"special":0,"bigImage":null}, - "princessEnemy": {"name":"假公主","hp":0,"atk":0,"def":0,"money":0,"exp":0,"point":0,"special":0}, - "angel": {"name":"天使","hp":0,"atk":0,"def":0,"money":0,"exp":0,"point":0,"special":0}, - "elemental": {"name":"元素生物","hp":0,"atk":0,"def":0,"money":0,"exp":0,"point":0,"special":0}, - "steelGuard": {"name":"铁守卫","hp":50,"atk":50,"def":50,"money":0,"exp":0,"point":0,"special":[18],"value":20}, - "evilBat": {"name":"邪恶蝙蝠","hp":0,"atk":0,"def":0,"money":0,"exp":0,"point":0,"special":0}, - "silverSlimelord": {"name":"银怪王","hp":0,"atk":0,"def":0,"money":0,"exp":0,"point":0,"special":0}, - "goldSlimelord": {"name":"金怪王","hp":0,"atk":0,"def":0,"money":0,"exp":0,"point":0,"special":0}, - "skeletonWarrior": {"name":"骷髅士兵","hp":0,"atk":0,"def":0,"money":0,"exp":0,"point":0,"special":0}, - "whiteSlimeman": {"name":"水银战士","hp":0,"atk":0,"def":0,"money":0,"exp":0,"point":0,"special":0}, - "slimeman": {"name":"影子战士","hp":100,"atk":0,"def":0,"money":11,"exp":0,"point":0,"special":[9],"atkValue":2,"defValue":3}, - "yellowGateKeeper": {"name":"初级卫兵","hp":80,"atk":25,"def":5,"money":3,"exp":1,"point":0,"special":0}, - "blueGateKeeper": {"name":"中级卫兵","hp":80,"atk":25,"def":5,"money":3,"exp":1,"point":0,"special":0}, - "redGateKeeper": {"name":"高级卫兵","hp":0,"atk":0,"def":0,"money":0,"exp":0,"point":0,"special":0}, - "magicMaster": {"name":"黑暗大法师","hp":100,"atk":120,"def":0,"money":12,"exp":0,"point":0,"special":11,"value":0.3333333333333333,"add":true,"notBomb":true}, - "devilWarrior": {"name":"魔神武士","hp":0,"atk":0,"def":0,"money":0,"exp":0,"point":0,"special":0}, - "fairyEnemy": {"name":"仙子","hp":0,"atk":0,"def":0,"money":0,"exp":0,"point":0,"special":0}, - "dragon": {"name":"魔龙","hp":0,"atk":0,"def":0,"money":0,"exp":0,"point":0,"special":0,"bigImage":null}, - "skeletonKnight": {"name":"骷髅武士","hp":0,"atk":0,"def":0,"money":0,"exp":0,"point":0,"special":0}, - "skeletonPresbyter": {"name":"骷髅巫师","hp":0,"atk":0,"def":0,"money":0,"exp":0,"point":0,"special":0}, - "ironRock": {"name":"铁面人","hp":0,"atk":0,"def":0,"money":0,"exp":0,"point":0,"special":0}, - "grayRock": {"name":"灰色石头人","hp":0,"atk":0,"def":0,"money":0,"exp":0,"point":0,"special":0}, - "yellowPriest": {"name":"中级法师","hp":0,"atk":0,"def":0,"money":0,"exp":0,"point":0,"special":0}, - "evilPrincess": {"name":"痛苦魔女","hp":1000,"atk":0,"def":0,"money":0,"exp":0,"point":0,"special":[10]}, + "redSwordsman": {"name":"剑王","hp":0,"atk":0,"def":0,"money":0,"exp":0,"point":0,"special":[],"mdef":0,"spell":0,"speed":1}, + "poisonZombie": {"name":"绿兽人","hp":100,"atk":120,"def":0,"money":13,"exp":0,"point":0,"special":[12],"mdef":0,"spell":0,"speed":1}, + "octopus": {"name":"血影","hp":0,"atk":0,"def":0,"money":0,"exp":0,"point":0,"special":0,"bigImage":null,"mdef":0,"spell":0,"speed":1}, + "princessEnemy": {"name":"假公主","hp":0,"atk":0,"def":0,"money":0,"exp":0,"point":0,"special":0,"mdef":0,"spell":0,"speed":1}, + "angel": {"name":"天使","hp":0,"atk":0,"def":0,"money":0,"exp":0,"point":0,"special":0,"mdef":0,"spell":0,"speed":1}, + "elemental": {"name":"元素生物","hp":0,"atk":0,"def":0,"money":0,"exp":0,"point":0,"special":0,"mdef":0,"spell":0,"speed":1}, + "steelGuard": {"name":"铁守卫","hp":50,"atk":50,"def":50,"money":0,"exp":0,"point":0,"special":[18],"value":20,"mdef":0,"spell":0,"speed":1}, + "evilBat": {"name":"邪恶蝙蝠","hp":0,"atk":0,"def":0,"money":0,"exp":0,"point":0,"special":0,"mdef":0,"spell":0,"speed":1}, + "silverSlimelord": {"name":"银怪王","hp":0,"atk":0,"def":0,"money":0,"exp":0,"point":0,"special":0,"mdef":0,"spell":0,"speed":1}, + "goldSlimelord": {"name":"金怪王","hp":0,"atk":0,"def":0,"money":0,"exp":0,"point":0,"special":0,"mdef":0,"spell":0,"speed":1}, + "skeletonWarrior": {"name":"骷髅士兵","hp":0,"atk":0,"def":0,"money":0,"exp":0,"point":0,"special":0,"mdef":0,"spell":0,"speed":1}, + "whiteSlimeman": {"name":"水银战士","hp":0,"atk":0,"def":0,"money":0,"exp":0,"point":0,"special":0,"mdef":0,"spell":0,"speed":1}, + "slimeman": {"name":"影子战士","hp":100,"atk":0,"def":0,"money":11,"exp":0,"point":0,"special":[9],"atkValue":2,"defValue":3,"mdef":0,"spell":0,"speed":1}, + "yellowGateKeeper": {"name":"初级卫兵","hp":80,"atk":25,"def":5,"money":3,"exp":1,"point":0,"special":0,"mdef":0,"spell":0,"speed":1}, + "blueGateKeeper": {"name":"中级卫兵","hp":80,"atk":25,"def":5,"money":3,"exp":1,"point":0,"special":0,"mdef":0,"spell":0,"speed":1}, + "redGateKeeper": {"name":"高级卫兵","hp":0,"atk":0,"def":0,"money":0,"exp":0,"point":0,"special":0,"mdef":0,"spell":0,"speed":1}, + "magicMaster": {"name":"黑暗大法师","hp":100,"atk":120,"def":0,"money":12,"exp":0,"point":0,"special":11,"value":0.3333333333333333,"add":true,"notBomb":true,"mdef":0,"spell":0,"speed":1}, + "devilWarrior": {"name":"魔神武士","hp":0,"atk":0,"def":0,"money":0,"exp":0,"point":0,"special":0,"mdef":0,"spell":0,"speed":1}, + "fairyEnemy": {"name":"仙子","hp":0,"atk":0,"def":0,"money":0,"exp":0,"point":0,"special":0,"mdef":0,"spell":0,"speed":1}, + "dragon": {"name":"魔龙","hp":0,"atk":0,"def":0,"money":0,"exp":0,"point":0,"special":0,"bigImage":null,"mdef":0,"spell":0,"speed":1}, + "skeletonKnight": {"name":"骷髅武士","hp":330,"atk":113,"def":2,"money":0,"exp":0,"point":0,"special":0,"mdef":0,"spell":0,"speed":20}, + "skeletonPresbyter": {"name":"骷髅巫师","hp":0,"atk":0,"def":0,"money":0,"exp":0,"point":0,"special":0,"mdef":0,"spell":0,"speed":1}, + "ironRock": {"name":"铁面人","hp":111,"atk":97,"def":37,"money":0,"exp":0,"point":0,"special":[3],"mdef":0,"spell":0,"speed":14}, + "grayRock": {"name":"灰色石头人","hp":0,"atk":0,"def":0,"money":0,"exp":0,"point":0,"special":0,"mdef":0,"spell":0,"speed":1}, + "yellowPriest": {"name":"中级法师","hp":0,"atk":0,"def":0,"money":0,"exp":0,"point":0,"special":0,"mdef":0,"spell":0,"speed":1}, + "evilPrincess": {"name":"痛苦魔女","hp":1000,"atk":0,"def":0,"money":0,"exp":0,"point":0,"special":[10],"mdef":0,"spell":0,"speed":1}, "blademaster": {"name":"剑圣","hp":0,"atk":0,"def":0,"money":0,"exp":0,"point":0,"special":0}, - "evilFairy": {"name":"黑暗仙子","hp":0,"atk":0,"def":0,"money":0,"exp":0,"point":0,"special":0}, - "greenKnight": {"name":"强盾骑士","hp":0,"atk":0,"def":0,"money":0,"exp":0,"point":0,"special":0}, - "bowman": {"name":"初级弓兵","hp":0,"atk":0,"def":0,"money":0,"exp":0,"point":0,"special":0}, - "watcherSlime": {"name":"邪眼怪","hp":0,"atk":0,"def":0,"money":0,"exp":0,"point":0,"special":0}, - "devilKnight": {"name":"恶灵骑士","hp":150,"atk":100,"def":50,"money":0,"exp":0,"point":0,"special":[1,5,7,8]}, - "grayPriest": {"name":"混沌法师","hp":0,"atk":0,"def":0,"money":0,"exp":0,"point":0,"special":0}, - "greenGateKeeper": {"name":"卫兵队长","hp":0,"atk":0,"def":0,"money":0,"exp":0,"point":0,"special":0}, - "ghostSoldier": {"name":"冥队长","hp":200,"atk":100,"def":50,"money":0,"exp":0,"point":0,"special":8}, - "frostBat": {"name":"寒蝙蝠","hp":0,"atk":0,"def":0,"money":0,"exp":0,"point":0,"special":0}, - "blackKing": {"name":"黑衣魔王","hp":1000,"atk":500,"def":0,"money":1000,"exp":1000,"point":0,"special":0,"notBomb":true}, - "yellowKing": {"name":"黄衣魔王","hp":0,"atk":0,"def":0,"money":0,"exp":0,"point":0,"special":0}, - "greenKing": {"name":"青衣武士","hp":0,"atk":0,"def":0,"money":0,"exp":0,"point":0,"special":0}, - "redKing": {"name":"红衣魔王","hp":0,"atk":0,"def":0,"money":0,"exp":0,"point":0,"special":0}, - "blueKing": {"name":"白衣武士","hp":100,"atk":120,"def":0,"money":17,"exp":0,"point":0,"special":[16]}, - "keiskeiFairy": {"name":"铃兰花妖","hp":0,"atk":0,"def":0,"money":0,"exp":0,"point":0,"special":0}, - "tulipFairy": {"name":"郁金香花妖","hp":0,"atk":0,"def":0,"money":0,"exp":0,"point":0,"special":0}, - "purpleBowman": {"name":"高级弓兵","hp":0,"atk":0,"def":0,"money":0,"exp":0,"point":0,"special":0}, - "bearDown": {"name":"熊出没","hp":0,"atk":0,"def":0,"money":0,"exp":0,"point":0,"special":[],"faceIds":{"down":"bearDown","left":"bearLeft","right":"bearRight","up":"bearUp"},"bigImage":"bear.png"}, - "bearLeft": {"name":"熊出没","hp":0,"atk":0,"def":0,"money":0,"exp":0,"point":0,"special":[],"faceIds":{"down":"bearDown","left":"bearLeft","right":"bearRight","up":"bearUp"}}, - "bearRight": {"name":"熊出没","hp":0,"atk":0,"def":0,"money":0,"exp":0,"point":0,"special":[],"faceIds":{"down":"bearDown","left":"bearLeft","right":"bearRight","up":"bearUp"}}, - "bearUp": {"name":"熊出没","hp":0,"atk":0,"def":0,"money":0,"exp":0,"point":0,"special":[],"faceIds":{"down":"bearDown","left":"bearLeft","right":"bearRight","up":"bearUp"}} + "evilFairy": {"name":"黑暗仙子","hp":0,"atk":0,"def":0,"money":0,"exp":0,"point":0,"special":0,"mdef":0,"spell":0,"speed":1}, + "greenKnight": {"name":"强盾骑士","hp":0,"atk":0,"def":0,"money":0,"exp":0,"point":0,"special":0,"mdef":0,"spell":0,"speed":1}, + "bowman": {"name":"初级弓兵","hp":0,"atk":0,"def":0,"money":0,"exp":0,"point":0,"special":0,"mdef":0,"spell":0,"speed":1}, + "watcherSlime": {"name":"邪眼怪","hp":0,"atk":0,"def":0,"money":0,"exp":0,"point":0,"special":0,"mdef":0,"spell":0,"speed":1}, + "devilKnight": {"name":"恶灵骑士","hp":150,"atk":100,"def":50,"money":0,"exp":0,"point":0,"special":[1,5,7,8],"mdef":0,"spell":0,"speed":1}, + "grayPriest": {"name":"混沌法师","hp":0,"atk":0,"def":0,"money":0,"exp":0,"point":0,"special":0,"mdef":0,"spell":0,"speed":1}, + "greenGateKeeper": {"name":"卫兵队长","hp":0,"atk":0,"def":0,"money":0,"exp":0,"point":0,"special":0,"mdef":0,"spell":0,"speed":1}, + "ghostSoldier": {"name":"冥队长","hp":200,"atk":100,"def":50,"money":0,"exp":0,"point":0,"special":8,"mdef":0,"spell":0,"speed":1}, + "frostBat": {"name":"寒蝙蝠","hp":0,"atk":0,"def":0,"money":0,"exp":0,"point":0,"special":0,"mdef":0,"spell":0,"speed":1}, + "blackKing": {"name":"黑衣魔王","hp":1000,"atk":500,"def":0,"money":1000,"exp":1000,"point":0,"special":0,"notBomb":true,"mdef":0,"spell":0,"speed":1}, + "yellowKing": {"name":"黄衣魔王","hp":0,"atk":0,"def":0,"money":0,"exp":0,"point":0,"special":0,"mdef":0,"spell":0,"speed":1}, + "greenKing": {"name":"青衣武士","hp":0,"atk":0,"def":0,"money":0,"exp":0,"point":0,"special":0,"mdef":0,"spell":0,"speed":1}, + "redKing": {"name":"红衣魔王","hp":0,"atk":0,"def":0,"money":0,"exp":0,"point":0,"special":0,"mdef":0,"spell":0,"speed":1}, + "blueKing": {"name":"白衣武士","hp":100,"atk":120,"def":0,"money":17,"exp":0,"point":0,"special":[16],"mdef":0,"spell":0,"speed":1}, + "keiskeiFairy": {"name":"铃兰花妖","hp":0,"atk":0,"def":0,"money":0,"exp":0,"point":0,"special":0,"mdef":0,"spell":0,"speed":1}, + "tulipFairy": {"name":"郁金香花妖","hp":0,"atk":0,"def":0,"money":0,"exp":0,"point":0,"special":0,"mdef":0,"spell":0,"speed":1}, + "purpleBowman": {"name":"高级弓兵","hp":0,"atk":0,"def":0,"money":0,"exp":0,"point":0,"special":0,"mdef":0,"spell":0,"speed":1}, + "bearDown": {"name":"熊出没","hp":0,"atk":0,"def":0,"money":0,"exp":0,"point":0,"special":[],"faceIds":{"down":"bearDown","left":"bearLeft","right":"bearRight","up":"bearUp"},"bigImage":"bear.png","mdef":0,"spell":0,"speed":1}, + "bearLeft": {"name":"熊出没","hp":0,"atk":0,"def":0,"money":0,"exp":0,"point":0,"special":[],"faceIds":{"down":"bearDown","left":"bearLeft","right":"bearRight","up":"bearUp"},"mdef":0,"spell":0,"speed":1}, + "bearRight": {"name":"熊出没","hp":0,"atk":0,"def":0,"money":0,"exp":0,"point":0,"special":[],"faceIds":{"down":"bearDown","left":"bearLeft","right":"bearRight","up":"bearUp"},"mdef":0,"spell":0,"speed":1}, + "bearUp": {"name":"熊出没","hp":0,"atk":0,"def":0,"money":0,"exp":0,"point":0,"special":[],"faceIds":{"down":"bearDown","left":"bearLeft","right":"bearRight","up":"bearUp"},"mdef":0,"spell":0,"speed":1} } \ No newline at end of file diff --git a/project/events.js b/project/events.js index 71a864c..9f5e38e 100644 --- a/project/events.js +++ b/project/events.js @@ -154,996 +154,1010 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "time": 50 }, { - "type": "changebg", - "img1": "", - "memory1": false, - "img2": "", - "memory2": false, - "time": 30, - "style": "引入" - }, - { - "type": "over", - "text": "人生不如意事,十常居七八。", - "image": "", - "memory": false, - "time": 50, - "hidetime": 30, - "sound": "", - "textColor": [ - 255, - 255, - 255, - 1 - ], - "boldColor": [ - 0, - 0, - 0, - 1 - ], - "font": "bold 48px Verdana" - }, - { - "type": "over", - "text": "世间的万物皆被装缀着不公的色彩。", - "image": "", - "memory": false, - "time": 50, - "hidetime": 30, - "sound": "", - "textColor": [ - 255, - 255, - 255, - 1 - ], - "boldColor": [ - 0, - 0, - 0, - 1 - ], - "font": "bold 48px Verdana" - }, - { - "type": "over", - "text": "没错,就像——", - "image": "", - "memory": false, - "time": 50, - "hidetime": 30, - "sound": "", - "textColor": [ - 255, - 255, - 255, - 1 - ], - "boldColor": [ - 0, - 0, - 0, - 1 - ], - "font": "bold 48px Verdana" - }, - { - "type": "over", - "text": "十几年前的那一天,", - "image": "", - "memory": false, - "time": 50, - "hidetime": 30, - "sound": "", - "textColor": [ - 255, - 255, - 255, - 1 - ], - "boldColor": [ - 0, - 0, - 0, - 1 - ], - "font": "bold 48px Verdana" - }, - { - "type": "over", - "text": "在都市的角落,同许多的生命共同消逝一般。", - "image": "", - "memory": false, - "time": 50, - "hidetime": 30, - "sound": "", - "textColor": [ - 255, - 255, - 255, - 1 - ], - "boldColor": [ - 0, - 0, - 0, - 1 - ], - "font": "bold 48px Verdana" - }, - { - "type": "over", - "text": "没错,就像——", - "image": "", - "memory": false, - "time": 50, - "hidetime": 30, - "sound": "", - "textColor": [ - 255, - 255, - 255, - 1 - ], - "boldColor": [ - 0, - 0, - 0, - 1 - ], - "font": "bold 48px Verdana" - }, - { - "type": "over", - "text": "十几年前的那天起以来,", - "image": "", - "memory": false, - "time": 50, - "hidetime": 30, - "sound": "", - "textColor": [ - 255, - 255, - 255, - 1 - ], - "boldColor": [ - 0, - 0, - 0, - 1 - ], - "font": "bold 48px Verdana" - }, - { - "type": "over", - "text": "无数的生命被那无法逃脱的污泥囚禁一样。", - "image": "", - "memory": false, - "time": 50, - "hidetime": 30, - "sound": "", - "textColor": [ - 255, - 255, - 255, - 1 - ], - "boldColor": [ - 0, - 0, - 0, - 1 - ], - "font": "bold 48px Verdana" - }, - { - "type": "over", - "text": "人生不如意事,十常居七八。", - "image": "", - "memory": false, - "time": 50, - "hidetime": 30, - "sound": "", - "textColor": [ - 255, - 255, - 255, - 1 - ], - "boldColor": [ - 0, - 0, - 0, - 1 - ], - "font": "bold 48px Verdana" - }, - { - "type": "over", - "text": "世间的万物皆被装缀着不公的色彩。", - "image": "", - "memory": false, - "time": 50, - "hidetime": 30, - "sound": "", - "textColor": [ - 255, - 255, - 255, - 1 - ], - "boldColor": [ - 0, - 0, - 0, - 1 - ], - "font": "bold 48px Verdana" - }, - { - "type": "over", - "text": "没错,就像——", - "image": "", - "memory": false, - "time": 50, - "hidetime": 30, - "sound": "", - "textColor": [ - 255, - 255, - 255, - 1 - ], - "boldColor": [ - 0, - 0, - 0, - 1 - ], - "font": "bold 48px Verdana" - }, - { - "type": "over", - "text": "如今,这一天。", - "image": "", - "memory": false, - "time": 50, - "hidetime": 30, - "sound": "", - "textColor": [ - 255, - 255, - 255, - 1 - ], - "boldColor": [ - 0, - 0, - 0, - 1 - ], - "font": "bold 48px Verdana" - }, - { - "type": "changebg", - "img1": "", - "memory1": false, - "img2": "other_0001.webp", - "memory2": false, - "time": 30, - "style": "场景切换" - }, - { - "type": "playBgm", - "name": "Blood_Stain.opus", - "keep": true - }, - { - "type": "cgtextList", - "textList": "chapter0" - }, - { - "type": "cgtext", - "bg": "other_0001.webp", - "memory": false, - "WindowSkin": false, - "head": { - "name": "", - "px": -300 - }, - "index": "0", - "time": 30, - "wait": 1000, - "bodyList": [ + "type": "confirm", + "text": "跳过傻逼不能点点点快进的旁白", + "yes": [], + "no": [ { - "name": "", - "px": 100, - "filter": false + "type": "changebg", + "img1": "", + "memory1": false, + "img2": "", + "memory2": false, + "time": 30, + "style": "引入" + }, + { + "type": "over", + "text": "人生不如意事,十常居七八。", + "image": "", + "memory": false, + "time": 50, + "hidetime": 30, + "sound": "", + "textColor": [ + 255, + 255, + 255, + 1 + ], + "boldColor": [ + 0, + 0, + 0, + 1 + ], + "font": "bold 48px Verdana" + }, + { + "type": "over", + "text": "世间的万物皆被装缀着不公的色彩。", + "image": "", + "memory": false, + "time": 50, + "hidetime": 30, + "sound": "", + "textColor": [ + 255, + 255, + 255, + 1 + ], + "boldColor": [ + 0, + 0, + 0, + 1 + ], + "font": "bold 48px Verdana" + }, + { + "type": "over", + "text": "没错,就像——", + "image": "", + "memory": false, + "time": 50, + "hidetime": 30, + "sound": "", + "textColor": [ + 255, + 255, + 255, + 1 + ], + "boldColor": [ + 0, + 0, + 0, + 1 + ], + "font": "bold 48px Verdana" + }, + { + "type": "over", + "text": "十几年前的那一天,", + "image": "", + "memory": false, + "time": 50, + "hidetime": 30, + "sound": "", + "textColor": [ + 255, + 255, + 255, + 1 + ], + "boldColor": [ + 0, + 0, + 0, + 1 + ], + "font": "bold 48px Verdana" + }, + { + "type": "over", + "text": "在都市的角落,同许多的生命共同消逝一般。", + "image": "", + "memory": false, + "time": 50, + "hidetime": 30, + "sound": "", + "textColor": [ + 255, + 255, + 255, + 1 + ], + "boldColor": [ + 0, + 0, + 0, + 1 + ], + "font": "bold 48px Verdana" + }, + { + "type": "over", + "text": "没错,就像——", + "image": "", + "memory": false, + "time": 50, + "hidetime": 30, + "sound": "", + "textColor": [ + 255, + 255, + 255, + 1 + ], + "boldColor": [ + 0, + 0, + 0, + 1 + ], + "font": "bold 48px Verdana" + }, + { + "type": "over", + "text": "十几年前的那天起以来,", + "image": "", + "memory": false, + "time": 50, + "hidetime": 30, + "sound": "", + "textColor": [ + 255, + 255, + 255, + 1 + ], + "boldColor": [ + 0, + 0, + 0, + 1 + ], + "font": "bold 48px Verdana" + }, + { + "type": "over", + "text": "无数的生命被那无法逃脱的污泥囚禁一样。", + "image": "", + "memory": false, + "time": 50, + "hidetime": 30, + "sound": "", + "textColor": [ + 255, + 255, + 255, + 1 + ], + "boldColor": [ + 0, + 0, + 0, + 1 + ], + "font": "bold 48px Verdana" + }, + { + "type": "over", + "text": "人生不如意事,十常居七八。", + "image": "", + "memory": false, + "time": 50, + "hidetime": 30, + "sound": "", + "textColor": [ + 255, + 255, + 255, + 1 + ], + "boldColor": [ + 0, + 0, + 0, + 1 + ], + "font": "bold 48px Verdana" + }, + { + "type": "over", + "text": "世间的万物皆被装缀着不公的色彩。", + "image": "", + "memory": false, + "time": 50, + "hidetime": 30, + "sound": "", + "textColor": [ + 255, + 255, + 255, + 1 + ], + "boldColor": [ + 0, + 0, + 0, + 1 + ], + "font": "bold 48px Verdana" + }, + { + "type": "over", + "text": "没错,就像——", + "image": "", + "memory": false, + "time": 50, + "hidetime": 30, + "sound": "", + "textColor": [ + 255, + 255, + 255, + 1 + ], + "boldColor": [ + 0, + 0, + 0, + 1 + ], + "font": "bold 48px Verdana" + }, + { + "type": "over", + "text": "如今,这一天。", + "image": "", + "memory": false, + "time": 50, + "hidetime": 30, + "sound": "", + "textColor": [ + 255, + 255, + 255, + 1 + ], + "boldColor": [ + 0, + 0, + 0, + 1 + ], + "font": "bold 48px Verdana" } ] }, { - "type": "cgtext", - "bg": "other_0001.webp", - "memory": false, - "WindowSkin": false, - "head": { - "name": "", - "px": -300 - }, - "index": "1", - "time": 30, - "wait": 1000, - "bodyList": [ + "type": "confirm", + "text": "我他妈要全跳了", + "yes": [], + "no": [ { - "name": "", - "px": 100, - "filter": false - } - ] - }, - { - "type": "cgtext", - "bg": "other_0001.webp", - "memory": false, - "WindowSkin": false, - "head": { - "name": "", - "px": -300 - }, - "index": "2", - "time": 30, - "wait": 1000, - "bodyList": [ + "type": "changebg", + "img1": "", + "memory1": false, + "img2": "other_0001.webp", + "memory2": false, + "time": 30, + "style": "场景切换" + }, { - "name": "", - "px": 100, - "filter": false - } - ] - }, - { - "type": "changebg", - "img1": "other_0001.webp", - "memory1": false, - "img2": "bg_3563.webp", - "memory2": false, - "time": 30, - "style": "场景切换" - }, - { - "type": "cgtext", - "bg": "bg_3563.webp", - "memory": false, - "WindowSkin": false, - "head": { - "name": "", - "px": -300 - }, - "index": "3", - "time": 30, - "wait": 1000, - "bodyList": [ + "type": "playBgm", + "name": "Blood_Stain.opus", + "keep": true + }, { - "name": "", - "px": 100, - "filter": false - } - ] - }, - { - "type": "cgtext", - "bg": "bg_3563.webp", - "memory": false, - "WindowSkin": false, - "head": { - "name": "", - "px": -300 - }, - "index": "4", - "time": 30, - "wait": 1000, - "bodyList": [ + "type": "cgtextList", + "textList": "chapter000" + }, { - "name": "", - "px": 100, - "filter": false - } - ] - }, - { - "type": "cgtext", - "bg": "bg_3563.webp", - "memory": false, - "WindowSkin": false, - "head": { - "name": "", - "px": -300 - }, - "index": "5", - "time": 30, - "wait": 1000, - "bodyList": [ + "type": "cgtext", + "bg": "other_0001.webp", + "memory": false, + "WindowSkin": false, + "head": { + "name": "", + "px": -300 + }, + "index": "0", + "time": 30, + "wait": 1000, + "bodyList": [ + { + "name": "", + "px": 100, + "filter": false + } + ] + }, { - "name": "", - "px": 100, - "filter": false - } - ] - }, - { - "type": "cgtext", - "bg": "bg_3563.webp", - "memory": false, - "WindowSkin": false, - "head": { - "name": "", - "px": -300 - }, - "index": "6", - "time": 30, - "wait": 1000, - "bodyList": [ + "type": "cgtext", + "bg": "other_0001.webp", + "memory": false, + "WindowSkin": false, + "head": { + "name": "", + "px": -300 + }, + "index": "1", + "time": 30, + "wait": 1000, + "bodyList": [ + { + "name": "", + "px": 100, + "filter": false + } + ] + }, { - "name": "", - "px": 100, - "filter": false - } - ] - }, - { - "type": "cgtext", - "bg": "bg_3563.webp", - "memory": false, - "WindowSkin": false, - "head": { - "name": "", - "px": -300 - }, - "index": "7", - "time": 30, - "wait": 1000, - "bodyList": [ + "type": "cgtext", + "bg": "other_0001.webp", + "memory": false, + "WindowSkin": false, + "head": { + "name": "", + "px": -300 + }, + "index": "2", + "time": 30, + "wait": 1000, + "bodyList": [ + { + "name": "", + "px": 100, + "filter": false + } + ] + }, { - "name": "", - "px": 100, - "filter": false - } - ] - }, - { - "type": "cgtext", - "bg": "bg_3563.webp", - "memory": false, - "WindowSkin": false, - "head": { - "name": "", - "px": -300 - }, - "index": "8", - "time": 30, - "wait": 1000, - "bodyList": [ + "type": "changebg", + "img1": "other_0001.webp", + "memory1": false, + "img2": "bg_3563.webp", + "memory2": false, + "time": 30, + "style": "场景切换" + }, { - "name": "", - "px": 100, - "filter": false - } - ] - }, - { - "type": "cgtext", - "bg": "bg_3563.webp", - "memory": false, - "WindowSkin": false, - "head": { - "name": "", - "px": -300 - }, - "index": "9", - "time": 30, - "wait": 1000, - "bodyList": [ + "type": "cgtext", + "bg": "bg_3563.webp", + "memory": false, + "WindowSkin": false, + "head": { + "name": "", + "px": -300 + }, + "index": "3", + "time": 30, + "wait": 1000, + "bodyList": [ + { + "name": "", + "px": 100, + "filter": false + } + ] + }, { - "name": "", - "px": 100, - "filter": false - } - ] - }, - { - "type": "cgtext", - "bg": "bg_3563.webp", - "memory": false, - "WindowSkin": false, - "head": { - "name": "", - "px": -300 - }, - "index": "10", - "time": 30, - "wait": 1000, - "bodyList": [ + "type": "cgtext", + "bg": "bg_3563.webp", + "memory": false, + "WindowSkin": false, + "head": { + "name": "", + "px": -300 + }, + "index": "4", + "time": 30, + "wait": 1000, + "bodyList": [ + { + "name": "", + "px": 100, + "filter": false + } + ] + }, { - "name": "", - "px": 100, - "filter": false - } - ] - }, - { - "type": "changebg", - "img1": "bg_3563.webp", - "memory1": false, - "img2": "other_0002.webp", - "memory2": false, - "time": 30, - "style": "场景切换" - }, - { - "type": "cgtext", - "bg": "other_0002.webp", - "memory": false, - "WindowSkin": false, - "head": { - "name": "", - "px": -300 - }, - "index": "11", - "time": 30, - "wait": 1000, - "bodyList": [ + "type": "cgtext", + "bg": "bg_3563.webp", + "memory": false, + "WindowSkin": false, + "head": { + "name": "", + "px": -300 + }, + "index": "5", + "time": 30, + "wait": 1000, + "bodyList": [ + { + "name": "", + "px": 100, + "filter": false + } + ] + }, { - "name": "", - "px": 100, - "filter": false - } - ] - }, - { - "type": "cgtext", - "bg": "other_0002.webp", - "memory": false, - "WindowSkin": false, - "head": { - "name": "", - "px": -300 - }, - "index": "12", - "time": 30, - "wait": 1000, - "bodyList": [ + "type": "cgtext", + "bg": "bg_3563.webp", + "memory": false, + "WindowSkin": false, + "head": { + "name": "", + "px": -300 + }, + "index": "6", + "time": 30, + "wait": 1000, + "bodyList": [ + { + "name": "", + "px": 100, + "filter": false + } + ] + }, { - "name": "", - "px": 100, - "filter": false - } - ] - }, - { - "type": "cgtext", - "bg": "other_0002.webp", - "memory": false, - "WindowSkin": false, - "head": { - "name": "", - "px": -300 - }, - "index": "13", - "time": 30, - "wait": 1000, - "bodyList": [ + "type": "cgtext", + "bg": "bg_3563.webp", + "memory": false, + "WindowSkin": false, + "head": { + "name": "", + "px": -300 + }, + "index": "7", + "time": 30, + "wait": 1000, + "bodyList": [ + { + "name": "", + "px": 100, + "filter": false + } + ] + }, { - "name": "", - "px": 100, - "filter": false - } - ] - }, - { - "type": "cgtext", - "bg": "other_0002.webp", - "memory": false, - "WindowSkin": false, - "head": { - "name": "", - "px": -300 - }, - "index": "14", - "time": 30, - "wait": 1000, - "bodyList": [ + "type": "cgtext", + "bg": "bg_3563.webp", + "memory": false, + "WindowSkin": false, + "head": { + "name": "", + "px": -300 + }, + "index": "8", + "time": 30, + "wait": 1000, + "bodyList": [ + { + "name": "", + "px": 100, + "filter": false + } + ] + }, { - "name": "", - "px": 100, - "filter": false - } - ] - }, - { - "type": "cgtext", - "bg": "other_0002.webp", - "memory": false, - "WindowSkin": false, - "head": { - "name": "", - "px": -300 - }, - "index": "15", - "time": 30, - "wait": 1000, - "bodyList": [ + "type": "cgtext", + "bg": "bg_3563.webp", + "memory": false, + "WindowSkin": false, + "head": { + "name": "", + "px": -300 + }, + "index": "9", + "time": 30, + "wait": 1000, + "bodyList": [ + { + "name": "", + "px": 100, + "filter": false + } + ] + }, { - "name": "", - "px": 100, - "filter": false - } - ] - }, - { - "type": "cgtext", - "bg": "other_0002.webp", - "memory": false, - "WindowSkin": false, - "head": { - "name": "", - "px": -300 - }, - "index": "16", - "time": 30, - "wait": 1000, - "bodyList": [ + "type": "cgtext", + "bg": "bg_3563.webp", + "memory": false, + "WindowSkin": false, + "head": { + "name": "", + "px": -300 + }, + "index": "10", + "time": 30, + "wait": 1000, + "bodyList": [ + { + "name": "", + "px": 100, + "filter": false + } + ] + }, { - "name": "", - "px": 100, - "filter": false - } - ] - }, - { - "type": "cgtext", - "bg": "other_0002.webp", - "memory": false, - "WindowSkin": false, - "head": { - "name": "", - "px": -300 - }, - "index": "17", - "time": 30, - "wait": 1000, - "bodyList": [ + "type": "changebg", + "img1": "bg_3563.webp", + "memory1": false, + "img2": "other_0002.webp", + "memory2": false, + "time": 30, + "style": "场景切换" + }, { - "name": "", - "px": 100, - "filter": false - } - ] - }, - { - "type": "cgtext", - "bg": "other_0002.webp", - "memory": false, - "WindowSkin": false, - "head": { - "name": "", - "px": -300 - }, - "index": "18", - "time": 30, - "wait": 1000, - "bodyList": [ + "type": "cgtext", + "bg": "other_0002.webp", + "memory": false, + "WindowSkin": false, + "head": { + "name": "", + "px": -300 + }, + "index": "11", + "time": 30, + "wait": 1000, + "bodyList": [ + { + "name": "", + "px": 100, + "filter": false + } + ] + }, { - "name": "", - "px": 100, - "filter": false - } - ] - }, - { - "type": "changebg", - "img1": "other_0002.webp", - "memory1": false, - "img2": "other_0001.webp", - "memory2": false, - "time": 30, - "style": "场景切换" - }, - { - "type": "cgtext", - "bg": "other_0001.webp", - "memory": false, - "WindowSkin": false, - "head": { - "name": "", - "px": -300 - }, - "index": "19", - "time": 30, - "wait": 1000, - "bodyList": [ + "type": "cgtext", + "bg": "other_0002.webp", + "memory": false, + "WindowSkin": false, + "head": { + "name": "", + "px": -300 + }, + "index": "12", + "time": 30, + "wait": 1000, + "bodyList": [ + { + "name": "", + "px": 100, + "filter": false + } + ] + }, { - "name": "", - "px": 100, - "filter": false - } - ] - }, - { - "type": "changebg", - "img1": "other_0001.webp", - "memory1": false, - "img2": "other_0003.webp", - "memory2": false, - "time": 30, - "style": "场景切换" - }, - { - "type": "cgtext", - "bg": "other_0003.webp", - "memory": false, - "WindowSkin": false, - "head": { - "name": "", - "px": -300 - }, - "index": "20", - "time": 30, - "wait": 1000, - "bodyList": [ + "type": "cgtext", + "bg": "other_0002.webp", + "memory": false, + "WindowSkin": false, + "head": { + "name": "", + "px": -300 + }, + "index": "13", + "time": 30, + "wait": 1000, + "bodyList": [ + { + "name": "", + "px": 100, + "filter": false + } + ] + }, { - "name": "", - "px": 100, - "filter": false - } - ] - }, - { - "type": "cgtext", - "bg": "other_0003.webp", - "memory": false, - "WindowSkin": false, - "head": { - "name": "", - "px": -300 - }, - "index": "21", - "time": 30, - "wait": 1000, - "bodyList": [ + "type": "cgtext", + "bg": "other_0002.webp", + "memory": false, + "WindowSkin": false, + "head": { + "name": "", + "px": -300 + }, + "index": "14", + "time": 30, + "wait": 1000, + "bodyList": [ + { + "name": "", + "px": 100, + "filter": false + } + ] + }, { - "name": "", - "px": 100, - "filter": false - } - ] - }, - { - "type": "changebg", - "img1": "other_0003.webp", - "memory1": false, - "img2": "", - "memory2": false, - "time": 30, - "style": "场景切换" - }, - { - "type": "cgtext", - "bg": "", - "memory": false, - "WindowSkin": false, - "head": { - "name": "", - "px": -300 - }, - "index": "22", - "time": 30, - "wait": 1000, - "bodyList": [ + "type": "cgtext", + "bg": "other_0002.webp", + "memory": false, + "WindowSkin": false, + "head": { + "name": "", + "px": -300 + }, + "index": "15", + "time": 30, + "wait": 1000, + "bodyList": [ + { + "name": "", + "px": 100, + "filter": false + } + ] + }, { - "name": "", - "px": 100, - "filter": false - } - ] - }, - { - "type": "changebg", - "img1": "", - "memory1": false, - "img2": "other_0003.webp", - "memory2": false, - "time": 30, - "style": "场景切换" - }, - { - "type": "cgtext", - "bg": "other_0003.webp", - "memory": false, - "WindowSkin": false, - "head": { - "name": "", - "px": -300 - }, - "index": "23", - "time": 30, - "wait": 1000, - "bodyList": [ + "type": "cgtext", + "bg": "other_0002.webp", + "memory": false, + "WindowSkin": false, + "head": { + "name": "", + "px": -300 + }, + "index": "16", + "time": 30, + "wait": 1000, + "bodyList": [ + { + "name": "", + "px": 100, + "filter": false + } + ] + }, { - "name": "", - "px": 100, - "filter": false - } - ] - }, - { - "type": "cgtext", - "bg": "other_0003.webp", - "memory": false, - "WindowSkin": false, - "head": { - "name": "", - "px": -300 - }, - "index": "24", - "time": 50, - "wait": 1000, - "bodyList": [ + "type": "cgtext", + "bg": "other_0002.webp", + "memory": false, + "WindowSkin": false, + "head": { + "name": "", + "px": -300 + }, + "index": "17", + "time": 30, + "wait": 1000, + "bodyList": [ + { + "name": "", + "px": 100, + "filter": false + } + ] + }, { - "name": "", - "px": 100, - "filter": false - } - ] - }, - { - "type": "changebg", - "img1": "other_0003.webp", - "memory1": false, - "img2": "", - "memory2": false, - "time": 30, - "style": "场景切换" - }, - { - "type": "cgtext", - "bg": "", - "memory": false, - "WindowSkin": false, - "head": { - "name": "", - "px": -300 - }, - "index": "25", - "time": 30, - "wait": 1000, - "bodyList": [ + "type": "cgtext", + "bg": "other_0002.webp", + "memory": false, + "WindowSkin": false, + "head": { + "name": "", + "px": -300 + }, + "index": "18", + "time": 30, + "wait": 1000, + "bodyList": [ + { + "name": "", + "px": 100, + "filter": false + } + ] + }, { - "name": "", - "px": 100, - "filter": false - } - ] - }, - { - "type": "cgtext", - "bg": "", - "memory": false, - "WindowSkin": false, - "head": { - "name": "", - "px": -300 - }, - "index": "26", - "time": 30, - "wait": 1000, - "bodyList": [ + "type": "changebg", + "img1": "other_0002.webp", + "memory1": false, + "img2": "other_0001.webp", + "memory2": false, + "time": 30, + "style": "场景切换" + }, { - "name": "", - "px": 100, - "filter": false - } - ] - }, - { - "type": "cgtext", - "bg": "", - "memory": false, - "WindowSkin": false, - "head": { - "name": "", - "px": -300 - }, - "index": "27", - "time": 30, - "wait": 2000, - "bodyList": [ + "type": "cgtext", + "bg": "other_0001.webp", + "memory": false, + "WindowSkin": false, + "head": { + "name": "", + "px": -300 + }, + "index": "19", + "time": 30, + "wait": 1000, + "bodyList": [ + { + "name": "", + "px": 100, + "filter": false + } + ] + }, { - "name": "", - "px": 100, - "filter": false - } - ] - }, - { - "type": "cgtext", - "bg": "", - "memory": false, - "WindowSkin": false, - "head": { - "name": "", - "px": -300 - }, - "index": "28", - "time": 30, - "wait": 1000, - "bodyList": [ + "type": "changebg", + "img1": "other_0001.webp", + "memory1": false, + "img2": "other_0003.webp", + "memory2": false, + "time": 30, + "style": "场景切换" + }, { - "name": "", - "px": 100, - "filter": false - } - ] - }, - { - "type": "cgtext", - "bg": "", - "memory": false, - "WindowSkin": false, - "head": { - "name": "", - "px": -300 - }, - "index": "29", - "time": 30, - "wait": 1000, - "bodyList": [ + "type": "cgtext", + "bg": "other_0003.webp", + "memory": false, + "WindowSkin": false, + "head": { + "name": "", + "px": -300 + }, + "index": "20", + "time": 30, + "wait": 1000, + "bodyList": [ + { + "name": "", + "px": 100, + "filter": false + } + ] + }, { - "name": "", - "px": 100, - "filter": false - } - ] - }, - { - "type": "cgtext", - "bg": "", - "memory": false, - "WindowSkin": false, - "head": { - "name": "", - "px": -300 - }, - "index": "30", - "time": 30, - "wait": 1000, - "bodyList": [ + "type": "cgtext", + "bg": "other_0003.webp", + "memory": false, + "WindowSkin": false, + "head": { + "name": "", + "px": -300 + }, + "index": "21", + "time": 30, + "wait": 1000, + "bodyList": [ + { + "name": "", + "px": 100, + "filter": false + } + ] + }, { - "name": "", - "px": 100, - "filter": false - } - ] - }, - { - "type": "cgtext", - "bg": "", - "memory": false, - "WindowSkin": false, - "head": { - "name": "", - "px": -300 - }, - "index": "31", - "time": 30, - "wait": 1000, - "bodyList": [ + "type": "changebg", + "img1": "other_0003.webp", + "memory1": false, + "img2": "", + "memory2": false, + "time": 30, + "style": "场景切换" + }, { - "name": "", - "px": 100, - "filter": false + "type": "cgtext", + "bg": "", + "memory": false, + "WindowSkin": false, + "head": { + "name": "", + "px": -300 + }, + "index": "22", + "time": 30, + "wait": 1000, + "bodyList": [ + { + "name": "", + "px": 100, + "filter": false + } + ] + }, + { + "type": "changebg", + "img1": "", + "memory1": false, + "img2": "other_0003.webp", + "memory2": false, + "time": 30, + "style": "场景切换" + }, + { + "type": "cgtext", + "bg": "other_0003.webp", + "memory": false, + "WindowSkin": false, + "head": { + "name": "", + "px": -300 + }, + "index": "23", + "time": 30, + "wait": 1000, + "bodyList": [ + { + "name": "", + "px": 100, + "filter": false + } + ] + }, + { + "type": "cgtext", + "bg": "other_0003.webp", + "memory": false, + "WindowSkin": false, + "head": { + "name": "", + "px": -300 + }, + "index": "24", + "time": 50, + "wait": 1000, + "bodyList": [ + { + "name": "", + "px": 100, + "filter": false + } + ] + }, + { + "type": "changebg", + "img1": "other_0003.webp", + "memory1": false, + "img2": "", + "memory2": false, + "time": 30, + "style": "场景切换" + }, + { + "type": "cgtext", + "bg": "", + "memory": false, + "WindowSkin": false, + "head": { + "name": "", + "px": -300 + }, + "index": "25", + "time": 30, + "wait": 1000, + "bodyList": [ + { + "name": "", + "px": 100, + "filter": false + } + ] + }, + { + "type": "cgtext", + "bg": "", + "memory": false, + "WindowSkin": false, + "head": { + "name": "", + "px": -300 + }, + "index": "26", + "time": 30, + "wait": 1000, + "bodyList": [ + { + "name": "", + "px": 100, + "filter": false + } + ] + }, + { + "type": "cgtext", + "bg": "", + "memory": false, + "WindowSkin": false, + "head": { + "name": "", + "px": -300 + }, + "index": "27", + "time": 30, + "wait": 2000, + "bodyList": [ + { + "name": "", + "px": 100, + "filter": false + } + ] + }, + { + "type": "cgtext", + "bg": "", + "memory": false, + "WindowSkin": false, + "head": { + "name": "", + "px": -300 + }, + "index": "28", + "time": 30, + "wait": 1000, + "bodyList": [ + { + "name": "", + "px": 100, + "filter": false + } + ] + }, + { + "type": "cgtext", + "bg": "", + "memory": false, + "WindowSkin": false, + "head": { + "name": "", + "px": -300 + }, + "index": "29", + "time": 30, + "wait": 1000, + "bodyList": [ + { + "name": "", + "px": 100, + "filter": false + } + ] + }, + { + "type": "cgtext", + "bg": "", + "memory": false, + "WindowSkin": false, + "head": { + "name": "", + "px": -300 + }, + "index": "30", + "time": 30, + "wait": 1000, + "bodyList": [ + { + "name": "", + "px": 100, + "filter": false + } + ] + }, + { + "type": "cgtext", + "bg": "", + "memory": false, + "WindowSkin": false, + "head": { + "name": "", + "px": -300 + }, + "index": "31", + "time": 30, + "wait": 1000, + "bodyList": [ + { + "name": "", + "px": 100, + "filter": false + } + ] } ] }, @@ -1151,1973 +1165,6 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "type": "playBgm", "name": "Blind_Alley.opus", "keep": true - }, - { - "type": "changebg", - "img1": "", - "memory1": false, - "img2": "bg_6004.webp", - "memory2": false, - "time": 30, - "style": "场景切换" - }, - { - "type": "cgtext", - "bg": "bg_6004.webp", - "memory": false, - "WindowSkin": false, - "head": { - "name": "", - "px": -300 - }, - "index": "32", - "time": 30, - "wait": 1000, - "bodyList": [ - { - "name": "", - "px": 100, - "filter": false - } - ] - }, - { - "type": "cgtext", - "bg": "bg_6004.webp", - "memory": false, - "WindowSkin": false, - "head": { - "name": "", - "px": -300 - }, - "index": "33", - "time": 30, - "wait": 1000, - "bodyList": [ - { - "name": "", - "px": 100, - "filter": false - } - ] - }, - { - "type": "cgtext", - "bg": "bg_6004.webp", - "memory": false, - "WindowSkin": false, - "head": { - "name": "", - "px": -300 - }, - "index": "34", - "time": 30, - "wait": 1000, - "bodyList": [ - { - "name": "", - "px": 100, - "filter": false - } - ] - }, - { - "type": "cgtext", - "bg": "bg_6004.webp", - "memory": false, - "WindowSkin": false, - "head": { - "name": "", - "px": -300 - }, - "index": "35", - "time": 30, - "wait": 1000, - "bodyList": [ - { - "name": "", - "px": 100, - "filter": false - } - ] - }, - { - "type": "cgtext", - "bg": "bg_6004.webp", - "memory": false, - "WindowSkin": false, - "head": { - "name": "", - "px": -300 - }, - "index": "36", - "time": 30, - "wait": 1000, - "bodyList": [ - { - "name": "", - "px": 100, - "filter": false - } - ] - }, - { - "type": "cgtext", - "bg": "bg_6004.webp", - "memory": false, - "WindowSkin": false, - "head": { - "name": "", - "px": -300 - }, - "index": "37", - "time": 30, - "wait": 1000, - "bodyList": [ - { - "name": "", - "px": 100, - "filter": false - } - ] - }, - { - "type": "changebg", - "img1": "bg_6004.webp", - "memory1": false, - "img2": "other_0004.webp", - "memory2": false, - "time": 30, - "style": "场景切换" - }, - { - "type": "cgtext", - "bg": "other_0004.webp", - "memory": false, - "WindowSkin": false, - "head": { - "name": "", - "px": -300 - }, - "index": "38", - "time": 30, - "wait": 1000, - "bodyList": [ - { - "name": "", - "px": 100, - "filter": false - } - ] - }, - { - "type": "cgtext", - "bg": "other_0004.webp", - "memory": false, - "WindowSkin": false, - "head": { - "name": "", - "px": -300 - }, - "index": "39", - "time": 30, - "wait": 1000, - "bodyList": [ - { - "name": "", - "px": 100, - "filter": false - } - ] - }, - { - "type": "cgtext", - "bg": "other_0004.webp", - "memory": false, - "WindowSkin": false, - "head": { - "name": "", - "px": -300 - }, - "index": "40", - "time": 30, - "wait": 1000, - "bodyList": [ - { - "name": "", - "px": 100, - "filter": false - } - ] - }, - { - "type": "changebg", - "img1": "other_0004.webp", - "memory1": false, - "img2": "bg_3601.webp", - "memory2": false, - "time": 30, - "style": "场景切换" - }, - { - "type": "cgtext", - "bg": "bg_3601.webp", - "memory": false, - "WindowSkin": false, - "head": { - "name": "", - "px": -300 - }, - "index": "41", - "time": 30, - "wait": 1000, - "bodyList": [ - { - "name": "", - "px": 100, - "filter": false - } - ] - }, - { - "type": "cgtext", - "bg": "bg_3601.webp", - "memory": false, - "WindowSkin": false, - "head": { - "name": "", - "px": -300 - }, - "index": "42", - "time": 30, - "wait": 1000, - "bodyList": [ - { - "name": "", - "px": 100, - "filter": false - } - ] - }, - { - "type": "cgtext", - "bg": "bg_3601.webp", - "memory": false, - "WindowSkin": false, - "head": { - "name": "", - "px": -300 - }, - "index": "43", - "time": 30, - "wait": 1000, - "bodyList": [ - { - "name": "", - "px": 100, - "filter": false - } - ] - }, - { - "type": "changebg", - "img1": "bg_3601.webp", - "memory1": false, - "img2": "bg_3531.webp", - "memory2": false, - "time": 30, - "style": "场景切换" - }, - { - "type": "cgtext", - "bg": "bg_3531.webp", - "memory": false, - "WindowSkin": false, - "head": { - "name": "", - "px": -300 - }, - "index": "44", - "time": 30, - "wait": 1000, - "bodyList": [ - { - "name": "", - "px": 100, - "filter": false - } - ] - }, - { - "type": "cgtext", - "bg": "bg_3531.webp", - "memory": false, - "WindowSkin": false, - "head": { - "name": "", - "px": -300 - }, - "index": "45", - "time": 30, - "wait": 1000, - "bodyList": [ - { - "name": "", - "px": 100, - "filter": false - } - ] - }, - { - "type": "cgtext", - "bg": "bg_3531.webp", - "memory": false, - "WindowSkin": false, - "head": { - "name": "", - "px": -300 - }, - "index": "46", - "time": 30, - "wait": 1000, - "bodyList": [ - { - "name": "", - "px": 100, - "filter": false - } - ] - }, - { - "type": "cgtext", - "bg": "bg_3531.webp", - "memory": false, - "WindowSkin": false, - "head": { - "name": "", - "px": -300 - }, - "index": "47", - "time": 30, - "wait": 1000, - "bodyList": [ - { - "name": "", - "px": 100, - "filter": false - } - ] - }, - { - "type": "cgtext", - "bg": "bg_3531.webp", - "memory": false, - "WindowSkin": false, - "head": { - "name": "", - "px": -300 - }, - "index": "48", - "time": 30, - "wait": 1000, - "bodyList": [ - { - "name": "", - "px": 100, - "filter": false - } - ] - }, - { - "type": "cgtext", - "bg": "bg_3531.webp", - "memory": false, - "WindowSkin": false, - "head": { - "name": "", - "px": -300 - }, - "index": "49", - "time": 30, - "wait": 1000, - "bodyList": [ - { - "name": "", - "px": 100, - "filter": false - } - ] - }, - { - "type": "cgtext", - "bg": "bg_3531.webp", - "memory": false, - "WindowSkin": false, - "head": { - "name": "", - "px": -300 - }, - "index": "50", - "time": 30, - "wait": 1000, - "bodyList": [ - { - "name": "", - "px": 100, - "filter": false - } - ] - }, - { - "type": "cgtext", - "bg": "bg_3531.webp", - "memory": false, - "WindowSkin": false, - "head": { - "name": "", - "px": -300 - }, - "index": "51", - "time": 30, - "wait": 1000, - "bodyList": [ - { - "name": "", - "px": 100, - "filter": false - } - ] - }, - { - "type": "cgtext", - "bg": "bg_3531.webp", - "memory": false, - "WindowSkin": false, - "head": { - "name": "", - "px": -300 - }, - "index": "52", - "time": 30, - "wait": 1000, - "bodyList": [ - { - "name": "", - "px": 100, - "filter": false - } - ] - }, - { - "type": "cgtext", - "bg": "bg_3531.webp", - "memory": false, - "WindowSkin": false, - "head": { - "name": "", - "px": -300 - }, - "index": "53", - "time": 30, - "wait": 1000, - "bodyList": [ - { - "name": "", - "px": 100, - "filter": false - } - ] - }, - { - "type": "cgtext", - "bg": "bg_3531.webp", - "memory": false, - "WindowSkin": false, - "head": { - "name": "", - "px": -300 - }, - "index": "54", - "time": 30, - "wait": 1000, - "bodyList": [ - { - "name": "", - "px": 100, - "filter": false - } - ] - }, - { - "type": "cgtext", - "bg": "bg_3531.webp", - "memory": false, - "WindowSkin": false, - "head": { - "name": "", - "px": -300 - }, - "index": "55", - "time": 30, - "wait": 1000, - "bodyList": [ - { - "name": "", - "px": 100, - "filter": false - } - ] - }, - { - "type": "cgtext", - "bg": "bg_3531.webp", - "memory": false, - "WindowSkin": false, - "head": { - "name": "", - "px": -300 - }, - "index": "56", - "time": 30, - "wait": 1000, - "bodyList": [ - { - "name": "", - "px": 100, - "filter": false - } - ] - }, - { - "type": "cgtext", - "bg": "bg_3531.webp", - "memory": false, - "WindowSkin": false, - "head": { - "name": "", - "px": -300 - }, - "index": "57", - "time": 30, - "wait": 1000, - "bodyList": [ - { - "name": "", - "px": 100, - "filter": false - } - ] - }, - { - "type": "cgtext", - "bg": "bg_3531.webp", - "memory": false, - "WindowSkin": false, - "head": { - "name": "", - "px": -300 - }, - "index": "58", - "time": 30, - "wait": 1000, - "bodyList": [ - { - "name": "", - "px": 100, - "filter": false - } - ] - }, - { - "type": "cgtext", - "bg": "bg_3531.webp", - "memory": false, - "WindowSkin": false, - "head": { - "name": "", - "px": -300 - }, - "index": "59", - "time": 30, - "wait": 1000, - "bodyList": [ - { - "name": "", - "px": 100, - "filter": false - } - ] - }, - { - "type": "cgtext", - "bg": "bg_3531.webp", - "memory": false, - "WindowSkin": false, - "head": { - "name": "", - "px": -300 - }, - "index": "60", - "time": 30, - "wait": 1000, - "bodyList": [ - { - "name": "", - "px": 100, - "filter": false - } - ] - }, - { - "type": "cgtext", - "bg": "bg_3531.webp", - "memory": false, - "WindowSkin": false, - "head": { - "name": "", - "px": -300 - }, - "index": "61", - "time": 30, - "wait": 1000, - "bodyList": [ - { - "name": "", - "px": 100, - "filter": false - } - ] - }, - { - "type": "cgtext", - "bg": "bg_3531.webp", - "memory": false, - "WindowSkin": false, - "head": { - "name": "", - "px": -300 - }, - "index": "62", - "time": 30, - "wait": 1000, - "bodyList": [ - { - "name": "", - "px": 100, - "filter": false - } - ] - }, - { - "type": "cgtext", - "bg": "bg_3531.webp", - "memory": false, - "WindowSkin": false, - "head": { - "name": "", - "px": -300 - }, - "index": "63", - "time": 30, - "wait": 1000, - "bodyList": [ - { - "name": "", - "px": 100, - "filter": false - } - ] - }, - { - "type": "cgtext", - "bg": "bg_3531.webp", - "memory": false, - "WindowSkin": false, - "head": { - "name": "", - "px": -300 - }, - "index": "64", - "time": 30, - "wait": 1000, - "bodyList": [ - { - "name": "", - "px": 100, - "filter": false - } - ] - }, - { - "type": "cgtext", - "bg": "bg_3531.webp", - "memory": false, - "WindowSkin": false, - "head": { - "name": "", - "px": -300 - }, - "index": "65", - "time": 30, - "wait": 1000, - "bodyList": [ - { - "name": "", - "px": 100, - "filter": false - } - ] - }, - { - "type": "cgtext", - "bg": "bg_3531.webp", - "memory": false, - "WindowSkin": false, - "head": { - "name": "", - "px": -300 - }, - "index": "66", - "time": 30, - "wait": 1000, - "bodyList": [ - { - "name": "", - "px": 100, - "filter": false - } - ] - }, - { - "type": "cgtext", - "bg": "bg_3531.webp", - "memory": false, - "WindowSkin": false, - "head": { - "name": "", - "px": -300 - }, - "index": "67", - "time": 30, - "wait": 1000, - "bodyList": [ - { - "name": "", - "px": 100, - "filter": false - } - ] - }, - { - "type": "cgtext", - "bg": "bg_3531.webp", - "memory": false, - "WindowSkin": false, - "head": { - "name": "", - "px": -300 - }, - "index": "68", - "time": 30, - "wait": 1000, - "bodyList": [ - { - "name": "", - "px": 100, - "filter": false - } - ] - }, - { - "type": "cgtext", - "bg": "bg_3531.webp", - "memory": false, - "WindowSkin": false, - "head": { - "name": "", - "px": -300 - }, - "index": "69", - "time": 30, - "wait": 1000, - "bodyList": [ - { - "name": "", - "px": 100, - "filter": false - } - ] - }, - { - "type": "cgtext", - "bg": "bg_3531.webp", - "memory": false, - "WindowSkin": false, - "head": { - "name": "", - "px": -300 - }, - "index": "70", - "time": 30, - "wait": 1000, - "bodyList": [ - { - "name": "", - "px": 100, - "filter": false - } - ] - }, - { - "type": "cgtext", - "bg": "bg_3531.webp", - "memory": false, - "WindowSkin": false, - "head": { - "name": "", - "px": -300 - }, - "index": "71", - "time": 30, - "wait": 1000, - "bodyList": [ - { - "name": "", - "px": 100, - "filter": false - } - ] - }, - { - "type": "cgtext", - "bg": "bg_3531.webp", - "memory": false, - "WindowSkin": false, - "head": { - "name": "", - "px": -300 - }, - "index": "72", - "time": 30, - "wait": 1000, - "bodyList": [ - { - "name": "", - "px": 100, - "filter": false - } - ] - }, - { - "type": "cgtext", - "bg": "bg_3531.webp", - "memory": false, - "WindowSkin": false, - "head": { - "name": "", - "px": -300 - }, - "index": "73", - "time": 30, - "wait": 1000, - "bodyList": [ - { - "name": "", - "px": 100, - "filter": false - } - ] - }, - { - "type": "cgtext", - "bg": "bg_3531.webp", - "memory": false, - "WindowSkin": false, - "head": { - "name": "", - "px": -300 - }, - "index": "74", - "time": 30, - "wait": 1000, - "bodyList": [ - { - "name": "", - "px": 100, - "filter": false - } - ] - }, - { - "type": "cgtext", - "bg": "bg_3531.webp", - "memory": false, - "WindowSkin": false, - "head": { - "name": "", - "px": -300 - }, - "index": "75", - "time": 30, - "wait": 1000, - "bodyList": [ - { - "name": "", - "px": 100, - "filter": false - } - ] - }, - { - "type": "cgtext", - "bg": "bg_3531.webp", - "memory": false, - "WindowSkin": false, - "head": { - "name": "", - "px": -300 - }, - "index": "76", - "time": 30, - "wait": 1000, - "bodyList": [ - { - "name": "", - "px": 100, - "filter": false - } - ] - }, - { - "type": "cgtext", - "bg": "bg_3531.webp", - "memory": false, - "WindowSkin": false, - "head": { - "name": "", - "px": -300 - }, - "index": "77", - "time": 30, - "wait": 1000, - "bodyList": [ - { - "name": "", - "px": 100, - "filter": false - } - ] - }, - { - "type": "cgtext", - "bg": "bg_3531.webp", - "memory": false, - "WindowSkin": false, - "head": { - "name": "", - "px": -300 - }, - "index": "78", - "time": 30, - "wait": 1000, - "bodyList": [ - { - "name": "", - "px": 100, - "filter": false - } - ] - }, - { - "type": "cgtext", - "bg": "bg_3531.webp", - "memory": false, - "WindowSkin": false, - "head": { - "name": "", - "px": -300 - }, - "index": "79", - "time": 30, - "wait": 1000, - "bodyList": [ - { - "name": "", - "px": 100, - "filter": false - } - ] - }, - { - "type": "cgtext", - "bg": "bg_3531.webp", - "memory": false, - "WindowSkin": false, - "head": { - "name": "", - "px": -300 - }, - "index": "80", - "time": 30, - "wait": 1000, - "bodyList": [ - { - "name": "", - "px": 100, - "filter": false - } - ] - }, - { - "type": "cgtext", - "bg": "bg_3531.webp", - "memory": false, - "WindowSkin": false, - "head": { - "name": "", - "px": -300 - }, - "index": "81", - "time": 30, - "wait": 1000, - "bodyList": [ - { - "name": "", - "px": 100, - "filter": false - } - ] - }, - { - "type": "cgtext", - "bg": "bg_3531.webp", - "memory": false, - "WindowSkin": false, - "head": { - "name": "", - "px": -300 - }, - "index": "82", - "time": 30, - "wait": 1000, - "bodyList": [ - { - "name": "", - "px": 100, - "filter": false - } - ] - }, - { - "type": "cgtext", - "bg": "bg_3531.webp", - "memory": false, - "WindowSkin": false, - "head": { - "name": "", - "px": -300 - }, - "index": "83", - "time": 30, - "wait": 1000, - "bodyList": [ - { - "name": "", - "px": 100, - "filter": false - } - ] - }, - { - "type": "cgtext", - "bg": "bg_3531.webp", - "memory": false, - "WindowSkin": false, - "head": { - "name": "", - "px": -300 - }, - "index": "84", - "time": 30, - "wait": 1000, - "bodyList": [ - { - "name": "", - "px": 100, - "filter": false - } - ] - }, - { - "type": "cgtext", - "bg": "bg_3531.webp", - "memory": false, - "WindowSkin": false, - "head": { - "name": "", - "px": -300 - }, - "index": "85", - "time": 30, - "wait": 1000, - "bodyList": [ - { - "name": "", - "px": 100, - "filter": false - } - ] - }, - { - "type": "cgtext", - "bg": "bg_3531.webp", - "memory": false, - "WindowSkin": false, - "head": { - "name": "", - "px": -300 - }, - "index": "86", - "time": 30, - "wait": 1000, - "bodyList": [ - { - "name": "", - "px": 100, - "filter": false - } - ] - }, - { - "type": "cgtext", - "bg": "bg_3531.webp", - "memory": false, - "WindowSkin": false, - "head": { - "name": "", - "px": -300 - }, - "index": "87", - "time": 30, - "wait": 1000, - "bodyList": [ - { - "name": "", - "px": 100, - "filter": false - } - ] - }, - { - "type": "cgtext", - "bg": "bg_3531.webp", - "memory": false, - "WindowSkin": false, - "head": { - "name": "", - "px": -300 - }, - "index": "88", - "time": 30, - "wait": 1000, - "bodyList": [ - { - "name": "", - "px": 100, - "filter": false - } - ] - }, - { - "type": "cgtext", - "bg": "bg_3531.webp", - "memory": false, - "WindowSkin": false, - "head": { - "name": "", - "px": -300 - }, - "index": "89", - "time": 30, - "wait": 1000, - "bodyList": [ - { - "name": "", - "px": 100, - "filter": false - } - ] - }, - { - "type": "cgtext", - "bg": "bg_3531.webp", - "memory": false, - "WindowSkin": false, - "head": { - "name": "", - "px": -300 - }, - "index": "90", - "time": 30, - "wait": 1000, - "bodyList": [ - { - "name": "", - "px": 100, - "filter": false - } - ] - }, - { - "type": "cgtext", - "bg": "bg_3531.webp", - "memory": false, - "WindowSkin": false, - "head": { - "name": "", - "px": -300 - }, - "index": "91", - "time": 30, - "wait": 1000, - "bodyList": [ - { - "name": "", - "px": 100, - "filter": false - } - ] - }, - { - "type": "cgtext", - "bg": "bg_3531.webp", - "memory": false, - "WindowSkin": false, - "head": { - "name": "", - "px": -300 - }, - "index": "92", - "time": 30, - "wait": 1000, - "bodyList": [ - { - "name": "", - "px": 100, - "filter": false - } - ] - }, - { - "type": "cgtext", - "bg": "bg_3531.webp", - "memory": false, - "WindowSkin": false, - "head": { - "name": "", - "px": -300 - }, - "index": "93", - "time": 30, - "wait": 1000, - "bodyList": [ - { - "name": "", - "px": 100, - "filter": false - } - ] - }, - { - "type": "cgtext", - "bg": "bg_3531.webp", - "memory": false, - "WindowSkin": false, - "head": { - "name": "", - "px": -300 - }, - "index": "94", - "time": 30, - "wait": 2000, - "bodyList": [ - { - "name": "", - "px": 100, - "filter": false - } - ] - }, - { - "type": "cgtext", - "bg": "bg_3531.webp", - "memory": false, - "WindowSkin": false, - "head": { - "name": "", - "px": -300 - }, - "index": "95", - "time": 30, - "wait": 1000, - "bodyList": [ - { - "name": "", - "px": 100, - "filter": false - } - ] - }, - { - "type": "cgtext", - "bg": "bg_3531.webp", - "memory": false, - "WindowSkin": false, - "head": { - "name": "", - "px": -300 - }, - "index": "96", - "time": 30, - "wait": 1000, - "bodyList": [ - { - "name": "", - "px": 100, - "filter": false - } - ] - }, - { - "type": "cgtext", - "bg": "bg_3531.webp", - "memory": false, - "WindowSkin": false, - "head": { - "name": "", - "px": -300 - }, - "index": "97", - "time": 30, - "wait": 1000, - "bodyList": [ - { - "name": "", - "px": 100, - "filter": false - } - ] - }, - { - "type": "cgtext", - "bg": "bg_3531.webp", - "memory": false, - "WindowSkin": false, - "head": { - "name": "", - "px": -300 - }, - "index": "98", - "time": 30, - "wait": 1000, - "bodyList": [ - { - "name": "", - "px": 100, - "filter": false - } - ] - }, - { - "type": "cgtext", - "bg": "bg_3531.webp", - "memory": false, - "WindowSkin": false, - "head": { - "name": "", - "px": -300 - }, - "index": "99", - "time": 30, - "wait": 1000, - "bodyList": [ - { - "name": "", - "px": 100, - "filter": false - } - ] - }, - { - "type": "cgtext", - "bg": "bg_3531.webp", - "memory": false, - "WindowSkin": false, - "head": { - "name": "", - "px": -300 - }, - "index": "100", - "time": 30, - "wait": 1000, - "bodyList": [ - { - "name": "", - "px": 100, - "filter": false - } - ] - }, - { - "type": "cgtext", - "bg": "bg_3531.webp", - "memory": false, - "WindowSkin": false, - "head": { - "name": "", - "px": -300 - }, - "index": "101", - "time": 30, - "wait": 1000, - "bodyList": [ - { - "name": "", - "px": 100, - "filter": false - } - ] - }, - { - "type": "cgtext", - "bg": "bg_3531.webp", - "memory": false, - "WindowSkin": false, - "head": { - "name": "", - "px": -300 - }, - "index": "102", - "time": 30, - "wait": 1000, - "bodyList": [ - { - "name": "", - "px": 100, - "filter": false - } - ] - }, - { - "type": "cgtext", - "bg": "bg_3531.webp", - "memory": false, - "WindowSkin": false, - "head": { - "name": "", - "px": -300 - }, - "index": "103", - "time": 30, - "wait": 1000, - "bodyList": [ - { - "name": "", - "px": 100, - "filter": false - } - ] - }, - { - "type": "cgtext", - "bg": "bg_3531.webp", - "memory": false, - "WindowSkin": false, - "head": { - "name": "", - "px": -300 - }, - "index": "104", - "time": 30, - "wait": 1000, - "bodyList": [ - { - "name": "", - "px": 100, - "filter": false - } - ] - }, - { - "type": "cgtext", - "bg": "bg_3531.webp", - "memory": false, - "WindowSkin": false, - "head": { - "name": "", - "px": -300 - }, - "index": "105", - "time": 30, - "wait": 1000, - "bodyList": [ - { - "name": "", - "px": 100, - "filter": false - } - ] - }, - { - "type": "cgtext", - "bg": "bg_3531.webp", - "memory": false, - "WindowSkin": false, - "head": { - "name": "", - "px": -300 - }, - "index": "106", - "time": 30, - "wait": 1000, - "bodyList": [ - { - "name": "", - "px": 100, - "filter": false - } - ] - }, - { - "type": "cgtext", - "bg": "bg_3531.webp", - "memory": false, - "WindowSkin": false, - "head": { - "name": "", - "px": -300 - }, - "index": "107", - "time": 30, - "wait": 1000, - "bodyList": [ - { - "name": "", - "px": 100, - "filter": false - } - ] - }, - { - "type": "cgtext", - "bg": "bg_3531.webp", - "memory": false, - "WindowSkin": false, - "head": { - "name": "", - "px": -300 - }, - "index": "108", - "time": 30, - "wait": 1000, - "bodyList": [ - { - "name": "", - "px": 100, - "filter": false - } - ] - }, - { - "type": "cgtext", - "bg": "bg_3531.webp", - "memory": false, - "WindowSkin": false, - "head": { - "name": "", - "px": -300 - }, - "index": "109", - "time": 30, - "wait": 1000, - "bodyList": [ - { - "name": "", - "px": 100, - "filter": false - } - ] - }, - { - "type": "cgtext", - "bg": "bg_3531.webp", - "memory": false, - "WindowSkin": false, - "head": { - "name": "", - "px": -300 - }, - "index": "110", - "time": 30, - "wait": 1000, - "bodyList": [ - { - "name": "", - "px": 100, - "filter": false - } - ] - }, - { - "type": "cgtext", - "bg": "bg_3531.webp", - "memory": false, - "WindowSkin": false, - "head": { - "name": "", - "px": -300 - }, - "index": "111", - "time": 30, - "wait": 1000, - "bodyList": [ - { - "name": "", - "px": 100, - "filter": false - } - ] - }, - { - "type": "cgtext", - "bg": "bg_3531.webp", - "memory": false, - "WindowSkin": false, - "head": { - "name": "", - "px": -300 - }, - "index": "112", - "time": 30, - "wait": 1000, - "bodyList": [ - { - "name": "", - "px": 100, - "filter": false - } - ] - }, - { - "type": "cgtext", - "bg": "bg_3531.webp", - "memory": false, - "WindowSkin": false, - "head": { - "name": "", - "px": -300 - }, - "index": "113", - "time": 30, - "wait": 1000, - "bodyList": [ - { - "name": "", - "px": 100, - "filter": false - } - ] - }, - { - "type": "cgtext", - "bg": "bg_3531.webp", - "memory": false, - "WindowSkin": false, - "head": { - "name": "", - "px": -300 - }, - "index": "114", - "time": 30, - "wait": 1000, - "bodyList": [ - { - "name": "", - "px": 100, - "filter": false - } - ] - }, - { - "type": "cgtext", - "bg": "bg_3531.webp", - "memory": false, - "WindowSkin": false, - "head": { - "name": "", - "px": -300 - }, - "index": "115", - "time": 30, - "wait": 1000, - "bodyList": [ - { - "name": "", - "px": 100, - "filter": false - } - ] - }, - { - "type": "changebg", - "img1": "bg_3531.webp", - "memory1": false, - "img2": "bg_3601.webp", - "memory2": false, - "time": 30, - "style": "场景切换" - }, - { - "type": "cgtext", - "bg": "bg_3601.webp", - "memory": false, - "WindowSkin": false, - "head": { - "name": "", - "px": -300 - }, - "index": "116", - "time": 30, - "wait": 1000, - "bodyList": [ - { - "name": "", - "px": 100, - "filter": false - } - ] - }, - { - "type": "cgtext", - "bg": "bg_3601.webp", - "memory": false, - "WindowSkin": false, - "head": { - "name": "", - "px": -300 - }, - "index": "117", - "time": 30, - "wait": 1000, - "bodyList": [ - { - "name": "", - "px": 100, - "filter": false - } - ] - }, - { - "type": "cgtext", - "bg": "bg_3601.webp", - "memory": false, - "WindowSkin": false, - "head": { - "name": "", - "px": -300 - }, - "index": "118", - "time": 30, - "wait": 1000, - "bodyList": [ - { - "name": "", - "px": 100, - "filter": false - } - ] - }, - { - "type": "cgtext", - "bg": "bg_3601.webp", - "memory": false, - "WindowSkin": false, - "head": { - "name": "", - "px": -300 - }, - "index": "119", - "time": 30, - "wait": 1000, - "bodyList": [ - { - "name": "", - "px": 100, - "filter": false - } - ] - }, - { - "type": "cgtext", - "bg": "bg_3601.webp", - "memory": false, - "WindowSkin": false, - "head": { - "name": "", - "px": -300 - }, - "index": "120", - "time": 30, - "wait": 1000, - "bodyList": [ - { - "name": "", - "px": 100, - "filter": false - } - ] - }, - { - "type": "cgtext", - "bg": "bg_3601.webp", - "memory": false, - "WindowSkin": false, - "head": { - "name": "", - "px": -300 - }, - "index": "121", - "time": 30, - "wait": 1000, - "bodyList": [ - { - "name": "", - "px": 100, - "filter": false - } - ] - }, - { - "type": "cgtext", - "bg": "bg_3601.webp", - "memory": false, - "WindowSkin": false, - "head": { - "name": "", - "px": -300 - }, - "index": "122", - "time": 30, - "wait": 1000, - "bodyList": [ - { - "name": "", - "px": 100, - "filter": false - } - ] - }, - { - "type": "cgtext", - "bg": "bg_3601.webp", - "memory": false, - "WindowSkin": false, - "head": { - "name": "", - "px": -300 - }, - "index": "123", - "time": 30, - "wait": 1000, - "bodyList": [ - { - "name": "", - "px": 100, - "filter": false - } - ] - }, - { - "type": "cgtext", - "bg": "bg_3601.webp", - "memory": false, - "WindowSkin": false, - "head": { - "name": "", - "px": -300 - }, - "index": "124", - "time": 30, - "wait": 1000, - "bodyList": [ - { - "name": "", - "px": 100, - "filter": false - } - ] - }, - { - "type": "cgtext", - "bg": "bg_3601.webp", - "memory": false, - "WindowSkin": false, - "head": { - "name": "", - "px": -300 - }, - "index": "125", - "time": 30, - "wait": 1000, - "bodyList": [ - { - "name": "", - "px": 100, - "filter": false - } - ] - }, - { - "type": "changebg", - "img1": "bg_3601.webp", - "memory1": false, - "img2": "bg_3531.webp", - "memory2": false, - "time": 30, - "style": "场景切换" - }, - { - "type": "cgtext", - "bg": "bg_3531.webp", - "memory": false, - "WindowSkin": false, - "head": { - "name": "", - "px": -300 - }, - "index": "126", - "time": 30, - "wait": 1000, - "bodyList": [ - { - "name": "", - "px": 100, - "filter": false - } - ] - }, - { - "type": "changebg", - "img1": "bg_3531.webp", - "memory1": false, - "img2": "", - "memory2": false, - "time": 30, - "style": "引出" - }, - { - "type": "comment", - "text": "好多立绘,先更这点(吐槽一下)" } ], "chapter01": [ @@ -10763,6 +8810,650 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 = "stopbefore": false } ] + }, + { + "type": "setanimate", + "name": "Fire01", + "px": 48, + "py": 48, + "width": 192, + "height": 192, + "allFarme": 15, + "imageList": [ + { + "image": "015-Fire01.webp", + "beforefarme": 0, + "globalAlpha": 100, + "cx": 192, + "cy": 0, + "cw": 192, + "ch": 192, + "x": 0, + "y": 0, + "w": 96, + "h": 96, + "afterfarme": 3, + "acx": 192, + "acy": 0, + "acw": 192, + "ach": 192, + "ax": 0, + "ay": 0, + "aw": 96, + "ah": 96 + }, + { + "image": "015-Fire01.webp", + "beforefarme": 4, + "globalAlpha": 100, + "cx": 384, + "cy": 0, + "cw": 192, + "ch": 192, + "x": 0, + "y": 0, + "w": 96, + "h": 96, + "afterfarme": 6, + "acx": 384, + "acy": 0, + "acw": 192, + "ach": 192, + "ax": 0, + "ay": 0, + "aw": 96, + "ah": 96 + }, + { + "image": "015-Fire01.webp", + "beforefarme": 7, + "globalAlpha": 100, + "cx": 576, + "cy": 0, + "cw": 192, + "ch": 192, + "x": 0, + "y": 0, + "w": 96, + "h": 96, + "afterfarme": 9, + "acx": 576, + "acy": 0, + "acw": 192, + "ach": 192, + "ax": 0, + "ay": 0, + "aw": 96, + "ah": 96 + }, + { + "image": "015-Fire01.webp", + "beforefarme": 10, + "globalAlpha": 100, + "cx": 768, + "cy": 0, + "cw": 192, + "ch": 192, + "x": 0, + "y": 0, + "w": 96, + "h": 96, + "afterfarme": 12, + "acx": 768, + "acy": 0, + "acw": 192, + "ach": 192, + "ax": 0, + "ay": 0, + "aw": 96, + "ah": 96 + }, + { + "image": "015-Fire01.webp", + "beforefarme": 13, + "globalAlpha": 100, + "cx": 960, + "cy": 0, + "cw": 192, + "ch": 192, + "x": 0, + "y": 0, + "w": 96, + "h": 96, + "afterfarme": 15, + "acx": 960, + "acy": 0, + "acw": 192, + "ach": 192, + "ax": 0, + "ay": 0, + "aw": 96, + "ah": 96 + } + ], + "soundList": [ + { + "sound": "", + "startfarme": 0, + "stopbefore": false + } + ] + }, + { + "type": "setanimate", + "name": "Fire02", + "px": 48, + "py": 48, + "width": 192, + "height": 192, + "allFarme": 15, + "imageList": [ + { + "image": "015-Fire01.webp", + "beforefarme": 0, + "globalAlpha": 100, + "cx": 192, + "cy": 192, + "cw": 192, + "ch": 192, + "x": 0, + "y": 0, + "w": 96, + "h": 96, + "afterfarme": 3, + "acx": 192, + "acy": 192, + "acw": 192, + "ach": 192, + "ax": 0, + "ay": 0, + "aw": 96, + "ah": 96 + }, + { + "image": "015-Fire01.webp", + "beforefarme": 4, + "globalAlpha": 100, + "cx": 384, + "cy": 192, + "cw": 192, + "ch": 192, + "x": 0, + "y": 0, + "w": 96, + "h": 96, + "afterfarme": 6, + "acx": 384, + "acy": 192, + "acw": 192, + "ach": 192, + "ax": 0, + "ay": 0, + "aw": 96, + "ah": 96 + }, + { + "image": "015-Fire01.webp", + "beforefarme": 7, + "globalAlpha": 100, + "cx": 576, + "cy": 192, + "cw": 192, + "ch": 192, + "x": 0, + "y": 0, + "w": 96, + "h": 96, + "afterfarme": 9, + "acx": 576, + "acy": 192, + "acw": 192, + "ach": 192, + "ax": 0, + "ay": 0, + "aw": 96, + "ah": 96 + }, + { + "image": "015-Fire01.webp", + "beforefarme": 10, + "globalAlpha": 100, + "cx": 768, + "cy": 192, + "cw": 192, + "ch": 192, + "x": 0, + "y": 0, + "w": 96, + "h": 96, + "afterfarme": 12, + "acx": 768, + "acy": 192, + "acw": 192, + "ach": 192, + "ax": 0, + "ay": 0, + "aw": 96, + "ah": 96 + }, + { + "image": "015-Fire01.webp", + "beforefarme": 13, + "globalAlpha": 100, + "cx": 960, + "cy": 192, + "cw": 192, + "ch": 192, + "x": 0, + "y": 0, + "w": 96, + "h": 96, + "afterfarme": 15, + "acx": 960, + "acy": 192, + "acw": 192, + "ach": 192, + "ax": 0, + "ay": 0, + "aw": 96, + "ah": 96 + } + ], + "soundList": [ + { + "sound": "", + "startfarme": 0, + "stopbefore": false + } + ] + }, + { + "type": "setanimate", + "name": "005-Attack03", + "px": 48, + "py": 48, + "width": 192, + "height": 192, + "allFarme": 15, + "imageList": [ + { + "image": "005-Attack03.webp", + "beforefarme": 0, + "globalAlpha": 100, + "cx": 0, + "cy": 0, + "cw": 192, + "ch": 192, + "x": 0, + "y": 0, + "w": 96, + "h": 96, + "afterfarme": 3, + "acx": 0, + "acy": 0, + "acw": 192, + "ach": 192, + "ax": 0, + "ay": 0, + "aw": 96, + "ah": 96 + }, + { + "image": "005-Attack03.webp", + "beforefarme": 4, + "globalAlpha": 100, + "cx": 192, + "cy": 0, + "cw": 192, + "ch": 192, + "x": 0, + "y": 0, + "w": 96, + "h": 96, + "afterfarme": 6, + "acx": 192, + "acy": 0, + "acw": 192, + "ach": 192, + "ax": 0, + "ay": 0, + "aw": 96, + "ah": 96 + }, + { + "image": "005-Attack03.webp", + "beforefarme": 7, + "globalAlpha": 100, + "cx": 384, + "cy": 0, + "cw": 192, + "ch": 192, + "x": 0, + "y": 0, + "w": 96, + "h": 96, + "afterfarme": 9, + "acx": 384, + "acy": 0, + "acw": 192, + "ach": 192, + "ax": 0, + "ay": 0, + "aw": 96, + "ah": 96 + }, + { + "image": "005-Attack03.webp", + "beforefarme": 10, + "globalAlpha": 100, + "cx": 576, + "cy": 0, + "cw": 192, + "ch": 192, + "x": 0, + "y": 0, + "w": 96, + "h": 96, + "afterfarme": 12, + "acx": 576, + "acy": 0, + "acw": 192, + "ach": 192, + "ax": 0, + "ay": 0, + "aw": 96, + "ah": 96 + }, + { + "image": "005-Attack03.webp", + "beforefarme": 13, + "globalAlpha": 100, + "cx": 768, + "cy": 0, + "cw": 192, + "ch": 192, + "x": 0, + "y": 0, + "w": 96, + "h": 96, + "afterfarme": 15, + "acx": 768, + "acy": 0, + "acw": 192, + "ach": 192, + "ax": 0, + "ay": 0, + "aw": 96, + "ah": 96 + } + ], + "soundList": [ + { + "sound": "", + "startfarme": 0, + "stopbefore": false + } + ] + }, + { + "type": "setanimate", + "name": "012-Heal01", + "px": 48, + "py": 48, + "width": 192, + "height": 192, + "allFarme": 15, + "imageList": [ + { + "image": "012-Heal01.webp", + "beforefarme": 0, + "globalAlpha": 100, + "cx": 0, + "cy": 0, + "cw": 192, + "ch": 192, + "x": 0, + "y": 0, + "w": 96, + "h": 96, + "afterfarme": 3, + "acx": 0, + "acy": 0, + "acw": 192, + "ach": 192, + "ax": 0, + "ay": 0, + "aw": 96, + "ah": 96 + }, + { + "image": "012-Heal01.webp", + "beforefarme": 4, + "globalAlpha": 100, + "cx": 192, + "cy": 0, + "cw": 192, + "ch": 192, + "x": 0, + "y": 0, + "w": 96, + "h": 96, + "afterfarme": 6, + "acx": 192, + "acy": 0, + "acw": 192, + "ach": 192, + "ax": 0, + "ay": 0, + "aw": 96, + "ah": 96 + }, + { + "image": "012-Heal01.webp", + "beforefarme": 7, + "globalAlpha": 100, + "cx": 384, + "cy": 0, + "cw": 192, + "ch": 192, + "x": 0, + "y": 0, + "w": 96, + "h": 96, + "afterfarme": 9, + "acx": 384, + "acy": 0, + "acw": 192, + "ach": 192, + "ax": 0, + "ay": 0, + "aw": 96, + "ah": 96 + }, + { + "image": "012-Heal01.webp", + "beforefarme": 10, + "globalAlpha": 100, + "cx": 576, + "cy": 0, + "cw": 192, + "ch": 192, + "x": 0, + "y": 0, + "w": 96, + "h": 96, + "afterfarme": 12, + "acx": 576, + "acy": 0, + "acw": 192, + "ach": 192, + "ax": 0, + "ay": 0, + "aw": 96, + "ah": 96 + }, + { + "image": "012-Heal01.webp", + "beforefarme": 13, + "globalAlpha": 100, + "cx": 768, + "cy": 0, + "cw": 192, + "ch": 192, + "x": 0, + "y": 0, + "w": 96, + "h": 96, + "afterfarme": 15, + "acx": 768, + "acy": 0, + "acw": 192, + "ach": 192, + "ax": 0, + "ay": 0, + "aw": 96, + "ah": 96 + } + ], + "soundList": [ + { + "sound": "", + "startfarme": 0, + "stopbefore": false + } + ] + } + ], + "chapter06": null, + "chapter07": null, + "chapter000001": [ + { + "type": "changebg", + "img1": "", + "memory1": false, + "img2": "", + "memory2": false, + "time": 30, + "style": "场景切换" + }, + { + "type": "cgtextList", + "textList": "chapter001" + }, + { + "type": "cgtext", + "bg": "", + "memory": false, + "WindowSkin": false, + "head": { + "name": "", + "px": -300 + }, + "index": "0", + "time": 30, + "wait": 1000, + "bodyList": [ + { + "name": "", + "px": 100, + "filter": false + } + ] + }, + { + "type": "cgtext", + "bg": "", + "memory": false, + "WindowSkin": false, + "head": { + "name": "", + "px": -300 + }, + "index": "1", + "time": 30, + "wait": 1000, + "bodyList": [ + { + "name": "", + "px": 100, + "filter": false + } + ] + }, + { + "type": "cgtext", + "bg": "", + "memory": false, + "WindowSkin": false, + "head": { + "name": "", + "px": -300 + }, + "index": "2", + "time": 30, + "wait": 1000, + "bodyList": [ + { + "name": "", + "px": 100, + "filter": false + } + ] + }, + { + "type": "cgtext", + "bg": "", + "memory": false, + "WindowSkin": false, + "head": { + "name": "", + "px": -300 + }, + "index": "3", + "time": 30, + "wait": 1000, + "bodyList": [ + { + "name": "", + "px": 100, + "filter": false + } + ] + } + ], + "chapter00002": [ + { + "type": "changebg", + "img1": "", + "memory1": false, + "img2": "bg_3531.webp", + "memory2": false, + "time": 30, + "style": "引入" + }, + { + "type": "cgtextList", + "textList": "chapter002" + }, + { + "type": "cgtext", + "bg": "bg_3531.webp", + "memory": false, + "WindowSkin": false, + "head": { + "name": "", + "px": -300 + }, + "index": "0", + "time": 0, + "wait": 2000, + "bodyList": [ + { + "name": "", + "px": 0, + "filter": false + } + ] } ] }, diff --git a/project/floors/KTV.js b/project/floors/KTV.js index 163573d..4d25a2e 100644 --- a/project/floors/KTV.js +++ b/project/floors/KTV.js @@ -11,7 +11,189 @@ main.floors.KTV= "images": [], "ratio": 1, "defaultGround": "grass", - "firstArrive": [], + "firstArrive": [ + { + "type": "changebg", + "img1": "", + "memory1": false, + "img2": "bg_3531.webp", + "memory2": false, + "time": 30, + "style": "引入" + }, + { + "type": "cgtextList", + "textList": "chapter002" + }, + { + "type": "cgtext", + "bg": "bg_3531.webp", + "memory": false, + "WindowSkin": false, + "head": { + "name": "", + "px": -300 + }, + "index": "0", + "time": 0, + "wait": 2000, + "bodyList": [ + { + "name": "", + "px": 0, + "filter": false + } + ] + }, + { + "type": "cgtext", + "bg": "bg_3531.webp", + "memory": false, + "WindowSkin": false, + "head": { + "name": "", + "px": -300 + }, + "index": "1", + "time": 0, + "wait": 2000, + "bodyList": [ + { + "name": "", + "px": 0, + "filter": false + } + ] + }, + { + "type": "cgtext", + "bg": "bg_3531.webp", + "memory": false, + "WindowSkin": false, + "head": { + "name": "", + "px": -300 + }, + "index": "2", + "time": 0, + "wait": 2000, + "bodyList": [ + { + "name": "", + "px": 0, + "filter": false + } + ] + }, + { + "type": "cgtext", + "bg": "bg_3531.webp", + "memory": false, + "WindowSkin": false, + "head": { + "name": "", + "px": -300 + }, + "index": "3", + "time": 0, + "wait": 2000, + "bodyList": [ + { + "name": "", + "px": 0, + "filter": false + } + ] + }, + { + "type": "cgtext", + "bg": "bg_3531.webp", + "memory": false, + "WindowSkin": false, + "head": { + "name": "", + "px": -300 + }, + "index": "4", + "time": 0, + "wait": 2000, + "bodyList": [ + { + "name": "", + "px": 0, + "filter": false + } + ] + }, + { + "type": "cgtext", + "bg": "bg_3531.webp", + "memory": false, + "WindowSkin": false, + "head": { + "name": "", + "px": -300 + }, + "index": "5", + "time": 0, + "wait": 2000, + "bodyList": [ + { + "name": "", + "px": 0, + "filter": false + } + ] + }, + { + "type": "cgtext", + "bg": "bg_3531.webp", + "memory": false, + "WindowSkin": false, + "head": { + "name": "", + "px": -300 + }, + "index": "6", + "time": 0, + "wait": 2000, + "bodyList": [ + { + "name": "", + "px": 0, + "filter": false + } + ] + }, + { + "type": "cgtext", + "bg": "bg_3531.webp", + "memory": false, + "WindowSkin": false, + "head": { + "name": "", + "px": -300 + }, + "index": "7", + "time": 0, + "wait": 2000, + "bodyList": [ + { + "name": "", + "px": 0, + "filter": false + } + ] + }, + { + "type": "setHeroOpacity", + "opacity": 1 + }, + { + "type": "setCurtain", + "time": 1000 + } + ], "eachArrive": [], "parallelDo": "", "events": {}, @@ -47,7 +229,7 @@ main.floors.KTV= [ 17,71797,71797,71797,71797,71797,71797,71797,71797,71797, 90, 17, 0], [ 17,90211,90211,90211,90211,71877,90211,90211, 0,90587, 0, 17, 0], [ 17,90541,90542,90543, 17,71761, 17, 17,71288,71116, 0, 17, 0], - [ 17, 0,30216, 0, 0, 0, 0, 0, 0,71257, 0, 17, 0], + [ 17, 0,30216, 0, 0,123, 0, 0, 0,71257, 0, 17, 0], [ 17, 0, 0, 0,71568,71754,20167, 0, 0,71265, 0, 17, 0], [ 17, 0, 0, 0,71887, 0, 0, 0,60160,71265, 0, 17, 0], [ 17,71340, 17, 17, 0, 0, 0, 17, 17,70568, 0,71796,71797], diff --git a/project/floors/changguan1.js b/project/floors/changguan1.js index a971ace..d9960dd 100644 --- a/project/floors/changguan1.js +++ b/project/floors/changguan1.js @@ -11,7 +11,36 @@ main.floors.changguan1= "images": [], "ratio": 1, "defaultGround": "grass2", - "firstArrive": [], + "firstArrive": [ + { + "type": "setCurtain", + "time": 1000 + }, + { + "type": "autoText", + "text": "通称——", + "time": 2000 + }, + { + "type": "setCurtain", + "color": [ + 0, + 0, + 0, + 1 + ], + "time": 1000, + "keep": true + }, + { + "type": "changeFloor", + "floorId": "changguan2", + "loc": [ + 0, + 0 + ] + } + ], "eachArrive": [], "parallelDo": "", "events": {}, diff --git a/project/floors/changguan2.js b/project/floors/changguan2.js index 83991f9..05464ca 100644 --- a/project/floors/changguan2.js +++ b/project/floors/changguan2.js @@ -11,7 +11,36 @@ main.floors.changguan2= "images": [], "ratio": 1, "defaultGround": "X20003", - "firstArrive": [], + "firstArrive": [ + { + "type": "setCurtain", + "time": 1000 + }, + { + "type": "autoText", + "text": "《牢狱》", + "time": 2000 + }, + { + "type": "setCurtain", + "color": [ + 0, + 0, + 0, + 1 + ], + "time": 1000, + "keep": true + }, + { + "type": "changeFloor", + "floorId": "KTV", + "loc": [ + 10, + 8 + ] + } + ], "eachArrive": [], "parallelDo": "", "events": {}, diff --git a/project/floors/guangchang.js b/project/floors/guangchang.js index e37a32b..d2eda6c 100644 --- a/project/floors/guangchang.js +++ b/project/floors/guangchang.js @@ -11,7 +11,250 @@ main.floors.guangchang= "images": [], "ratio": 1, "defaultGround": "X90078", - "firstArrive": [], + "firstArrive": [ + { + "type": "setCurtain", + "time": 1000 + }, + { + "type": "setText", + "position": "center" + }, + { + "type": "move", + "loc": [ + 6, + 7 + ], + "time": 500, + "keep": true, + "async": true, + "steps": [ + "up:1", + "left:1", + "up:2" + ] + }, + { + "type": "sleep", + "time": 400 + }, + { + "type": "move", + "loc": [ + 8, + 8 + ], + "time": 500, + "keep": true, + "async": true, + "steps": [ + "up:1", + "left:2" + ] + }, + { + "type": "sleep", + "time": 500 + }, + { + "type": "move", + "loc": [ + 4, + 9 + ], + "time": 500, + "keep": true, + "steps": [ + "right:1" + ] + }, + { + "type": "waitAsync" + }, + { + "type": "autoText", + "text": "浮游都市,《诺瓦斯·艾蒂尔》。", + "time": 2000 + }, + { + "type": "move", + "loc": [ + 6, + 5 + ], + "time": 500, + "keep": true, + "async": true, + "steps": [ + "up:2" + ] + }, + { + "type": "move", + "loc": [ + 6, + 7 + ], + "time": 500, + "keep": true, + "steps": [ + "up:1" + ] + }, + { + "type": "waitAsync" + }, + { + "type": "sleep", + "time": 2000 + }, + { + "type": "move", + "loc": [ + 6, + 3 + ], + "time": 500, + "async": true, + "steps": [ + "down:9" + ] + }, + { + "type": "move", + "loc": [ + 5, + 4 + ], + "time": 500, + "keep": true, + "async": true, + "steps": [ + "up:1", + "right:1" + ] + }, + { + "type": "move", + "loc": [ + 6, + 6 + ], + "time": 300, + "keep": true, + "async": true, + "steps": [ + "right:2" + ] + }, + { + "type": "sleep", + "time": 1000 + }, + { + "type": "move", + "loc": [ + 8, + 6 + ], + "time": 500, + "keep": true, + "steps": [ + "left:1" + ] + }, + { + "type": "sleep", + "time": 2000 + }, + { + "type": "waitAsync" + }, + { + "type": "jump", + "from": [ + 7, + 6 + ], + "to": [ + 7, + 6 + ], + "time": 500, + "keep": true, + "async": true + }, + { + "type": "move", + "loc": [ + 6, + 3 + ], + "time": 500, + "async": true, + "steps": [ + "up:2" + ] + }, + { + "type": "move", + "loc": [ + 7, + 9 + ], + "time": 500, + "async": true, + "steps": [ + "up:1", + "right:3" + ] + }, + { + "type": "setCurtain", + "color": [ + 0, + 0, + 0, + 1 + ], + "time": 1000, + "keep": true + }, + { + "type": "waitAsync" + }, + { + "type": "setBlock", + "number": "0", + "loc": [ + [ + 5, + 9 + ], + [ + 7, + 6 + ], + [ + 4, + 4 + ], + [ + 6, + 3 + ] + ] + }, + { + "type": "changeFloor", + "floorId": "guangchang2", + "loc": [ + 0, + 0 + ] + } + ], "eachArrive": [], "parallelDo": "", "events": {}, @@ -50,13 +293,13 @@ main.floors.guangchang= [120007,120007,120007,120007,120020, 0, 91, 0, 0,130187,130188,130189,130190], [120015,120015,120015,120015,120028, 0, 0, 0, 0,120144,120145,120146,120147], [130172,130173,130174,130175, 0, 0, 0, 0,71320,120152,120153,120154,120155], - [130180,130181,130182,130183,200199, 0, 0, 0,71328,120160,120161,120162,120163], - [130188,130189,130190,130191, 0, 0, 0, 0,71336,120168,120169,120170,120171], - [130196,130197,130198,130199,140087, 0, 0, 0, 0,120176,140020,140020,140020], + [130180,130181,130182,130183,200199, 0, 0,122,71328,120160,120161,120162,120163], + [130188,130189,130190,130191,121, 0, 0, 0,71336,120168,120169,120170,120171], + [130196,130197,130198,130199,140087, 0,121, 0, 0,120176,140020,140020,140020], [130204, 0,130206,130207,140095, 0, 0, 0, 0, 0,140028,140028,140028], - [ 0, 0,130214,130215,140103, 0, 0, 0, 0, 0, 0, 0, 0], - [ 0, 0,130214,120172,140111, 0, 0, 0, 0, 0, 0, 0, 94], - [ 0, 0, 0,120180, 0, 0, 0, 0, 0,200199, 0, 0, 0], + [ 0, 0,130214,130215,140103, 0,121, 0, 0, 0, 0, 0, 0], + [ 0, 0,130214,120172,140111, 0, 0, 0,123, 0, 0, 0, 94], + [ 0, 0, 0,120180,121, 0, 0,121, 0,200199, 0, 0, 0], [140107,140108,140109,362,363, 0, 0, 0,361,362,362,362,362], [210186,210186,210186,210186,210179, 0, 0, 0,210179,210185,210186,210186,210186], [210178,210178,210178,210178,210171, 0, 93, 0,210171,210177,210178,210178,210178] diff --git a/project/floors/guangchang2.js b/project/floors/guangchang2.js index 8d4286f..075f31b 100644 --- a/project/floors/guangchang2.js +++ b/project/floors/guangchang2.js @@ -11,7 +11,35 @@ main.floors.guangchang2= "images": [], "ratio": 1, "defaultGround": "X90078", - "firstArrive": [], + "firstArrive": [ + { + "type": "setCurtain", + "time": 1000 + }, + { + "type": "sleep", + "time": 2000 + }, + { + "type": "setCurtain", + "color": [ + 0, + 0, + 0, + 1 + ], + "time": 1000, + "keep": true + }, + { + "type": "changeFloor", + "floorId": "guangchang5", + "loc": [ + 0, + 0 + ] + } + ], "eachArrive": [], "parallelDo": "", "events": {}, diff --git a/project/floors/guangchang3.js b/project/floors/guangchang3.js index 57aedab..d26c896 100644 --- a/project/floors/guangchang3.js +++ b/project/floors/guangchang3.js @@ -11,7 +11,35 @@ main.floors.guangchang3= "images": [], "ratio": 1, "defaultGround": "X90078", - "firstArrive": [], + "firstArrive": [ + { + "type": "setCurtain", + "time": 1000 + }, + { + "type": "sleep", + "time": 2000 + }, + { + "type": "setCurtain", + "color": [ + 0, + 0, + 0, + 1 + ], + "time": 1000, + "keep": true + }, + { + "type": "changeFloor", + "floorId": "guangchang4", + "loc": [ + 0, + 0 + ] + } + ], "eachArrive": [], "parallelDo": "", "events": {}, diff --git a/project/floors/guangchang4.js b/project/floors/guangchang4.js index dce94bd..c94cccf 100644 --- a/project/floors/guangchang4.js +++ b/project/floors/guangchang4.js @@ -11,7 +11,36 @@ main.floors.guangchang4= "images": [], "ratio": 1, "defaultGround": "X90078", - "firstArrive": [], + "firstArrive": [ + { + "type": "setCurtain", + "time": 1000 + }, + { + "type": "autoText", + "text": "是被险峻的峭壁环绕,与世隔绝的,都市的最底部", + "time": 2000 + }, + { + "type": "setCurtain", + "color": [ + 0, + 0, + 0, + 1 + ], + "time": 1000, + "keep": true + }, + { + "type": "changeFloor", + "floorId": "changguan1", + "loc": [ + 0, + 0 + ] + } + ], "eachArrive": [], "parallelDo": "", "events": {}, diff --git a/project/floors/guangchang5.js b/project/floors/guangchang5.js index 6bdd243..5ff68fb 100644 --- a/project/floors/guangchang5.js +++ b/project/floors/guangchang5.js @@ -11,7 +11,36 @@ main.floors.guangchang5= "images": [], "ratio": 1, "defaultGround": "X90078", - "firstArrive": [], + "firstArrive": [ + { + "type": "setCurtain", + "time": 1000 + }, + { + "type": "autoText", + "text": "《特别受灾地区》——", + "time": 2000 + }, + { + "type": "setCurtain", + "color": [ + 0, + 0, + 0, + 1 + ], + "time": 1000, + "keep": true + }, + { + "type": "changeFloor", + "floorId": "guangchang3", + "loc": [ + 0, + 0 + ] + } + ], "eachArrive": [], "parallelDo": "", "events": {}, diff --git a/project/floors/jiaocheng01.js b/project/floors/jiaocheng01.js new file mode 100644 index 0000000..7e78739 --- /dev/null +++ b/project/floors/jiaocheng01.js @@ -0,0 +1,77 @@ +main.floors.jiaocheng01= +{ + "floorId": "jiaocheng01", + "title": "广场", + "name": "1", + "width": 13, + "height": 13, + "canFlyTo": true, + "canFlyFrom": true, + "canUseQuickShop": true, + "images": [], + "ratio": 1, + "defaultGround": "X90078", + "firstArrive": [], + "eachArrive": [], + "parallelDo": "", + "events": { + "0,11": [ + "宝石介绍:攻防法速\n加点量:2/2/5/2" + ], + "12,11": [ + "血瓶介绍:不同大小" + ] + }, + "changeFloor": { + "6,0": { + "floorId": "jiaocheng02", + "loc": [ + 6, + 12 + ] + } + }, + "beforeBattle": {}, + "afterBattle": {}, + "afterGetItem": { + "6,9": [ + "\t[黄钥匙,yellowKey]可以打开一扇黄门,使用后会消失" + ] + }, + "afterOpenDoor": { + "8,10": [ + "\t[黄门,yellowDoor]消耗一把黄钥匙" + ] + }, + "autoEvent": {}, + "cannotMove": {}, + "cannotMoveIn": {}, + "map": [ + [ 1, 1, 1, 1, 1, 1, 91, 1, 1, 1, 1, 1, 1], + [ 1, 22, 0, 1, 22, 1, 0, 1, 0, 0, 23, 22, 1], + [ 1, 21, 0, 1, 81, 1, 84, 1, 83, 1, 1, 1, 1], + [ 1, 82, 1, 1, 0, 0, 0, 81, 0, 83, 0, 24, 1], + [ 1, 0, 0, 82, 0, 1, 81, 1, 82, 1, 1, 1, 1], + [ 1, 21, 1, 1, 0, 1, 22, 1, 0, 0, 21, 23, 1], + [ 1, 1, 1, 1, 83, 1, 1, 1, 1, 1, 1, 1, 1], + [ 27, 0, 28, 1, 0, 0, 82, 0, 22, 1, 31, 0, 32], + [ 0, 0, 0, 1, 21, 1, 1, 1, 0, 1, 0, 0, 0], + [ 29, 0, 30, 1, 23, 1, 21, 1, 0, 1, 34, 0, 33], + [ 1, 1, 1, 1, 1, 1, 0, 1, 81, 1, 1, 1, 1], + [129, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,129], + [ 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1] +], + "areas": "牢狱", + "bgmap": [ + +], + "fgmap": [ + +], + "bg2map": [ + +], + "fg2map": [ + +] +} \ No newline at end of file diff --git a/project/floors/jiaocheng02.js b/project/floors/jiaocheng02.js new file mode 100644 index 0000000..9d5616e --- /dev/null +++ b/project/floors/jiaocheng02.js @@ -0,0 +1,72 @@ +main.floors.jiaocheng02= +{ + "floorId": "jiaocheng02", + "title": "广场", + "name": "1", + "width": 13, + "height": 13, + "canFlyTo": true, + "canFlyFrom": true, + "canUseQuickShop": true, + "images": [], + "ratio": 1, + "defaultGround": "X90078", + "firstArrive": [], + "eachArrive": [], + "parallelDo": "", + "events": { + "5,11": [ + "教程初始属性:\n1000HP,30攻击,20防御,20速度,20法强(*100%=20护盾)\n绿血瓶此处900,红血瓶100" + ], + "0,0": [ + "匕首:速度+20" + ], + "12,0": [ + "法杖:魔攻比例10%,魔防比例0%" + ] + }, + "changeFloor": { + "6,12": { + "floorId": "jiaocheng01", + "loc": [ + 6, + 0 + ] + } + }, + "beforeBattle": {}, + "afterBattle": {}, + "afterGetItem": {}, + "afterOpenDoor": {}, + "autoEvent": {}, + "cannotMove": {}, + "cannotMoveIn": {}, + "map": [ + [129, 1, 27, 1, 28, 1, 91, 1, 29, 1, 30, 1,129], + [ 70, 1, 82, 1, 82, 1,236, 1, 82, 1, 82, 1,375], + [ 0, 83, 0, 29, 0, 33, 0, 31, 0, 23, 0, 83, 0], + [ 1, 1, 1, 1, 1, 1,219, 1, 1, 1, 1, 1, 1], + [ 0, 22, 0, 31, 0, 31, 0, 1, 27, 1, 30, 1, 30], + [ 81, 1, 81, 1, 81, 1, 22, 1, 27, 1, 30, 1, 27], + [ 29, 1, 31, 1, 31, 1,218, 1, 82, 1, 82, 1, 82], + [ 28, 1, 28, 1, 29, 1, 0, 81, 0, 33, 0, 21, 0], + [ 1, 1, 1, 1, 1, 1,240, 1, 1, 1, 1, 1, 1], + [ 0, 33, 0, 21, 0, 29, 0, 1, 27, 1, 28, 1, 31], + [ 83, 1, 83, 1, 83, 1,204, 1, 81, 1, 81, 1, 81], + [ 28, 1, 30, 1, 27,129, 0,204, 0, 33, 0, 23, 0], + [ 1, 1, 1, 1, 1, 1, 93, 1, 1, 1, 1, 1, 1] +], + "areas": "牢狱", + "bgmap": [ + +], + "fgmap": [ + +], + "bg2map": [ + +], + "fg2map": [ + +] +} \ No newline at end of file diff --git a/project/floors/xiaoxiang01.js b/project/floors/xiaoxiang01.js index 2e55dad..85f6bd0 100644 --- a/project/floors/xiaoxiang01.js +++ b/project/floors/xiaoxiang01.js @@ -55,9 +55,9 @@ main.floors.xiaoxiang01= [120147, 0, 32, 0,200199, 0,201029,225,110132,224, 0, 0,90675], [120164,225,200998,200999,201037, 81,201029, 0, 0, 0,110116, 0, 94], [120172, 0,222, 0,221, 0,201029, 81,110116,225,110137,110138,90650], - [120180,201037,201037, 81,201037,201037,201037, 0,110124, 0, 81, 31,90658], + [120180,201037,201037, 81,201037,201037,201037,246,110124, 0, 81, 31,90658], [ 92, 32, 32, 22, 21,80089, 31, 0,110132, 0,110122,110122,110197], - [140,110191, 21, 21, 21,80089, 0, 0, 81, 0,222, 29,110197], + [140,110191, 21, 21, 21,80089, 0,246, 81, 0,222, 29,110197], [140,140,140,110191,80083,80097, 93,110138,110138,140189,140,140,140] ], "areas": "牢狱", diff --git a/project/floors/yiqu7.js b/project/floors/yiqu7.js index d47401f..e2e082b 100644 --- a/project/floors/yiqu7.js +++ b/project/floors/yiqu7.js @@ -1,29 +1,29 @@ main.floors.yiqu7= { -"floorId": "yiqu7", -"title": "主塔 7 层", -"name": "7", -"width": 13, -"height": 13, -"canFlyTo": true, -"canFlyFrom": true, -"canUseQuickShop": true, -"images": [], -"ratio": 1, -"defaultGround": "grass2", -"firstArrive": [], -"eachArrive": [], -"parallelDo": "", -"events": {}, -"changeFloor": {}, -"beforeBattle": {}, -"afterBattle": {}, -"afterGetItem": {}, -"afterOpenDoor": {}, -"autoEvent": {}, -"cannotMove": {}, -"cannotMoveIn": {}, -"map": [ + "floorId": "yiqu7", + "title": "主塔 7 层", + "name": "7", + "width": 13, + "height": 13, + "canFlyTo": true, + "canFlyFrom": true, + "canUseQuickShop": true, + "images": [], + "ratio": 1, + "defaultGround": "grass2", + "firstArrive": [], + "eachArrive": [], + "parallelDo": "", + "events": {}, + "changeFloor": {}, + "beforeBattle": {}, + "afterBattle": {}, + "afterGetItem": {}, + "afterOpenDoor": {}, + "autoEvent": {}, + "cannotMove": {}, + "cannotMoveIn": {}, + "map": [ [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], @@ -38,4 +38,16 @@ main.floors.yiqu7= [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] ], + "bgmap": [ + +], + "fgmap": [ + +], + "bg2map": [ + +], + "fg2map": [ + +] } \ No newline at end of file diff --git a/project/functions.js b/project/functions.js index a9ae699..459927d 100644 --- a/project/functions.js +++ b/project/functions.js @@ -82,168 +82,168 @@ var functions_d6ad677b_427a_4623_b50f_a445a3b0ef8a = }); }, "lose": function (reason) { - // 游戏失败事件 - core.ui.closePanel(); - var replaying = core.isReplaying(); - core.stopReplay(); - core.waitHeroToStop(function () { - core.drawText( - ["\t[" + (reason || "结局1") + "]你死了。\n如题。"], - function () { - core.events.gameOver(null, replaying); - } - ); - }); - }, + // 游戏失败事件 + core.ui.closePanel(); + var replaying = core.isReplaying(); + core.stopReplay(); + core.waitHeroToStop(function () { + core.drawText( + ["\t[" + (reason || "结局1") + "]你死了。\n如题。"], + function () { + core.events.gameOver(null, replaying); + } + ); + }); +}, "changingFloor": function (floorId, heroLoc) { - // 正在切换楼层过程中执行的操作;此函数的执行时间是“屏幕完全变黑“的那一刻 - // floorId为要切换到的楼层ID;heroLoc表示勇士切换到的位置 + // 正在切换楼层过程中执行的操作;此函数的执行时间是“屏幕完全变黑“的那一刻 + // floorId为要切换到的楼层ID;heroLoc表示勇士切换到的位置 - // ---------- 此时还没有进行切换,当前floorId还是原来的 ---------- // - var currentId = core.status.floorId || null; // 获得当前的floorId,可能为null - var fromLoad = core.hasFlag("__fromLoad__"); // 是否是读档造成的切换 - var isFlying = core.hasFlag("__isFlying__"); // 是否是楼传造成的切换 - if (!fromLoad && !(isFlying && currentId == floorId)) { - if (!core.hasFlag("__leaveLoc__")) core.setFlag("__leaveLoc__", {}); - if (currentId != null) - core.getFlag("__leaveLoc__")[currentId] = core.clone( - core.status.hero.loc - ); - } + // ---------- 此时还没有进行切换,当前floorId还是原来的 ---------- // + var currentId = core.status.floorId || null; // 获得当前的floorId,可能为null + var fromLoad = core.hasFlag("__fromLoad__"); // 是否是读档造成的切换 + var isFlying = core.hasFlag("__isFlying__"); // 是否是楼传造成的切换 + if (!fromLoad && !(isFlying && currentId == floorId)) { + if (!core.hasFlag("__leaveLoc__")) core.setFlag("__leaveLoc__", {}); + if (currentId != null) + core.getFlag("__leaveLoc__")[currentId] = core.clone( + core.status.hero.loc + ); + } - // 可以对currentId进行判定,比如删除某些自定义图层等 - // if (currentId == 'MT0') { - // core.deleteAllCanvas(); - // } + // 可以对currentId进行判定,比如删除某些自定义图层等 + // if (currentId == 'MT0') { + // core.deleteAllCanvas(); + // } - // 根据分区信息自动砍层与恢复 - if (core.autoRemoveMaps) core.autoRemoveMaps(floorId); + // 根据分区信息自动砍层与恢复 + if (core.autoRemoveMaps) core.autoRemoveMaps(floorId); - // 重置画布尺寸 - core.maps.resizeMap(floorId); - // 设置勇士的位置 - heroLoc.direction = core.turnDirection(heroLoc.direction); - core.status.hero.loc = heroLoc; - // 检查重生怪并重置 - if (!fromLoad) { - core.extractBlocks(floorId); - core.status.maps[floorId].blocks.forEach(function (block) { - if (block.disable && core.enemys.hasSpecial(block.event.id, 23)) { - block.disable = false; - core.setMapBlockDisabled(floorId, block.x, block.y, false); - core.maps._updateMapArray(floorId, block.x, block.y); - } - }); - core.control.gatherFollowers(); - } + // 重置画布尺寸 + core.maps.resizeMap(floorId); + // 设置勇士的位置 + heroLoc.direction = core.turnDirection(heroLoc.direction); + core.status.hero.loc = heroLoc; + // 检查重生怪并重置 + if (!fromLoad) { + core.extractBlocks(floorId); + core.status.maps[floorId].blocks.forEach(function (block) { + if (block.disable && core.enemys.hasSpecial(block.event.id, 23)) { + block.disable = false; + core.setMapBlockDisabled(floorId, block.x, block.y, false); + core.maps._updateMapArray(floorId, block.x, block.y); + } + }); + core.control.gatherFollowers(); + } - // ---------- 重绘新地图;这一步将会设置core.status.floorId ---------- // - core.drawMap(floorId); + // ---------- 重绘新地图;这一步将会设置core.status.floorId ---------- // + core.drawMap(floorId); - // 切换楼层BGM - if (core.status.maps[floorId].bgm) { - var bgm = core.status.maps[floorId].bgm; - if (bgm instanceof Array) - bgm = bgm[Math.floor(Math.random() * bgm.length)]; // 多个bgm则随机播放一个 - if (!core.hasFlag("__bgm__")) core.playBgm(bgm); - } else if (fromLoad && !core.hasFlag("__bgm__")) { - core.pauseBgm(); - } - // 更改画面色调 - var color = core.getFlag("__color__", null); - if (!color && core.status.maps[floorId].color) - color = core.status.maps[floorId].color; - core.clearMap("curtain"); - core.status.curtainColor = color; - if (color) - core.fillRect( - "curtain", - 0, - 0, - core._PX_ || core.__PIXELS__, - core._PY_ || core.__PIXELS__, - core.arrayToRGBA(color) - ); - // 更改天气 - var weather = core.getFlag("__weather__", null); - if (!weather && core.status.maps[floorId].weather) - weather = core.status.maps[floorId].weather; - if (weather) core.setWeather(weather[0], weather[1]); - else core.setWeather(); + // 切换楼层BGM + if (core.status.maps[floorId].bgm) { + var bgm = core.status.maps[floorId].bgm; + if (bgm instanceof Array) + bgm = bgm[Math.floor(Math.random() * bgm.length)]; // 多个bgm则随机播放一个 + if (!core.hasFlag("__bgm__")) core.playBgm(bgm); + } else if (fromLoad && !core.hasFlag("__bgm__")) { + core.pauseBgm(); + } + // 更改画面色调 + var color = core.getFlag("__color__", null); + if (!color && core.status.maps[floorId].color) + color = core.status.maps[floorId].color; + core.clearMap("curtain"); + core.status.curtainColor = color; + if (color) + core.fillRect( + "curtain", + 0, + 0, + core._PX_ || core.__PIXELS__, + core._PY_ || core.__PIXELS__, + core.arrayToRGBA(color) + ); + // 更改天气 + var weather = core.getFlag("__weather__", null); + if (!weather && core.status.maps[floorId].weather) + weather = core.status.maps[floorId].weather; + if (weather) core.setWeather(weather[0], weather[1]); + else core.setWeather(); - // ...可以新增一些其他内容,比如创建个画布在右上角显示什么内容等等 - }, + // ...可以新增一些其他内容,比如创建个画布在右上角显示什么内容等等 +}, "afterChangeFloor": function (floorId) { - // 转换楼层结束的事件;此函数会在整个楼层切换完全结束后再执行 - // floorId是切换到的楼层 + // 转换楼层结束的事件;此函数会在整个楼层切换完全结束后再执行 + // floorId是切换到的楼层 - // 如果是读档,则进行检查(是否需要恢复事件) - if (core.hasFlag("__fromLoad__")) { - core.events.recoverEvents(core.getFlag("__events__")); - core.removeFlag("__events__"); - } else { - // 每次抵达楼层执行的事件 - core.insertAction(core.floors[floorId].eachArrive); - core.ui.statusBar._update_map(); - // 首次抵达楼层时执行的事件(后插入,先执行) - if (!core.hasVisitedFloor(floorId)) { - core.insertAction(core.floors[floorId].firstArrive); - core.visitFloor(floorId); - core.plugin.bfs(); - } - } - }, + // 如果是读档,则进行检查(是否需要恢复事件) + if (core.hasFlag("__fromLoad__")) { + core.events.recoverEvents(core.getFlag("__events__")); + core.removeFlag("__events__"); + } else { + // 每次抵达楼层执行的事件 + core.insertAction(core.floors[floorId].eachArrive); + core.ui.statusBar._update_map(); + // 首次抵达楼层时执行的事件(后插入,先执行) + if (!core.hasVisitedFloor(floorId)) { + core.insertAction(core.floors[floorId].firstArrive); + core.visitFloor(floorId); + core.plugin.bfs(); + } + } +}, "flyTo": function (toId, callback) { - // 楼层传送器的使用,从当前楼层飞往toId - // 如果不能飞行请返回false + // 楼层传送器的使用,从当前楼层飞往toId + // 如果不能飞行请返回false - var fromId = core.status.floorId; + var fromId = core.status.floorId; - // 检查能否飞行 - if ( - !core.status.maps[fromId].canFlyFrom || - !core.status.maps[toId].canFlyTo || - !core.hasVisitedFloor(toId) - ) { - core.playSound("操作失败"); - core.drawTip("无法飞往" + core.status.maps[toId].title + "!", "fly"); - return false; - } + // 检查能否飞行 + if ( + !core.status.maps[fromId].canFlyFrom || + !core.status.maps[toId].canFlyTo || + !core.hasVisitedFloor(toId) + ) { + core.playSound("操作失败"); + core.drawTip("无法飞往" + core.status.maps[toId].title + "!", "fly"); + return false; + } - // 平面塔模式 - var stair = null, - loc = null; - if (core.flags.flyRecordPosition) { - loc = core.getFlag("__leaveLoc__", {})[toId] || null; - } - if ( - core.status.maps[toId].flyPoint != null && - core.status.maps[toId].flyPoint.length == 2 - ) { - stair = "flyPoint"; - } - if (stair == null && loc == null) { - // 获得两个楼层的索引,以决定是上楼梯还是下楼梯 - var fromIndex = core.floorIds.indexOf(fromId), - toIndex = core.floorIds.indexOf(toId); - var stair = fromIndex <= toIndex ? "downFloor" : "upFloor"; - // 地下层:同层传送至上楼梯 - if (fromIndex == toIndex && core.status.maps[fromId].underGround) - stair = "upFloor"; - } + // 平面塔模式 + var stair = null, + loc = null; + if (core.flags.flyRecordPosition) { + loc = core.getFlag("__leaveLoc__", {})[toId] || null; + } + if ( + core.status.maps[toId].flyPoint != null && + core.status.maps[toId].flyPoint.length == 2 + ) { + stair = "flyPoint"; + } + if (stair == null && loc == null) { + // 获得两个楼层的索引,以决定是上楼梯还是下楼梯 + var fromIndex = core.floorIds.indexOf(fromId), + toIndex = core.floorIds.indexOf(toId); + var stair = fromIndex <= toIndex ? "downFloor" : "upFloor"; + // 地下层:同层传送至上楼梯 + if (fromIndex == toIndex && core.status.maps[fromId].underGround) + stair = "upFloor"; + } - // 记录录像 - core.status.route.push("fly:" + toId); - // 传送 - core.ui.closePanel(); - core.setFlag("__isFlying__", true); - core.changeFloor(toId, stair, loc, null, function () { - core.removeFlag("__isFlying__"); - if (callback) callback(); - }); + // 记录录像 + core.status.route.push("fly:" + toId); + // 传送 + core.ui.closePanel(); + core.setFlag("__isFlying__", true); + core.changeFloor(toId, stair, loc, null, function () { + core.removeFlag("__isFlying__"); + if (callback) callback(); + }); - return true; - }, + return true; +}, "beforeBattle": function (enemyId, x, y) { // 战斗前触发的事件,可以加上一些战前特效(详见下面支援的例子) // 此函数在“检测能否战斗和自动存档”【之后】执行。如果需要更早的战前事件,请在插件中覆重写 core.events.doSystemEvent 函数。 @@ -282,32 +282,43 @@ var functions_d6ad677b_427a_4623_b50f_a445a3b0ef8a = return true; }, - "afterBattle": function (enemyId, x, y) { + "afterBattle": async function (enemyId, x, y) { // 战斗结束后触发的事件 - - var enemy = core.material.enemys[enemyId]; + var enemy = core.getEnemyInfo(enemyId, hero, x, y) var special = enemy.special; - // 播放战斗音效和动画 // 默认播放的动画;你也可以使用 - var animate = "hand"; // 默认动画 + var animate = 'hand'; // 默认动画 // 检查当前装备是否存在攻击动画 var equipId = core.getEquip(0); if (equipId && (core.material.items[equipId].equip || {}).animate) animate = core.material.items[equipId].equip.animate; // 你也可以在这里根据自己的需要,比如enemyId或special或flag来修改播放的动画效果 // if (enemyId == '...') animate = '...'; + if (core.getFlag('noAnimate')) { + // 检查该动画是否存在SE,如果不存在则使用默认音效 + if (!(core.material.animates[animate] || {}).se) + core.playSound('attack.mp3'); - // 检查该动画是否存在SE,如果不存在则使用默认音效 - if (!(core.material.animates[animate] || {}).se) - core.playSound("attack.opus"); - - // 播放动画;如果不存在坐标(强制战斗)则播放到勇士自身 - if (x != null && y != null) core.drawAnimate(animate, x, y); - else core.drawHeroAnimate(animate); - + // 播放动画;如果不存在坐标(强制战斗)则播放到勇士自身 + if (x != null && y != null) + core.drawAnimate(animate, x, y); + else + core.drawHeroAnimate(animate); + } // 获得战斗伤害信息 var damageInfo = core.getDamageInfo(enemyId, null, x, y) || {}; + if ((!core.getFlag("noAnimate") || damageInfo.damage >= core.status.hero.hp) && (!main.replayChecking && !core.isReplaying())) await core.attackAnimate( + enemyId, + damageInfo.start[0], + damageInfo.start[1], + damageInfo.start[2], + damageInfo.start[3], + damageInfo.heroDiffList, + damageInfo.enemyDiffList, + damageInfo.heroanimateList, + damageInfo.enemyanimateList + ) // 战斗伤害 var damage = damageInfo.damage; // 当前战斗回合数,可用于战后所需的判定 @@ -316,7 +327,7 @@ var functions_d6ad677b_427a_4623_b50f_a445a3b0ef8a = if (damage == null || damage >= core.status.hero.hp) { core.status.hero.hp = 0; core.updateStatusBar(false, true); - core.events.lose("战斗失败"); + core.events.lose('战斗失败'); return; } @@ -336,8 +347,8 @@ var functions_d6ad677b_427a_4623_b50f_a445a3b0ef8a = var money = guards.reduce(function (curr, g) { return curr + core.material.enemys[g[2]].money; }, core.getEnemyValue(enemy, "money", x, y)); - if (core.hasItem("coin")) money *= 2; // 幸运金币:双倍 - if (core.hasFlag("curse")) money = 0; // 诅咒效果 + if (core.hasItem('coin')) money *= 2; // 幸运金币:双倍 + if (core.hasFlag('curse')) money = 0; // 诅咒效果 core.status.hero.money += money; core.status.hero.statistics.money += money; @@ -345,32 +356,32 @@ var functions_d6ad677b_427a_4623_b50f_a445a3b0ef8a = var exp = guards.reduce(function (curr, g) { return curr + core.material.enemys[g[2]].exp; }, core.getEnemyValue(enemy, "exp", x, y)); - if (core.hasFlag("curse")) exp = 0; + if (core.hasFlag('curse')) exp = 0; core.status.hero.exp += exp; core.status.hero.statistics.exp += exp; var hint = "打败 " + core.getEnemyValue(enemy, "name", x, y); - if (core.flags.statusBarItems.indexOf("enableMoney") >= 0) - hint += "," + core.getStatusLabel("money") + "+" + money; // hint += ",金币+" + money; - if (core.flags.statusBarItems.indexOf("enableExp") >= 0) - hint += "," + core.getStatusLabel("exp") + "+" + exp; // hint += ",经验+" + exp; + if (core.flags.statusBarItems.indexOf('enableMoney') >= 0) + hint += ',' + core.getStatusLabel('money') + '+' + money; // hint += ",金币+" + money; + if (core.flags.statusBarItems.indexOf('enableExp') >= 0) + hint += ',' + core.getStatusLabel('exp') + '+' + exp; // hint += ",经验+" + exp; core.drawTip(hint, enemy.id); // 中毒 if (core.enemys.hasSpecial(special, 12)) { - core.triggerDebuff("get", "poison"); + core.triggerDebuff('get', 'poison'); } // 衰弱 if (core.enemys.hasSpecial(special, 13)) { - core.triggerDebuff("get", "weak"); + core.triggerDebuff('get', 'weak'); } // 诅咒 if (core.enemys.hasSpecial(special, 14)) { - core.triggerDebuff("get", "curse"); + core.triggerDebuff('get', 'curse'); } // 仇恨怪物将仇恨值减半 if (core.enemys.hasSpecial(special, 17)) { - core.setFlag("hatred", Math.floor(core.getFlag("hatred", 0) / 2)); + core.setFlag('hatred', Math.floor(core.getFlag('hatred', 0) / 2)); } // 自爆 if (core.enemys.hasSpecial(special, 19)) { @@ -379,45 +390,41 @@ var functions_d6ad677b_427a_4623_b50f_a445a3b0ef8a = } // 退化 if (core.enemys.hasSpecial(special, 21)) { - core.status.hero.atk -= enemy.atkValue || 0; - core.status.hero.def -= enemy.defValue || 0; + core.status.hero.atk -= (enemy.atkValue || 0); + core.status.hero.def -= (enemy.defValue || 0); if (core.status.hero.atk < 0) core.status.hero.atk = 0; if (core.status.hero.def < 0) core.status.hero.def = 0; } // 增加仇恨值 - core.setFlag("hatred", core.getFlag("hatred", 0) + core.values.hatred); + core.setFlag('hatred', core.getFlag('hatred', 0) + core.values.hatred); // 战后的技能处理,比如扣除魔力值 - if (core.flags.statusBarItems.indexOf("enableSkill") >= 0) { + if (core.flags.statusBarItems.indexOf('enableSkill') >= 0) { // 检测当前开启的技能类型 - var skill = core.getFlag("skill", 0); - if (skill == 1) { - // 技能1:二倍斩 + var skill = core.getFlag('skill', 0); + if (skill == 1) { // 技能1:二倍斩 core.status.hero.mana -= 5; // 扣除5点魔力值 } // 关闭技能 - core.setFlag("skill", 0); - core.setFlag("skillName", "无"); + core.setFlag('skill', 0); + core.setFlag('skillName', '无'); } + // 事件的处理 var todo = []; // 加点事件 - var point = - guards.reduce(function (curr, g) { - return curr + core.material.enemys[g[2]].point; - }, core.getEnemyValue(enemy, "point", x, y)) || 0; + var point = guards.reduce(function (curr, g) { + return curr + core.material.enemys[g[2]].point; + }, core.getEnemyValue(enemy, "point", x, y)) || 0; if (core.flags.enableAddPoint && point > 0) { - core.push(todo, [{ type: "insert", name: "加点事件", args: [point] }]); + core.push(todo, [{ "type": "insert", "name": "加点事件", "args": [point] }]); } // 战后事件 if (core.status.floorId != null) { - core.push( - todo, - core.floors[core.status.floorId].afterBattle[x + "," + y] - ); + core.push(todo, core.floors[core.status.floorId].afterBattle[x + "," + y]); } core.push(todo, enemy.afterBattle); @@ -434,9 +441,7 @@ var functions_d6ad677b_427a_4623_b50f_a445a3b0ef8a = if (todo.length > 0) core.insertAction(todo, x, y); // 删除该点设置的怪物信息 - delete((flags.enemyOnPoint || {})[core.status.floorId] || {})[ - x + "," + y - ]; + delete((flags.enemyOnPoint || {})[core.status.floorId] || {})[x + "," + y]; // 因为removeBlock和hideBlock都会刷新状态栏,因此将删除部分移动到这里并保证刷新只执行一次,以提升效率 if (core.getBlock(x, y) != null) { @@ -451,8 +456,11 @@ var functions_d6ad677b_427a_4623_b50f_a445a3b0ef8a = } // 如果已有事件正在处理中 - if (core.status.event.id == null) core.continueAutomaticRoute(); - else core.clearContinueAutomaticRoute(); + if (core.status.event.id == null) + core.continueAutomaticRoute(); + else + core.clearContinueAutomaticRoute(); + }, "afterOpenDoor": function (doorId, x, y) { // 开一个门后触发的事件 @@ -524,222 +532,223 @@ var functions_d6ad677b_427a_4623_b50f_a445a3b0ef8a = }, "enemys": { "getSpecials": function () { - // 获得怪物的特殊属性,每一行定义一个特殊属性。 - // 分为五项,第一项为该特殊属性的数字,第二项为特殊属性的名字,第三项为特殊属性的描述 - // 第四项为该特殊属性的颜色,可以写十六进制 #RRGGBB 或者 [r,g,b,a] 四元数组 - // 第五项为该特殊属性的标记;目前 1 代表是地图类技能(需要进行遍历全图) - // 名字和描述可以直接写字符串,也可以写个function将怪物传进去 - return [ - [1, "先攻", "怪物首先攻击", "#ffcc33"], - [3, "坚固", "怪物防御不小于角色攻击-1", "#c0b088"], - [ - 6, - function (enemy) { - return (enemy.n || "") + "连击"; - }, - function (enemy) { - return "怪物每回合攻击" + (enemy.n || 4) + "次"; - }, - "#ffee77", - ], - [ - 7, - "破甲", - function (enemy) { - return ( - "战斗前,怪物附加角色防御的" + - Math.floor( - 100 * (enemy.breakArmor || core.values.breakArmor || 0) - ) + - "%作为伤害" - ); - }, - "#88c0ff", - ], - [ - 8, - "反击", - function (enemy) { - return ( - "战斗时,怪物每回合附加角色攻击的" + - Math.floor( - 100 * (enemy.counterAttack || core.values.counterAttack || 0) - ) + - "%作为伤害,无视角色防御" - ); - }, - "#ffaa44", - ], - [ - 9, - "净化", - function (enemy) { - return ( - "战斗前,怪物附加角色护盾的" + - (enemy.purify || core.values.purify) + - "倍作为伤害" - ); - }, - "#80eed6", - ], - [10, "模仿", "怪物的攻防和角色攻防相等", "#b0c0dd"], - [ - 11, - "吸血", - function (enemy) { - return ( - "战斗前,怪物首先吸取角色的" + - Math.floor(100 * enemy.vampire || 0) + - "%生命(约" + - Math.floor((enemy.vampire || 0) * core.getStatus("hp")) + - "点)作为伤害" + - (enemy.add ? ",并把伤害数值加到自身生命上" : "") - ); - }, - "#dd4448", - ], - [ - 12, - "中毒", - "战斗后,角色陷入中毒状态,每一步损失生命" + - core.values.poisonDamage + - "点", - "#99ee88", - ], - [ - 13, - "衰弱", - "战斗后,角色陷入衰弱状态,攻防暂时下降" + - (core.values.weakValue >= 1 - ? core.values.weakValue + "点" - : parseInt(core.values.weakValue * 100) + "%"), - "#f0bbcc", - ], - [ - 14, - "诅咒", - "战斗后,角色陷入诅咒状态,战斗无法获得金币和经验", - "#bbeef0", - ], - [ - 15, - "领域", - function (enemy) { - return ( - "经过怪物周围" + - (enemy.zoneSquare ? "九宫格" : "十字") + - "范围内" + - (enemy.range || 1) + - "格时自动减生命" + - (enemy.zone || 0) + - "点" - ); - }, - "#c677dd", - ], - [16, "夹击", "经过两只相同的怪物中间,角色生命值变成一半", "#bb99ee"], - [ - 17, - "仇恨", - "战斗前,怪物附加之前积累的仇恨值作为伤害;战斗后,释放一半的仇恨值。(每杀死一个怪物获得" + - (core.values.hatred || 0) + - "点仇恨值)", - "#b0b666", - ], - [ - 18, - "阻击", - function (enemy) { - return ( - "经过怪物周围" + - (enemy.zoneSquare ? "九宫格" : "十字") + - "时自动减生命" + - (enemy.repulse || 0) + - "点,同时怪物后退一格" - ); - }, - "#8888e6", - ], - [19, "自爆", "战斗后角色的生命值变成1", "#ff6666"], - [20, "无敌", "角色无法打败怪物,除非拥有十字架", "#aaaaaa"], - [ - 21, - "退化", - function (enemy) { - return ( - "战斗后角色永久下降" + - (enemy.atkValue || 0) + - "点攻击和" + - (enemy.defValue || 0) + - "点防御" - ); - }, - ], - [ - 22, - "固伤", - function (enemy) { - return ( - "战斗前,怪物对角色造成" + - (enemy.damage || 0) + - "点固定伤害,未开启负伤时无视角色护盾。" - ); - }, - "#ff9977", - ], - [23, "重生", "怪物被击败后,角色转换楼层则怪物将再次出现", "#a0e0ff"], - [ - 24, - "激光", - function (enemy) { - return "经过怪物同行或同列时自动减生命" + (enemy.laser || 0) + "点"; - }, - "#dda0dd", - ], - [ - 25, - "光环", - function (enemy) { - return ( - (enemy.range != null - ? (enemy.haloSquare ? "该怪物九宫格" : "该怪物十字") + - enemy.haloRange + - "格范围内" - : "同楼层所有") + - "怪物生命提升" + - (enemy.hpBuff || 0) + - "%,攻击提升" + - (enemy.atkBuff || 0) + - "%,防御提升" + - (enemy.defBuff || 0) + - "%," + - (enemy.haloAdd ? "可叠加" : "不可叠加") - ); - }, - "#e6e099", - 1, - ], - [ - 26, - "支援", - "当周围一圈的怪物受到攻击时将上前支援,并组成小队战斗。", - "#77c0b6", - 1, - ], - [ - 27, - "捕捉", - function (enemy) { - return ( - "当走到怪物周围" + - (enemy.zoneSquare ? "九宫格" : "十字") + - "时会强制进行战斗。" - ); - }, - "#c0ddbb", - ], - ]; - }, + // 获得怪物的特殊属性,每一行定义一个特殊属性。 + // 分为五项,第一项为该特殊属性的数字,第二项为特殊属性的名字,第三项为特殊属性的描述 + // 第四项为该特殊属性的颜色,可以写十六进制 #RRGGBB 或者 [r,g,b,a] 四元数组 + // 第五项为该特殊属性的标记;目前 1 代表是地图类技能(需要进行遍历全图) + // 名字和描述可以直接写字符串,也可以写个function将怪物传进去 + return [ + [1, "先攻", "怪物首先攻击", "#ffcc33"], //√ + //[2, "魔攻", "怪物无视角色的防御", "#bbb0ff"], + [3, "坚固", "怪物防御不小于角色攻击-1", "#c0b088"], //√ + [ + 6, + function (enemy) { + return (enemy.n || "") + "连击"; + }, + function (enemy) { + return "怪物每回合攻击" + (enemy.n || 4) + "次"; + }, + "#ffee77", + ], //想改成“以XX%、XX%攻击力各攻击一次” + [ + 7, + "破甲", + function (enemy) { + return ( + "怪物无视角色防御的" + + Math.floor( + 100 * (enemy.breakArmor || core.values.breakArmor || 0) + ) + + "%" + ); + }, + "#88c0ff", + ], //√ + [ + 8, + "反击", + function (enemy) { + return ( + "战斗时,怪物每回合附加角色攻击的" + + Math.floor( + 100 * (enemy.counterAttack || core.values.counterAttack || 0) + ) + + "%作为伤害,无视角色防御" + ); + }, + "#ffaa44", + ], + [ + 9, + "净化", + function (enemy) { + return ( + "战斗前,怪物附加角色护盾的" + + (enemy.purify || core.values.purify) + + "倍作为伤害" + ); + }, + "#80eed6", + ], + [10, "模仿", "怪物的攻防和角色攻防相等", "#b0c0dd"], + [ + 11, + "吸血", + function (enemy) { + return ( + "战斗前,怪物首先吸取角色的" + + Math.floor(100 * enemy.vampire || 0) + + "%生命(约" + + Math.floor((enemy.vampire || 0) * core.getStatus("hp")) + + "点)作为伤害" + + (enemy.add ? ",并把伤害数值加到自身生命上" : "") + ); + }, + "#dd4448", + ], + [ + 12, + "中毒", + "战斗后,角色陷入中毒状态,每一步损失生命" + + core.values.poisonDamage + + "点", + "#99ee88", + ], + [ + 13, + "衰弱", + "战斗后,角色陷入衰弱状态,攻防暂时下降" + + (core.values.weakValue >= 1 ? + core.values.weakValue + "点" : + parseInt(core.values.weakValue * 100) + "%"), + "#f0bbcc", + ], + [ + 14, + "诅咒", + "战斗后,角色陷入诅咒状态,战斗无法获得金币和经验", + "#bbeef0", + ], + [ + 15, + "领域", + function (enemy) { + return ( + "经过怪物周围" + + (enemy.zoneSquare ? "九宫格" : "十字") + + "范围内" + + (enemy.range || 1) + + "格时自动减生命" + + (enemy.zone || 0) + + "点" + ); + }, + "#c677dd", + ], + [16, "夹击", "经过两只相同的怪物中间,角色生命值变成一半", "#bb99ee"], + [ + 17, + "仇恨", + "战斗前,怪物附加之前积累的仇恨值作为伤害;战斗后,释放一半的仇恨值。(每杀死一个怪物获得" + + (core.values.hatred || 0) + + "点仇恨值)", + "#b0b666", + ], + [ + 18, + "阻击", + function (enemy) { + return ( + "经过怪物周围" + + (enemy.zoneSquare ? "九宫格" : "十字") + + "时自动减生命" + + (enemy.repulse || 0) + + "点,同时怪物后退一格" + ); + }, + "#8888e6", + ], + [19, "自爆", "战斗后角色的生命值变成1", "#ff6666"], + [20, "无敌", "角色无法打败怪物,除非拥有十字架", "#aaaaaa"], + [ + 21, + "退化", + function (enemy) { + return ( + "战斗后角色永久下降" + + (enemy.atkValue || 0) + + "点攻击和" + + (enemy.defValue || 0) + + "点防御" + ); + }, + ], + [ + 22, + "固伤", + function (enemy) { + return ( + "战斗前,怪物对角色造成" + + (enemy.damage || 0) + + "点固定伤害,未开启负伤时无视角色护盾。" + ); + }, + "#ff9977", + ], + [23, "重生", "怪物被击败后,角色转换楼层则怪物将再次出现", "#a0e0ff"], + [ + 24, + "激光", + function (enemy) { + return "经过怪物同行或同列时自动减生命" + (enemy.laser || 0) + "点"; + }, + "#dda0dd", + ], + [ + 25, + "光环", + function (enemy) { + return ( + (enemy.range != null ? + (enemy.haloSquare ? "该怪物九宫格" : "该怪物十字") + + enemy.haloRange + + "格范围内" : + "同楼层所有") + + "怪物生命提升" + + (enemy.hpBuff || 0) + + "%,攻击提升" + + (enemy.atkBuff || 0) + + "%,防御提升" + + (enemy.defBuff || 0) + + "%," + + (enemy.haloAdd ? "可叠加" : "不可叠加") + ); + }, + "#e6e099", + 1, + ], + [ + 26, + "支援", + "当周围一圈的怪物受到攻击时将上前支援,并组成小队战斗。", + "#77c0b6", + 1, + ], + [ + 27, + "捕捉", + function (enemy) { + return ( + "当走到怪物周围" + + (enemy.zoneSquare ? "九宫格" : "十字") + + "时会强制进行战斗。" + ); + }, + "#c0ddbb", + ], + ]; +}, "getEnemyInfo": function (enemy, hero, x, y, floorId) { // 获得某个怪物变化后的数据;该函数将被伤害计算和怪物手册使用 // 例如:坚固、模仿、仿攻等等 @@ -756,19 +765,20 @@ var functions_d6ad677b_427a_4623_b50f_a445a3b0ef8a = hero_def = core.getRealStatusOrDefault(hero, "def"), hero_mdef = core.getRealStatusOrDefault(hero, "mdef"), hero_speed = core.getRealStatusOrDefault(hero, "speed"); - + var mon_id = core.getEnemyValue(enemy, "id", x, y, floorId), + mon_name = core.getEnemyValue(enemy, "name", x, y, floorId); var mon_hp = core.getEnemyValue(enemy, "hp", x, y, floorId), mon_atk = core.getEnemyValue(enemy, "atk", x, y, floorId), mon_def = core.getEnemyValue(enemy, "def", x, y, floorId), - mon_mdef = core.getEnemyValue(enemy, "mdef", x, y, floorId), - mon_speed = core.getEnemyValue(enemy, "speed", x, y, floorId), + mon_mdef = core.getEnemyValue(enemy, "mdef", x, y, floorId) || 0, + mon_spell = core.getEnemyValue(enemy, "spell", x, y, floorId) || 0, + mon_speed = core.getEnemyValue(enemy, "speed", x, y, floorId) || 1, mon_special = core.getEnemyValue(enemy, "special", x, y, floorId); var mon_money = core.getEnemyValue(enemy, "money", x, y, floorId), mon_exp = core.getEnemyValue(enemy, "exp", x, y, floorId), mon_point = core.getEnemyValue(enemy, "point", x, y, floorId); var mon_barrier = 0, - mon_absorb_damage = 0, - mon_magic = core.getEnemyValue(enemy, "magic", x, y, floorId); + mon_absorb_damage = 0; // 模仿 if (core.hasSpecial(mon_special, 10)) { mon_atk = hero_atk; @@ -780,7 +790,6 @@ var functions_d6ad677b_427a_4623_b50f_a445a3b0ef8a = } var guards = []; - // 光环和支援检查 if (!core.status.checkBlock) core.status.checkBlock = {}; @@ -876,10 +885,13 @@ var functions_d6ad677b_427a_4623_b50f_a445a3b0ef8a = // 也可以按需增加各种自定义内容 return { + id: mon_id, + name: mon_name, hp: Math.floor(mon_hp), atk: Math.floor(mon_atk), def: Math.floor(mon_def), mdef: Math.floor(mon_mdef), + spell: Math.floor(mon_spell), speed: Math.floor(mon_speed), barrier: Math.floor(mon_barrier), absorb: Math.floor(mon_absorb_damage), @@ -887,7 +899,6 @@ var functions_d6ad677b_427a_4623_b50f_a445a3b0ef8a = exp: Math.floor(mon_exp), point: Math.floor(mon_point), special: mon_special, - magic: mon_magic, guards: guards, // 返回支援情况 }; }, @@ -907,12 +918,24 @@ var functions_d6ad677b_427a_4623_b50f_a445a3b0ef8a = hero_def = core.getRealStatusOrDefault(hero, "def"), hero_matk = core.getRealStatusOrDefault(hero, "matk"), hero_mdef = core.getRealStatusOrDefault(hero, "mdef"), + hero_mhp = core.getRealStatusOrDefault(hero, "mhp"), hero_speed = core.getRealStatusOrDefault(hero, "speed"), hero_spell = core.getRealStatusOrDefault(hero, "spell"), origin_hero_hp = core.getStatusOrDefault(hero, "hp"), origin_hero_atk = core.getStatusOrDefault(hero, "atk"), origin_hero_def = core.getStatusOrDefault(hero, "def"); + //编辑器特判 + if (main.mode == "editor") { + hero_hp = hero?.hp ?? core.status.hero.hp, + hero_atk = hero?.atk ?? core.status.hero.atk, + hero_def = hero?.def ?? core.status.hero.def, + hero_matk = hero?.matk ?? core.status.hero.matk, + hero_mdef = hero?.mdef ?? core.status.hero.mdef, + hero_mhp = hero?.mhp ?? core.status.hero.mhp, + hero_speed = hero?.speed ?? core.status.hero.speed, + hero_spell = hero?.spell ?? core.status.hero.spell; + } // 怪物的各项数据 // 对坚固模仿等处理扔到了脚本编辑-getEnemyInfo之中 var enemyInfo = core.enemys.getEnemyInfo(enemy, hero, x, y, floorId); @@ -920,11 +943,13 @@ var functions_d6ad677b_427a_4623_b50f_a445a3b0ef8a = mon_atk = enemyInfo.atk, mon_def = enemyInfo.def, mon_mdef = enemyInfo.mdef, + mon_spell = enemyInfo.spell, mon_speed = enemyInfo.speed, mon_special = enemyInfo.special, mon_absorb_damage = enemyInfo.absorb, mon_barrier = enemyInfo.barrier; - + const { lcm, gcd } = core.plugin.utils + const equip0 = core.getEquip(0) //---第一部分:静态属性修正--- //此处写入静态影响勇士属性的勇士或怪物技能(静态影响怪物属性的技能于getEnemyInfo中写入) // 技能的处理 @@ -932,11 +957,21 @@ var functions_d6ad677b_427a_4623_b50f_a445a3b0ef8a = // 开启了技能1:二倍斩 hero_atk *= 2; // 计算时攻击力翻倍 } + + // 破甲 + if (core.hasSpecial(mon_special, 7)) + hero_def -= Math.floor( + (enemy.breakArmor || core.values.breakArmor) * hero_def + ); + //勇士属性取整 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)); + hero_spell = Math.max(0, Math.floor(hero_spell)); + hero_matk = Math.min(100, Math.max(0, Math.floor(hero_matk))); + hero_mdef = Math.min(100, Math.max(0, Math.floor(hero_mdef))); + hero_mhp = Math.min(100, Math.max(0, Math.floor(hero_mhp))); // 如果是无敌属性,且勇士未持有十字架 if (core.hasSpecial(mon_special, 20) && !core.hasItem("cross")) @@ -963,166 +998,319 @@ var functions_d6ad677b_427a_4623_b50f_a445a3b0ef8a = } //——第二部分:变量定义和初始赋值—— - // 每回合怪物对勇士造成的战斗伤害 - 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), + + hero_per_mdamage = Math.floor((hero_spell * hero_matk / 100) * (100 - mon_mdef) / 100); let damage = 0, hero_turn = 0, mon_turn = 0; + let equipInfo = [] //回合生效的装备列表 + + for (let i = 0; i < 5; i++) { + const a = core.plugin.equip[core.getEquip(i)] + if (a) equipInfo.push(a) + } + + //处理回合条长度 + let oneTurn = [hero_speed, mon_speed]; + if (equipInfo.length > 0) { + for (let i = 0; i < equipInfo.length; i++) { + equipInfo[i].now = 0; + equipInfo[i].isAttack = false; + oneTurn.push(equipInfo[i].speed); + } + } + //需要变更 + + const onegcd = gcd(...oneTurn) //最大公约数 + oneTurn = lcm(...oneTurn) //单次回合长度 + //在这里处理equip的初始位置now + equipInfo.forEach(v => { + switch (v.id) { + case "sword1": + default: + v.now = 0 + break + } + v.onAttack = false + if (v.now === oneTurn) v.onAttack = true //增加正在攻击的标志 + }) + const heroinfo = { hp: hero_hp, atk: hero_atk, def: hero_def, mdef: (!hero?.mdef || hero?.mdef === 100) ? hero_mdef : hero.mdef, spell: hero_spell, mhp: Math.floor(hero_spell * hero_mhp / 100), matk: Math.floor(hero_spell * hero_matk / 100), speed: hero_speed, now: 0, isAttack: false } //勇士属性 + const enemyinfo = { hp: mon_hp, atk: mon_atk, def: mon_def, mdef: mon_mdef, spell: mon_spell, speed: mon_speed, special: mon_special, now: 0, onAttack: false, isAttack: false } //怪物属性 + //先攻,先攻为怪物和勇士勇士行动前怪物出第一刀 + if (core.hasSpecial(mon_special, 1)) { + enemyinfo.now = oneTurn + enemyinfo.onAttack = true + } + const start = [core.clone(heroinfo), core.clone(enemyinfo), core.clone(equipInfo), oneTurn] //记录开始战斗时的属性并转发 //---第三部分:递归开始--- - let length = hero_speed * mon_speed; - let heroDiffPerTurn = [], - enemyDiffPerTurn = []; - - 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; + const heroDiffList = [], + enemyDiffList = [], + heroanimateList = [], + enemyanimateList = []; + let beforehp = enemyinfo.hp + while ( + enemyinfo.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) - ) { - //怪物攻击的回合 - //这里计算怪物攻击时发生的各种变化 + let onattack = false + const hero_diff = {}, + enemy_diff = {}, + hero_animate = [], + enemy_animate = []; + if (enemyinfo.onAttack) { //怪物先攻的场合 + //这里计算怪物攻击时发生的各种变化,同时计入enemy_diff + let mon_damage = 0 + let hero_damage = 0 + //伤害计算 + let per_damage = Math.max(enemyinfo.atk - heroinfo.def, 0), + per_mdamage = Math.floor(enemyinfo.spell * (100 - heroinfo.mdef) / 100); - //伤害与回合增加 - damage += per_damage; + //这里记录伤害触发后的属性变化和动画,同时计入diff、damage(不要在此直接修改heroinfo和enemyinfo) if (core.hasSpecial(mon_special, 6)) { - mon_turn += enemy.n; + hero_damage += per_damage * enemy.n + per_mdamage * enemy.n } else { - mon_turn += 1; + hero_damage += per_damage + per_mdamage } - //重新为长度赋值 - mon_length = length; - hero_length = hero_length - mon_time * hero_speed; - } else { + let animate = core.plugin.enemyanimate[enemy.id] ?? "sword" + //这里可通过if更改默认的怪物攻击特效 + hero_animate.push(animate) //勇士身上绘制sword动画 + if (heroinfo.mhp + (hero_diff.mhp ?? 0) - hero_damage >= 0) { + hero_diff.mhp = (hero_diff.mhp ?? 0) - hero_damage + hero_damage = 0 + hero_diff.hp = (hero_diff.hp ?? 0) - hero_damage + } else { + hero_damage -= heroinfo.mhp + (hero_diff.mhp ?? 0) + hero_diff.mhp = (hero_diff.mhp ?? 0) - heroinfo.mhp - (hero_diff.mhp ?? 0) + + hero_diff.hp = (hero_diff.hp ?? 0) - hero_damage + } + + damage += hero_damage + enemyinfo.onAttack = false + enemyinfo.now = 0 + onattack = true + + } + equipInfo.forEach(v => { + if (v.onAttack) { + let mon_damage = 0 + let hero_damage = 0 + //这里写生效装备的技能效果,同时对双方属性的修改计入diff(不要在此直接修改heroinfo和enemyinfo) + let animate = core.plugin.equipanimate[v.id] ?? "sword" + //这里可通过if更改默认的道具特效 + enemy_animate.push(animate) //勇士身上绘制动画 + + v.now = 0 + v.onAttack = false + onattack = true + } + }) + if (onattack) { //先手处理完毕后的数据处理 + heroDiffList.push(hero_diff) + enemyDiffList.push(enemy_diff) + heroanimateList.push(hero_animate) + enemyanimateList.push(enemy_animate) + //处理属性变化 + for (let v in hero_diff) { + heroinfo[v] += hero_diff[v] + } + for (let v in enemy_diff) { + enemyinfo[v] += enemy_diff[v] + } + continue //进入下一循环 + } + heroinfo.now += heroinfo.speed + enemyinfo.now += enemyinfo.speed + equipInfo.forEach(v => { + v.now += v.speed + }) + + if ( + heroinfo.now >= oneTurn + ) { //勇士攻击的回合 - // 这里计算勇士攻击时发生的各种变化 + let mon_damage = 0 + let hero_damage = 0 + //这里计算勇士攻击时发生的各种变化 - // 伤害与回合数增加 - 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; + //伤害计算 + let per_damage = Math.max(heroinfo.atk - enemyinfo.def, 0) + let per_mdamage = Math.max(Math.floor(heroinfo.matk * (100 - enemyinfo.mdef) / 100), 0) + mon_damage = per_damage + per_mdamage + //这里记录伤害触发后的属性变化和动画,同时计入diff(不要在此直接修改heroinfo和enemyinfo) + let animate = core.plugin.heroanimate[equip0] ?? "sword" + //这里可通过if更改默认的武器攻击特效 + enemy_animate.push(animate) + + + enemy_diff.hp = (enemy_diff.hp ?? 0) - mon_damage + heroinfo.now -= oneTurn + hero_turn++ + onattack = true } - let hero_diff = {}, - mon_diff = {}; - //这里插入汇总勇士和怪物在此回合结束时的情况数值,用以跑条动画读取 - heroDiffPerTurn.push(hero_diff); - enemyDiffPerTurn.push(mon_diff); //将勇士和怪物此回合结束时的属性变动保存到heroPerInfo和enemyPerInfo中,用以跑条动画读取 + + + if (enemyinfo.now >= oneTurn) { + //怪物攻击的回合 + let mon_damage = 0 + let hero_damage = 0 + //伤害计算 + let per_damage = Math.max(enemyinfo.atk - heroinfo.def, 0), + per_mdamage = Math.floor(enemyinfo.spell * (100 - heroinfo.mdef) / 100); + + //这里记录伤害触发后的属性变化和动画,同时计入diff、damage(不要在此直接修改heroinfo和enemyinfo) + if (core.hasSpecial(mon_special, 6)) { + hero_damage += per_damage * enemy.n + per_mdamage * enemy.n + } else { + hero_damage += per_damage + per_mdamage + } + let animate = core.plugin.enemyanimate[enemy.id] ?? "sword" + //这里可通过if更改默认的怪物攻击特效 + hero_animate.push(animate) //勇士身上绘制sword动画 + if (heroinfo.mhp + (hero_diff.mhp ?? 0) - hero_damage >= 0) { + hero_diff.mhp = (hero_diff.mhp ?? 0) - hero_damage + hero_damage = 0 + hero_diff.hp = (hero_diff.hp ?? 0) - hero_damage + } else { + hero_damage -= heroinfo.mhp + (hero_diff.mhp ?? 0) + hero_diff.mhp = (hero_diff.mhp ?? 0) - heroinfo.mhp - (hero_diff.mhp ?? 0) + + hero_diff.hp = (hero_diff.hp ?? 0) - hero_damage + } + + damage += hero_damage + enemyinfo.now -= oneTurn + mon_turn++ + onattack = true + } + equipInfo.forEach(v => { + if (v.now >= oneTurn) { + let mon_damage = 0 + let hero_damage = 0 + //这里写生效装备的技能效果,同时对双方属性的修改计入diff(不要在此直接修改heroinfo和enemyinfo) + let animate = core.plugin.equipanimate[v.id] ?? "sword" + //这里可通过if更改默认的道具特效 + enemy_animate.push(animate) //怪物身上绘制动画 + + v.now -= oneTurn + onattack = true + } + + }) + if (onattack) { + //处理完毕后的数据处理 + heroDiffList.push(hero_diff) + enemyDiffList.push(enemy_diff) + heroanimateList.push(hero_animate) + enemyanimateList.push(enemy_animate) + //处理属性变化 + for (let v in hero_diff) { + heroinfo[v] += hero_diff[v] + } + for (let v in enemy_diff) { + enemyinfo[v] += enemy_diff[v] + } + + //出手50回合怪物生命未降低直接判负,避免死循环 + if (hero_turn === 50) { + + if (enemyinfo.hp >= beforehp) { + return null + } + } + } + } - //下面这些还没修改 - // 连击 - 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 - ); - - // 先攻 - 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, 9)) - init_damage += Math.floor( - (enemy.purify || core.values.purify) * hero_mdef - ); - //上面这些还没修改 - //勇士护盾计算 - let barrier = hero_mdef; + //下面这些还没修改,原有技能除先攻、连击外暂时全部移除,所有技能需要在上方的模拟循环中做修正 + /* + // 每回合的反击伤害;反击是按照勇士的攻击次数来计算回合 + let counterDamage = 0; + if (core.hasSpecial(mon_special, 8)) + counterDamage += Math.floor( + (enemy.counterAttack || core.values.counterAttack) * hero_atk + ); - // ------ 支援 ----- // - // 这个递归最好想明白为什么,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) { - if (!guard_before_current_enemy) { // --- 先打当前怪物,记录当前回合数 - core.setFlag("__extraTurn__", turn); - } - // 获得那些怪物组成小队战斗 - for (var i = 0; i < guards.length; i++) { - var gx = guards[i][0], - gy = guards[i][1], - gid = guards[i][2]; - // 递归计算支援怪伤害信息,这里不传x,y保证不会重复调用 - // 这里的mdef传0,因为护盾应该只会被计算一次 - var info = core.enemys.getDamageInfo(core.material.enemys[gid], { hp: origin_hero_hp, atk: origin_hero_atk, def: origin_hero_def, mdef: 0 }); - if (info == null) { // 小队中任何一个怪物不可战斗,直接返回null - core.removeFlag("__extraTurn__"); - return null; + + // 净化 + if (core.hasSpecial(mon_special, 9)) + init_damage += Math.floor( + (enemy.purify || core.values.purify) * hero_mdef + ); + //上面这些还没修改 + //勇士护盾计算 + let barrier = Math.floor(hero_spell * hero_mhp / 100); + + + // ------ 支援 ----- // + // 这个递归最好想明白为什么,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) { + if (!guard_before_current_enemy) { // --- 先打当前怪物,记录当前回合数 + core.setFlag("__extraTurn__", turn); + } + // 获得那些怪物组成小队战斗 + for (var i = 0; i < guards.length; i++) { + var gx = guards[i][0], + gy = guards[i][1], + gid = guards[i][2]; + // 递归计算支援怪伤害信息,这里不传x,y保证不会重复调用 + // 这里的mdef传0,因为护盾应该只会被计算一次 + var info = core.enemys.getDamageInfo(core.material.enemys[gid], { hp: origin_hero_hp, atk: origin_hero_atk, def: origin_hero_def, mdef: 0 }); + if (info == null) { // 小队中任何一个怪物不可战斗,直接返回null + core.removeFlag("__extraTurn__"); + return null; + } + // 已经进行的回合数 + core.setFlag("__extraTurn__", info.turn); + init_damage += info.damage; + } + if (guard_before_current_enemy) { // --- 先打支援怪物,增加当前回合数 + turn += core.getFlag("__extraTurn__", 0); } - // 已经进行的回合数 - core.setFlag("__extraTurn__", info.turn); - init_damage += info.damage; } - if (guard_before_current_enemy) { // --- 先打支援怪物,增加当前回合数 - turn += core.getFlag("__extraTurn__", 0); - } - } - core.removeFlag("__extraTurn__");*/ + core.removeFlag("__extraTurn__");*/ // ------ 支援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.hasSpecial(mon_special, 17)) { - // 仇恨 - damage += core.getFlag("hatred", 0); - } - if (core.hasSpecial(mon_special, 22)) { - // 固伤 - damage += enemy.damage || 0; - } + // 检查是否允许负伤 + 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.damage2 || 0; + } + */ return { + start: start, 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_speed: Math.floor(mon_speed), + heroDiffList: heroDiffList, + enemyDiffList: enemyDiffList, + heroanimateList: heroanimateList, + enemyanimateList: enemyanimateList, + hero_turn: Math.floor(hero_turn), mon_turn: Math.floor(mon_turn), - damage: Math.floor(damage), + damage: Math.floor(damage) }; /*TODO:怪物手册的修改(需要修改这里return的内容以及一些战后判断) 1. 显示怪物是魔攻还是物攻(在怪物名字上做颜色变化,物攻是黄色,魔攻是蓝色) @@ -1388,6 +1576,7 @@ var functions_d6ad677b_427a_4623_b50f_a445a3b0ef8a = version: core.firstData.version, guid: core.getGuid(), time: new Date().getTime(), + 'material': core.clone(core.material.enemys) }; return data; }, @@ -1402,6 +1591,8 @@ var functions_d6ad677b_427a_4623_b50f_a445a3b0ef8a = core.maps.loadMap(data.maps, null, data.hero.flags), data.values ); + //如果作者造塔想随时修改怪物属性平衡数值,请注释下面这行。该行作用为保存怪物当前属性,用以储存临时修改的怪物属性。 + core.material.enemys = data.material ?? core.material.enemys; core.status.route = core.decodeRoute(data.route); core.control._bindRoutePush(); // 文字属性,全局属性 @@ -1450,31 +1641,30 @@ var functions_d6ad677b_427a_4623_b50f_a445a3b0ef8a = if (play) core.doAction(); }, "getStatusLabel": function (name) { - // 返回某个状态英文名的对应中文标签,如atk -> 攻击,def -> 防御等。 - // 请注意此项仅影响 libs/ 下的内容(如绘制怪物手册、数据统计等) - // 自行定义的(比如获得道具效果)中用到的“攻击+3”等需要自己去对应地方修改 + // 返回某个状态英文名的对应中文标签,如atk -> 攻击,def -> 防御等。 + // 请注意此项仅影响 libs/ 下的内容(如绘制怪物手册、数据统计等) + // 自行定义的(比如获得道具效果)中用到的“攻击+3”等需要自己去对应地方修改 - return ( - { - name: "名称", - lv: "等级", - hpmax: "生命上限", - hp: "生命", - manamax: "魔力上限", - mana: "魔力", - atk: "攻击", - def: "防御", - spell: "法强", - matk: "魔攻比例", - mdef: "护盾比例", - speed: "速度", - money: "金币", - exp: "经验", - point: "加点", - steps: "步数", - }[name] || name - ); - }, + return ({ + name: "名称", + lv: "等级", + hpmax: "生命上限", + hp: "生命", + manamax: "魔力上限", + mana: "魔力", + atk: "攻击", + def: "防御", + spell: "法强", + matk: "魔攻比例", + mhp: "护盾比例", + mdef: "法抗", + speed: "速度", + money: "金币", + exp: "经验", + point: "加点", + steps: "步数", + } [name] || name); +}, "triggerDebuff": function (action, type) { // 毒衰咒效果的获得与解除 // action:获得还是解除;'get'表示获得,'remove'表示解除 @@ -1533,13 +1723,13 @@ var functions_d6ad677b_427a_4623_b50f_a445a3b0ef8a = } }, "updateStatusBar": function () { - // 更新状态栏 - core.ui.statusBar.update(); - // 更新阻激夹域的伤害值 - core.updateCheckBlock(); - // 更新全地图显伤 - core.updateDamage(); - }, + // 更新状态栏 + core.ui.statusBar.update(); + // 更新阻激夹域的伤害值 + core.updateCheckBlock(); + // 更新全地图显伤 + core.updateDamage(); +}, "updateCheckBlock": function (floorId) { // 领域、夹击、阻击等的伤害值计算 floorId = floorId || core.status.floorId; @@ -1793,119 +1983,114 @@ var functions_d6ad677b_427a_4623_b50f_a445a3b0ef8a = }; }, "moveOneStep": function (callback) { - // 勇士每走一步后执行的操作。callback为行走完毕后的回调 - // 这个函数执行在“刚走完”的时候,即还没有检查该点的事件和领域伤害等。 - // 请注意:瞬间移动不会执行该函数。如果要控制能否瞬间移动有三种方法: - // 1. 将全塔属性中的cannotMoveDirectly这个开关勾上,即可在全塔中全程禁止使用瞬移。 - // 2, 将楼层属性中的cannotMoveDirectly这个开关勾上,即禁止在该层楼使用瞬移。 - // 3. 将flag:cannotMoveDirectly置为true,即可使用flag控制在某段剧情范围内禁止瞬移。 + // 勇士每走一步后执行的操作。callback为行走完毕后的回调 + // 这个函数执行在“刚走完”的时候,即还没有检查该点的事件和领域伤害等。 + // 请注意:瞬间移动不会执行该函数。如果要控制能否瞬间移动有三种方法: + // 1. 将全塔属性中的cannotMoveDirectly这个开关勾上,即可在全塔中全程禁止使用瞬移。 + // 2, 将楼层属性中的cannotMoveDirectly这个开关勾上,即禁止在该层楼使用瞬移。 + // 3. 将flag:cannotMoveDirectly置为true,即可使用flag控制在某段剧情范围内禁止瞬移。 - // 增加步数 - core.status.hero.steps++; - // 更新跟随者状态,并绘制 - core.updateFollowers(); - core.drawHero(); - // 检查中毒状态的扣血和死亡 - if (core.hasFlag("poison")) { - core.status.hero.statistics.poisonDamage += core.values.poisonDamage; - core.status.hero.hp -= core.values.poisonDamage; - if (core.status.hero.hp <= 0) { - core.status.hero.hp = 0; - core.updateStatusBar(false, true); - core.events.lose(); - return; - } else { - core.updateStatusBar(false, true); - } - } + // 增加步数 + core.status.hero.steps++; + // 更新跟随者状态,并绘制 + core.updateFollowers(); + core.drawHero(); + // 检查中毒状态的扣血和死亡 + if (core.hasFlag("poison")) { + core.status.hero.statistics.poisonDamage += core.values.poisonDamage; + core.status.hero.hp -= core.values.poisonDamage; + if (core.status.hero.hp <= 0) { + core.status.hero.hp = 0; + core.updateStatusBar(false, true); + core.events.lose(); + return; + } else { + core.updateStatusBar(false, true); + } + } - // 从v2.7开始,每一步行走不会再刷新状态栏。 - // 如果有特殊要求(如每走一步都加buff之类),可手动取消注释下面这一句: - // core.updateStatusBar(true, true); + // 从v2.7开始,每一步行走不会再刷新状态栏。 + // 如果有特殊要求(如每走一步都加buff之类),可手动取消注释下面这一句: + // core.updateStatusBar(true, true); - // 检查自动事件 - core.checkAutoEvents(); + // 检查自动事件 + core.checkAutoEvents(); - // ------ 检查目标点事件 ------ // - // 无事件的道具(如血瓶)需要优先于阻激夹域判定 - var nowx = core.getHeroLoc("x"), - nowy = core.getHeroLoc("y"); - var block = core.getBlock(nowx, nowy); - var hasTrigger = false; - if ( - block != null && - block.event.trigger == "getItem" && - !core.floors[core.status.floorId].afterGetItem[nowx + "," + nowy] - ) { - hasTrigger = true; - core.trigger(nowx, nowy, callback); - } - // 执行目标点的阻激夹域事件 - core.checkBlock(); + // ------ 检查目标点事件 ------ // + // 无事件的道具(如血瓶)需要优先于阻激夹域判定 + var nowx = core.getHeroLoc("x"), + nowy = core.getHeroLoc("y"); + var block = core.getBlock(nowx, nowy); + var hasTrigger = false; + if ( + block != null && + block.event.trigger == "getItem" && + !core.floors[core.status.floorId].afterGetItem[nowx + "," + nowy] + ) { + hasTrigger = true; + core.trigger(nowx, nowy, callback); + } + // 执行目标点的阻激夹域事件 + core.checkBlock(); - // 执行目标点的script和事件 - if (!hasTrigger) core.trigger(nowx, nowy, callback); + // 执行目标点的script和事件 + if (!hasTrigger) core.trigger(nowx, nowy, callback); - // 检查该点是否是滑冰 - if (core.onSki()) { - // 延迟到事件最后执行,因为这之前可能有阻激夹域动画 - core.insertAction({ type: "moveAction" }, null, null, null, true); - } + // 检查该点是否是滑冰 + if (core.onSki()) { + // 延迟到事件最后执行,因为这之前可能有阻激夹域动画 + core.insertAction({ type: "moveAction" }, null, null, null, true); + } - // ------ 检查目标点事件 END ------ // + // ------ 检查目标点事件 END ------ // - // 如需强行终止行走可以在这里条件判定: - // core.stopAutomaticRoute(); - }, + // 如需强行终止行走可以在这里条件判定: + // core.stopAutomaticRoute(); +}, "moveDirectly": function (x, y, ignoreSteps) { - // 瞬间移动;x,y为要瞬间移动的点;ignoreSteps为减少的步数,可能之前已经被计算过 - // 返回true代表成功瞬移,false代表没有成功瞬移 + // 瞬间移动;x,y为要瞬间移动的点;ignoreSteps为减少的步数,可能之前已经被计算过 + // 返回true代表成功瞬移,false代表没有成功瞬移 - // 判定能否瞬移到该点 - if (ignoreSteps == null) ignoreSteps = core.canMoveDirectly(x, y); - if (ignoreSteps >= 0) { - // 中毒也允许瞬移 - if (core.hasFlag("poison")) { - var damage = ignoreSteps * core.values.poisonDamage; - if (damage >= core.status.hero.hp) return false; - core.status.hero.statistics.poisonDamage += damage; - core.status.hero.hp -= damage; - } + // 判定能否瞬移到该点 + if (ignoreSteps == null) ignoreSteps = core.canMoveDirectly(x, y); + if (ignoreSteps >= 0) { + // 中毒也允许瞬移 + if (core.hasFlag("poison")) { + var damage = ignoreSteps * core.values.poisonDamage; + if (damage >= core.status.hero.hp) return false; + core.status.hero.statistics.poisonDamage += damage; + core.status.hero.hp -= damage; + } - core.clearMap("hero"); - if ( - core.bigmap.width * 32 === core.bigmap.height * 32 && - core.bigmap.width * 32 === core.__PIXELS__ - ) - core.addPopMove( - 32 * core.status.hero.loc.x + 16, - 32 * core.status.hero.loc.y + 16, - 32 * x + 16, - 32 * y + 16 - ); - // 获得勇士最后的朝向 - var lastDirection = core.status.route[core.status.route.length - 1]; - if (["left", "right", "up", "down"].indexOf(lastDirection) >= 0) - core.setHeroLoc("direction", lastDirection); - // 设置坐标,并绘制 - core.control._moveDirectyFollowers(x, y); - core.status.hero.loc.x = x; - core.status.hero.loc.y = y; - core.drawHero(); - // 记录录像 - core.status.route.push("move:" + x + ":" + y); - // 统计信息 - core.status.hero.statistics.moveDirectly++; - core.status.hero.statistics.ignoreSteps += ignoreSteps; - if (core.hasFlag("poison")) { - core.updateStatusBar(false, true); - } + core.clearMap("hero"); + if ( + core.bigmap.width * 32 === core.bigmap.height * 32 && + core.bigmap.width * 32 === core.__PIXELS__ + ) + if (core.getFlag('popmove')) core.addPopMove(32 * core.status.hero.loc.x + 16, 32 * core.status.hero.loc.y + 16, 32 * x + 16, 32 * y + 16); + // 获得勇士最后的朝向 + var lastDirection = core.status.route[core.status.route.length - 1]; + if (["left", "right", "up", "down"].indexOf(lastDirection) >= 0) + core.setHeroLoc("direction", lastDirection); + // 设置坐标,并绘制 + core.control._moveDirectyFollowers(x, y); + core.status.hero.loc.x = x; + core.status.hero.loc.y = y; + core.drawHero(); + // 记录录像 + core.status.route.push("move:" + x + ":" + y); + // 统计信息 + core.status.hero.statistics.moveDirectly++; + core.status.hero.statistics.ignoreSteps += ignoreSteps; + if (core.hasFlag("poison")) { + core.updateStatusBar(false, true); + } - core.checkRouteFolding(); - return true; - } - return false; - }, + core.checkRouteFolding(); + return true; + } + return false; +}, "parallelDo": function (timestamp) { // 并行事件处理,可以在这里写任何需要并行处理的脚本或事件 // 该函数将被系统反复执行,每次执行间隔视浏览器或设备性能而定,一般约为16.6ms一次 diff --git a/project/images/005-Attack03.webp b/project/images/005-Attack03.webp new file mode 100644 index 0000000..09df0ff Binary files /dev/null and b/project/images/005-Attack03.webp differ diff --git a/project/images/012-Heal01.webp b/project/images/012-Heal01.webp new file mode 100644 index 0000000..23c2c6d Binary files /dev/null and b/project/images/012-Heal01.webp differ diff --git a/project/images/015-Fire01.webp b/project/images/015-Fire01.webp new file mode 100644 index 0000000..acd799f Binary files /dev/null and b/project/images/015-Fire01.webp differ diff --git a/project/images/statusBackground.webp b/project/images/statusBackground.webp new file mode 100644 index 0000000..498f5d8 Binary files /dev/null and b/project/images/statusBackground.webp differ diff --git a/project/images/tati_310101.webp b/project/images/tati_310101.webp new file mode 100644 index 0000000..e5a5dce Binary files /dev/null and b/project/images/tati_310101.webp differ diff --git a/project/items.js b/project/items.js index 95ed773..aa455cd 100644 --- a/project/items.js +++ b/project/items.js @@ -37,61 +37,23 @@ var items_296f5d02_12fd_4166_a7c1_b5e830c9ee3a = "canUseItemEffect": "true" }, "greenGem": { - "cls": "tools", + "cls": "items", "name": "绿宝石", - "text": ",护盾+${core.values.greenGem}", - "itemEffect": "core.status.hero.mdef += core.values.greenGem * core.status.thisMap.ratio", - "itemEffectTip": ",护盾+${core.values.greenGem * core.status.thisMap.ratio}", - "useItemEffect": "core.status.hero.mdef += core.values.greenGem", + "text": ",法强+${core.values.greenGem}", + "itemEffect": "core.status.hero.spell += core.values.greenGem * core.status.thisMap.ratio", + "itemEffectTip": ",法强+${core.values.greenGem * core.status.thisMap.ratio}", + "useItemEffect": "core.status.hero.spell += core.values.greenGem", "canUseItemEffect": "true" }, "yellowGem": { "cls": "items", "name": "黄宝石", - "text": "可以进行加点", - "itemEffect": "core.status.hero.hp+=1000;core.status.hero.atk+=6;core.status.hero.def+=6;core.status.hero.mdef+=10;", - "itemEffectTip": ",全属性提升", - "useItemEvent": [ - { - "type": "choices", - "choices": [ - { - "text": "攻击+1", - "action": [ - { - "type": "setValue", - "name": "status:atk", - "operator": "+=", - "value": "1" - } - ] - }, - { - "text": "防御+2", - "action": [ - { - "type": "setValue", - "name": "status:def", - "operator": "+=", - "value": "2" - } - ] - }, - { - "text": "生命+200", - "action": [ - { - "type": "setValue", - "name": "status:hp", - "operator": "+=", - "value": "200" - } - ] - } - ] - } - ], - "canUseItemEffect": "true" + "text": ",速度+${core.values.yellowGem}", + "itemEffect": "core.status.hero.speed += core.values.yellowGem * core.status.thisMap.ratio", + "itemEffectTip": ",速度+${core.values.yellowGem * core.status.thisMap.ratio}", + "useItemEvent": null, + "canUseItemEffect": "true", + "useItemEffect": "core.status.hero.spell += core.values.yellowGem" }, "redPotion": { "cls": "items", @@ -130,18 +92,20 @@ var items_296f5d02_12fd_4166_a7c1_b5e830c9ee3a = "canUseItemEffect": "true" }, "sword0": { - "cls": "items", - "name": "破旧的剑", + "cls": "equips", + "name": "基础匕首", "text": "一把已经生锈的剑", "equip": { "type": 0, "animate": "sword", "value": { - "atk": 0 - } + "speed": 20 + }, + "percentage": {} }, "itemEffect": "core.status.hero.atk += 0", - "itemEffectTip": ",攻击+0" + "itemEffectTip": ",攻击+0", + "equipCls": "匕首" }, "sword1": { "cls": "equips", @@ -150,10 +114,10 @@ var items_296f5d02_12fd_4166_a7c1_b5e830c9ee3a = "equip": { "type": 0, "animate": "sword", - "value": { - "atk": 10 - }, - "percentage": {} + "value": {}, + "percentage": { + "mdef": 10 + } }, "itemEffect": "core.status.hero.atk += 10", "itemEffectTip": ",攻击+10", @@ -166,10 +130,10 @@ var items_296f5d02_12fd_4166_a7c1_b5e830c9ee3a = "equip": { "type": "武器", "animate": "sword", - "value": { - "atk": 20 - }, - "percentage": {} + "value": {}, + "percentage": { + "mdef": 20 + } }, "itemEffect": "core.status.hero.atk += 20", "itemEffectTip": ",攻击+20", @@ -247,10 +211,10 @@ var items_296f5d02_12fd_4166_a7c1_b5e830c9ee3a = "text": "一个很普通的铁盾", "equip": { "type": 1, - "value": { - "def": 10 - }, - "percentage": {} + "value": {}, + "percentage": { + "mdef": 10 + } }, "itemEffect": "core.status.hero.def += 10", "itemEffectTip": ",防御+10", @@ -310,13 +274,15 @@ var items_296f5d02_12fd_4166_a7c1_b5e830c9ee3a = "itemEffectTip": ",防御+100,护盾+100" }, "superPotion": { - "cls": "items", + "cls": "tools", "name": "圣水", "itemEffect": "core.status.hero.hp *= 2", "itemEffectTip": ",生命值翻倍", "useItemEffect": "core.status.hero.hp *= 2;core.playSound('回血');", "canUseItemEffect": "true", - "text": "生命值翻倍" + "text": "生命值翻倍", + "canBatchUse": "true", + "hideInReplay": true }, "book": { "cls": "constants", @@ -593,9 +559,18 @@ var items_296f5d02_12fd_4166_a7c1_b5e830c9ee3a = "canUseItemEffect": "true" }, "I375": { - "cls": "items", - "name": "新物品", - "canUseItemEffect": "true" + "cls": "equips", + "name": "基础法杖", + "canUseItemEffect": "true", + "equipCls": "法杖", + "equip": { + "type": 0, + "value": { + "matk": 10, + "mhp": -100 + }, + "percentage": {} + } }, "I396": { "cls": "items", diff --git a/project/plugins.js b/project/plugins.js index 7033fe6..df24c93 100644 --- a/project/plugins.js +++ b/project/plugins.js @@ -197,6 +197,7 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 = core.registerEvent("cgtext", function (data) { if (!main.replayChecking && !core.isReplaying()) { core.ui.cgText.image = data.bg; + core.ui.cgText.nobg = data.nobg ?? false; core.ui.cgText.memory = data.memory; core.ui.cgText.head = core.clone(data.head); core.ui.cgText.index = data.index; @@ -303,8 +304,6 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 = ctx.fillRect(0, 0, ctx.canvas.width, ctx.canvas.height); lightDec = core.clamp(lightDec, 0, 1); - - // 绘制每个灯光效果 ctx.globalCompositeOperation = "destination-out"; lights.forEach(function (light) { // 坐标,半径,中心不透明度 @@ -692,207 +691,207 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 = }; }, "fiveLayers": function () { - // 是否启用五图层(增加背景2层和前景2层) 将__enable置为true即会启用;启用后请保存后刷新编辑器 - // 背景层2将会覆盖背景层 被事件层覆盖 前景层2将会覆盖前景层 - // 另外 请注意加入两个新图层 会让大地图的性能降低一些 - // 插件作者:ad - var __enable = true; - if (!__enable) return; + // 是否启用五图层(增加背景2层和前景2层) 将__enable置为true即会启用;启用后请保存后刷新编辑器 + // 背景层2将会覆盖背景层 被事件层覆盖 前景层2将会覆盖前景层 + // 另外 请注意加入两个新图层 会让大地图的性能降低一些 + // 插件作者:ad + var __enable = true; + if (!__enable) return; - // 创建新图层 - function createCanvas(name, zIndex) { - if (!name) return; - var canvas = document.createElement("canvas"); - canvas.id = name; - canvas.className = "gameCanvas anti-aliasing"; - // 编辑器模式下设置zIndex会导致加入的图层覆盖优先级过高 - if (main.mode != "editor") canvas.style.zIndex = zIndex || 0; - // 将图层插入进游戏内容 - document.getElementById("gameDraw").appendChild(canvas); - var ctx = canvas.getContext("2d"); - core.canvas[name] = ctx; - canvas.width = core._PX_ || core.__PIXELS__; - canvas.height = core._PY_ || core.__PIXELS__; - return canvas; - } + // 创建新图层 + function createCanvas(name, zIndex) { + if (!name) return; + var canvas = document.createElement("canvas"); + canvas.id = name; + canvas.className = "gameCanvas anti-aliasing"; + // 编辑器模式下设置zIndex会导致加入的图层覆盖优先级过高 + if (main.mode != "editor") canvas.style.zIndex = zIndex || 0; + // 将图层插入进游戏内容 + document.getElementById("gameDraw").appendChild(canvas); + var ctx = canvas.getContext("2d"); + core.canvas[name] = ctx; + canvas.width = core._PX_ || core.__PIXELS__; + canvas.height = core._PY_ || core.__PIXELS__; + return canvas; + } - var bg2Canvas = createCanvas("bg2", 20); - var fg2Canvas = createCanvas("fg2", 63); - // 大地图适配 - core.bigmap.canvas = [ - "bg2", - "fg2", - "bg", - "event", - "event2", - "fg", - "damage", - ]; - core.initStatus.bg2maps = {}; - core.initStatus.fg2maps = {}; + var bg2Canvas = createCanvas("bg2", 20); + var fg2Canvas = createCanvas("fg2", 63); + // 大地图适配 + core.bigmap.canvas = [ + "bg2", + "fg2", + "bg", + "event", + "event2", + "fg", + "damage", + ]; + core.initStatus.bg2maps = {}; + core.initStatus.fg2maps = {}; - if (main.mode == "editor") { - /*插入编辑器的图层 不做此步新增图层无法在编辑器显示*/ - // 编辑器图层覆盖优先级 eui > efg > fg(前景层) > event2(48*32图块的事件层) > event(事件层) > bg(背景层) - // 背景层2(bg2) 插入事件层(event)之前(即bg与event之间) - document - .getElementById("mapEdit") - .insertBefore(bg2Canvas, document.getElementById("event")); - // 前景层2(fg2) 插入编辑器前景(efg)之前(即fg之后) - document - .getElementById("mapEdit") - .insertBefore(fg2Canvas, document.getElementById("ebm")); - // 原本有三个图层 从4开始添加 - var num = 4; - // 新增图层存入editor.dom中 - editor.dom.bg2c = core.canvas.bg2.canvas; - editor.dom.bg2Ctx = core.canvas.bg2; - editor.dom.fg2c = core.canvas.fg2.canvas; - editor.dom.fg2Ctx = core.canvas.fg2; - editor.dom.maps.push("bg2map", "fg2map"); - editor.dom.canvas.push("bg2", "fg2"); + if (main.mode == "editor") { + /*插入编辑器的图层 不做此步新增图层无法在编辑器显示*/ + // 编辑器图层覆盖优先级 eui > efg > fg(前景层) > event2(48*32图块的事件层) > event(事件层) > bg(背景层) + // 背景层2(bg2) 插入事件层(event)之前(即bg与event之间) + document + .getElementById("mapEdit") + .insertBefore(bg2Canvas, document.getElementById("event")); + // 前景层2(fg2) 插入编辑器前景(efg)之前(即fg之后) + document + .getElementById("mapEdit") + .insertBefore(fg2Canvas, document.getElementById("ebm")); + // 原本有三个图层 从4开始添加 + var num = 4; + // 新增图层存入editor.dom中 + editor.dom.bg2c = core.canvas.bg2.canvas; + editor.dom.bg2Ctx = core.canvas.bg2; + editor.dom.fg2c = core.canvas.fg2.canvas; + editor.dom.fg2Ctx = core.canvas.fg2; + editor.dom.maps.push("bg2map", "fg2map"); + editor.dom.canvas.push("bg2", "fg2"); - // 创建编辑器上的按钮 - var createCanvasBtn = function (name) { - // 电脑端创建按钮 - var input = document.createElement("input"); - // layerMod4/layerMod5 - var id = "layerMod" + num++; - // bg2map/fg2map - var value = name + "map"; - input.type = "radio"; - input.name = "layerMod"; - input.id = id; - input.value = value; - editor.dom[id] = input; - input.onchange = function () { - editor.uifunctions.setLayerMod(value); - }; - return input; - }; + // 创建编辑器上的按钮 + var createCanvasBtn = function (name) { + // 电脑端创建按钮 + var input = document.createElement("input"); + // layerMod4/layerMod5 + var id = "layerMod" + num++; + // bg2map/fg2map + var value = name + "map"; + input.type = "radio"; + input.name = "layerMod"; + input.id = id; + input.value = value; + editor.dom[id] = input; + input.onchange = function () { + editor.uifunctions.setLayerMod(value); + }; + return input; + }; - var createCanvasBtn_mobile = function (name) { - // 手机端往选择列表中添加子选项 - var input = document.createElement("option"); - var id = "layerMod" + num++; - var value = name + "map"; - input.name = "layerMod"; - input.value = value; - editor.dom[id] = input; - return input; - }; - if (!editor.isMobile) { - var input = createCanvasBtn("bg2"); - var input2 = createCanvasBtn("fg2"); - // 获取事件层及其父节点 - var child = document.getElementById("layerMod"), - parent = child.parentNode; - // 背景层2插入事件层前 - parent.insertBefore(input, child); - // 不能直接更改背景层2的innerText 所以创建文本节点 - var txt = document.createTextNode("bg2"); - // 插入事件层前(即新插入的背景层2前) - parent.insertBefore(txt, child); - // 向最后插入前景层2(即插入前景层后) - parent.appendChild(input2); - var txt2 = document.createTextNode("fg2"); - parent.appendChild(txt2); - parent.childNodes[2].replaceWith("bg"); - parent.childNodes[6].replaceWith("事件"); - parent.childNodes[8].replaceWith("fg"); - } else { - var input = createCanvasBtn_mobile("bg2"); - var input2 = createCanvasBtn_mobile("fg2"); - // 手机端因为是选项 所以可以直接改innerText - input.innerText = "背景层2"; - input2.innerText = "前景层2"; - var parent = document.getElementById("layerMod"); - parent.insertBefore(input, parent.children[1]); - parent.appendChild(input2); - } - } + var createCanvasBtn_mobile = function (name) { + // 手机端往选择列表中添加子选项 + var input = document.createElement("option"); + var id = "layerMod" + num++; + var value = name + "map"; + input.name = "layerMod"; + input.value = value; + editor.dom[id] = input; + return input; + }; + if (!editor.isMobile) { + var input = createCanvasBtn("bg2"); + var input2 = createCanvasBtn("fg2"); + // 获取事件层及其父节点 + var child = document.getElementById("layerMod"), + parent = child.parentNode; + // 背景层2插入事件层前 + parent.insertBefore(input, child); + // 不能直接更改背景层2的innerText 所以创建文本节点 + var txt = document.createTextNode("bg2"); + // 插入事件层前(即新插入的背景层2前) + parent.insertBefore(txt, child); + // 向最后插入前景层2(即插入前景层后) + parent.appendChild(input2); + var txt2 = document.createTextNode("fg2"); + parent.appendChild(txt2); + parent.childNodes[2].replaceWith("bg"); + parent.childNodes[6].replaceWith("事件"); + parent.childNodes[8].replaceWith("fg"); + } else { + var input = createCanvasBtn_mobile("bg2"); + var input2 = createCanvasBtn_mobile("fg2"); + // 手机端因为是选项 所以可以直接改innerText + input.innerText = "背景层2"; + input2.innerText = "前景层2"; + var parent = document.getElementById("layerMod"); + parent.insertBefore(input, parent.children[1]); + parent.appendChild(input2); + } + } - var _loadFloor_doNotCopy = core.maps._loadFloor_doNotCopy; - core.maps._loadFloor_doNotCopy = function () { - return ["bg2map", "fg2map"].concat(_loadFloor_doNotCopy()); - }; - ////// 绘制背景和前景层 ////// - core.maps._drawBg_draw = function (floorId, toDrawCtx, cacheCtx, config) { - config.ctx = cacheCtx; - core.maps._drawBg_drawBackground(floorId, config); - // ------ 调整这两行的顺序来控制是先绘制贴图还是先绘制背景图块;后绘制的覆盖先绘制的。 - core.maps._drawFloorImages( - floorId, - config.ctx, - "bg", - null, - null, - config.onMap - ); - core.maps._drawBgFgMap(floorId, "bg", config); - if (config.onMap) { - core.drawImage( - toDrawCtx, - cacheCtx.canvas, - core.bigmap.v2 ? -32 : 0, - core.bigmap.v2 ? -32 : 0 - ); - core.clearMap("bg2"); - core.clearMap(cacheCtx); - } - core.maps._drawBgFgMap(floorId, "bg2", config); - if (config.onMap) - core.drawImage( - "bg2", - cacheCtx.canvas, - core.bigmap.v2 ? -32 : 0, - core.bigmap.v2 ? -32 : 0 - ); - config.ctx = toDrawCtx; - }; - core.maps._drawFg_draw = function (floorId, toDrawCtx, cacheCtx, config) { - config.ctx = cacheCtx; - // ------ 调整这两行的顺序来控制是先绘制贴图还是先绘制前景图块;后绘制的覆盖先绘制的。 - core.maps._drawFloorImages( - floorId, - config.ctx, - "fg", - null, - null, - config.onMap - ); - core.maps._drawBgFgMap(floorId, "fg", config); - if (config.onMap) { - core.drawImage( - toDrawCtx, - cacheCtx.canvas, - core.bigmap.v2 ? -32 : 0, - core.bigmap.v2 ? -32 : 0 - ); - core.clearMap("fg2"); - core.clearMap(cacheCtx); - } - core.maps._drawBgFgMap(floorId, "fg2", config); - if (config.onMap) - core.drawImage( - "fg2", - cacheCtx.canvas, - core.bigmap.v2 ? -32 : 0, - core.bigmap.v2 ? -32 : 0 - ); - config.ctx = toDrawCtx; - }; - ////// 移动判定 ////// - core.maps._generateMovableArray_arrays = function (floorId) { - return { - bgArray: this.getBgMapArray(floorId), - fgArray: this.getFgMapArray(floorId), - eventArray: this.getMapArray(floorId), - bg2Array: this._getBgFgMapArray("bg2", floorId), - fg2Array: this._getBgFgMapArray("fg2", floorId), - }; - }; -}, + var _loadFloor_doNotCopy = core.maps._loadFloor_doNotCopy; + core.maps._loadFloor_doNotCopy = function () { + return ["bg2map", "fg2map"].concat(_loadFloor_doNotCopy()); + }; + ////// 绘制背景和前景层 ////// + core.maps._drawBg_draw = function (floorId, toDrawCtx, cacheCtx, config) { + config.ctx = cacheCtx; + core.maps._drawBg_drawBackground(floorId, config); + // ------ 调整这两行的顺序来控制是先绘制贴图还是先绘制背景图块;后绘制的覆盖先绘制的。 + core.maps._drawFloorImages( + floorId, + config.ctx, + "bg", + null, + null, + config.onMap + ); + core.maps._drawBgFgMap(floorId, "bg", config); + if (config.onMap) { + core.drawImage( + toDrawCtx, + cacheCtx.canvas, + core.bigmap.v2 ? -32 : 0, + core.bigmap.v2 ? -32 : 0 + ); + core.clearMap("bg2"); + core.clearMap(cacheCtx); + } + core.maps._drawBgFgMap(floorId, "bg2", config); + if (config.onMap) + core.drawImage( + "bg2", + cacheCtx.canvas, + core.bigmap.v2 ? -32 : 0, + core.bigmap.v2 ? -32 : 0 + ); + config.ctx = toDrawCtx; + }; + core.maps._drawFg_draw = function (floorId, toDrawCtx, cacheCtx, config) { + config.ctx = cacheCtx; + // ------ 调整这两行的顺序来控制是先绘制贴图还是先绘制前景图块;后绘制的覆盖先绘制的。 + core.maps._drawFloorImages( + floorId, + config.ctx, + "fg", + null, + null, + config.onMap + ); + core.maps._drawBgFgMap(floorId, "fg", config); + if (config.onMap) { + core.drawImage( + toDrawCtx, + cacheCtx.canvas, + core.bigmap.v2 ? -32 : 0, + core.bigmap.v2 ? -32 : 0 + ); + core.clearMap("fg2"); + core.clearMap(cacheCtx); + } + core.maps._drawBgFgMap(floorId, "fg2", config); + if (config.onMap) + core.drawImage( + "fg2", + cacheCtx.canvas, + core.bigmap.v2 ? -32 : 0, + core.bigmap.v2 ? -32 : 0 + ); + config.ctx = toDrawCtx; + }; + ////// 移动判定 ////// + core.maps._generateMovableArray_arrays = function (floorId) { + return { + bgArray: this.getBgMapArray(floorId), + fgArray: this.getFgMapArray(floorId), + eventArray: this.getMapArray(floorId), + bg2Array: this._getBgFgMapArray("bg2", floorId), + fg2Array: this._getBgFgMapArray("fg2", floorId), + }; + }; + }, "itemShop": function () { // 道具商店相关的插件 // 可在全塔属性-全局商店中使用「道具商店」事件块进行编辑(如果找不到可以在入口方块中找) @@ -2523,1804 +2522,1984 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 = })(); }, "statusBar": function () { - main.dom.floorMsgGroup.style.display = "none"; - main.dom.statusBar.style.display = "none"; - main.dom.toolBar.style.display = "none"; - //所有数据*3是为了实现高清画布 - const GAMEVIEW_WIDTH = 676 * 3; //横屏画面宽度 - const GAMEVIEW_HEIGHT = 416 * 3; //横屏画面高度 + main.dom.floorMsgGroup.style.display = "none"; + main.dom.statusBar.style.display = "none"; + main.dom.toolBar.style.display = "none"; + //所有数据*3是为了实现高清画布 + const GAMEVIEW_WIDTH = 676 * 3; //横屏画面宽度 + const GAMEVIEW_HEIGHT = 416 * 3; //横屏画面高度 - const GAMEVIEW_WIDTH_VERTICAL = 416 * 3; //竖屏画面宽度 - const GAMEVIEW_HEIGHT_VERTICAL = 676 * 3; //竖屏画面高度 + const GAMEVIEW_WIDTH_VERTICAL = 416 * 3; //竖屏画面宽度 + const GAMEVIEW_HEIGHT_VERTICAL = 676 * 3; //竖屏画面高度 - const BAR_WIDTH = 130 * 3; //横屏左侧额外距离(即边栏宽度) - const BAR_HEIGHT_VERTICAL = 130 * 3; //竖屏上侧额外距离(即边栏高度) - const BORDER_WIDTH = 0; //游戏画面左侧偏移距离 - const BORDER_HEIGHT = 0; //游戏画面上侧偏移距离 + const BAR_WIDTH = 130 * 3; //横屏左侧额外距离(即边栏宽度) + const BAR_HEIGHT_VERTICAL = 130 * 3; //竖屏上侧额外距离(即边栏高度) + const BORDER_WIDTH = 0; //游戏画面左侧偏移距离 + const BORDER_HEIGHT = 0; //游戏画面上侧偏移距离 - const ITEM_BOX_LEFT = 549 * 3; //横屏道具栏左侧距离(右侧边栏需增加BAR_WIDTH+GAMEVIEW_HEIGHT) - const ITEM_BOX_TOP = 155 * 3; //横屏道具栏上侧距离 - const ITEM_BOX_LEFT_VERTICAL = 160 * 3; //竖屏道具栏左侧距离 - const ITEM_BOX_TOP_VERTICAL = 549 * 3; //竖屏道具栏上侧距离(下侧边栏需增加BAR_HEIGHT_VERTICAL+GAMEVIEW_WIDTH_VERTICAL) + const ITEM_BOX_LEFT = 549 * 3; //横屏道具栏左侧距离(右侧边栏需增加BAR_WIDTH+GAMEVIEW_HEIGHT) + const ITEM_BOX_TOP = 175 * 3; //横屏道具栏上侧距离 + const ITEM_BOX_LEFT_VERTICAL = 160 * 3; //竖屏道具栏左侧距离 + const ITEM_BOX_TOP_VERTICAL = 549 * 3; //竖屏道具栏上侧距离(下侧边栏需增加BAR_HEIGHT_VERTICAL+GAMEVIEW_WIDTH_VERTICAL) - const EQUIP_BLOCK_LEFT = 549 * 3; //横屏装备栏左侧距离(右侧边栏需增加BAR_WIDTH+GAMEVIEW_HEIGHT) - const EQUIP_BLOCK_TOP = 10 * 3; //横屏装备栏上侧距离 - const EQUIP_BLOCK_LEFT_VERTICAL = 10 * 3; //竖屏装备栏左侧距离 - const EQUIP_BLOCK_TOP_VERTICAL = 549 * 3; //竖屏装备栏上侧距离(下侧边栏需增加BAR_HEIGHT_VERTICAL+GAMEVIEW_WIDTH_VERTICAL) + const EQUIP_BLOCK_LEFT = 549 * 3; //横屏装备栏左侧距离(右侧边栏需增加BAR_WIDTH+GAMEVIEW_HEIGHT) + const EQUIP_BLOCK_TOP = 10 * 3; //横屏装备栏上侧距离 + const EQUIP_BLOCK_LEFT_VERTICAL = 10 * 3; //竖屏装备栏左侧距离 + const EQUIP_BLOCK_TOP_VERTICAL = 549 * 3; //竖屏装备栏上侧距离(下侧边栏需增加BAR_HEIGHT_VERTICAL+GAMEVIEW_WIDTH_VERTICAL) - const MAP_BLOCK_LEFT = 551 * 3; //横屏小地图左侧距离(右侧边栏需增加BAR_WIDTH+GAMEVIEW_HEIGHT) - const MAP_BLOCK_TOP = 0; //横屏小地图上侧距离 - const MAP_BLOCK_LEFT_VERTICAL = 0; //竖屏小地图左侧距离 - const MAP_BLOCK_TOP_VERTICAL = 551 * 3; //竖屏小地图上侧距离(下侧边栏需增加BAR_HEIGHT_VERTICAL+GAMEVIEW_WIDTH_VERTICAL) + const MAP_BLOCK_LEFT = 551 * 3; //横屏小地图左侧距离(右侧边栏需增加BAR_WIDTH+GAMEVIEW_HEIGHT) + const MAP_BLOCK_TOP = 0; //横屏小地图上侧距离 + const MAP_BLOCK_LEFT_VERTICAL = 0; //竖屏小地图左侧距离 + const MAP_BLOCK_TOP_VERTICAL = 551 * 3; //竖屏小地图上侧距离(下侧边栏需增加BAR_HEIGHT_VERTICAL+GAMEVIEW_WIDTH_VERTICAL) - const KEY_BLOCK_LEFT = EQUIP_BLOCK_LEFT; //横屏钥匙栏左侧距离(右侧边栏需增加BAR_WIDTH+GAMEVIEW_HEIGHT) - const KEY_BLOCK_TOP = 110 * 3; //横屏钥匙栏上侧距离 - const KEY_BLOCK_LEFT_VERTICAL = 110 * 3; //竖屏钥匙栏左侧距离 - const KEY_BLOCK_TOP_VERTICAL = EQUIP_BLOCK_TOP_VERTICAL; //竖屏钥匙栏上侧距离(下侧边栏需增加BAR_HEIGHT_VERTICAL+GAMEVIEW_WIDTH_VERTICAL) + const KEY_BLOCK_LEFT = EQUIP_BLOCK_LEFT; //横屏钥匙栏左侧距离(右侧边栏需增加BAR_WIDTH+GAMEVIEW_HEIGHT) + const KEY_BLOCK_TOP = 130 * 3; //横屏钥匙栏上侧距离 + const KEY_BLOCK_LEFT_VERTICAL = 110 * 3; //竖屏钥匙栏左侧距离 + const KEY_BLOCK_TOP_VERTICAL = EQUIP_BLOCK_TOP_VERTICAL; //竖屏钥匙栏上侧距离(下侧边栏需增加BAR_HEIGHT_VERTICAL+GAMEVIEW_WIDTH_VERTICAL) - const INFO_BLOCK_LEFT = 10 * 3; //横屏道具说明左侧距离(右侧边栏需增加BAR_WIDTH+GAMEVIEW_HEIGHT) - const INFO_BLOCK_TOP = 180 * 3; //横屏道具说明上侧距离 - const INFO_BLOCK_LEFT_VERTICAL = 113 * 3; //竖屏道具说明左侧距离 - const INFO_BLOCK_TOP_VERTICAL = 8 * 3; //竖屏道具说明上侧距离(下侧边栏需增加BAR_HEIGHT_VERTICAL+GAMEVIEW_WIDTH_VERTICAL) + const INFO_BLOCK_LEFT = 10 * 3; //横屏道具说明左侧距离(右侧边栏需增加BAR_WIDTH+GAMEVIEW_HEIGHT) + const INFO_BLOCK_TOP = 290 * 3; //横屏道具说明上侧距离 + const INFO_BLOCK_LEFT_VERTICAL = 113 * 3; //竖屏道具说明左侧距离 + const INFO_BLOCK_TOP_VERTICAL = 8 * 3; //竖屏道具说明上侧距离(下侧边栏需增加BAR_HEIGHT_VERTICAL+GAMEVIEW_WIDTH_VERTICAL) - const TOOL_BOX_LEFT = EQUIP_BLOCK_LEFT; //横屏工具栏左侧距离(右侧边栏需增加BAR_WIDTH+GAMEVIEW_HEIGHT) - const TOOL_BOX_TOP = 348 * 3; //横屏工具栏上侧距离 - const TOOL_BOX_LEFT_VERTICAL = 348 * 3; //竖屏工具栏左侧距离 - const TOOL_BOX_TOP_VERTICAL = 549 * 3; //竖屏工具栏上侧距离(下侧边栏需增加BAR_HEIGHT_VERTICAL+GAMEVIEW_WIDTH_VERTICAL) + const TOOL_BOX_LEFT = EQUIP_BLOCK_LEFT; //横屏工具栏左侧距离(右侧边栏需增加BAR_WIDTH+GAMEVIEW_HEIGHT) + const TOOL_BOX_TOP = 348 * 3; //横屏工具栏上侧距离 + const TOOL_BOX_LEFT_VERTICAL = 348 * 3; //竖屏工具栏左侧距离 + const TOOL_BOX_TOP_VERTICAL = 549 * 3; //竖屏工具栏上侧距离(下侧边栏需增加BAR_HEIGHT_VERTICAL+GAMEVIEW_WIDTH_VERTICAL) - const TOOL_ICON_OUTER_SIZE = 34 * 3; + const TOOL_ICON_OUTER_SIZE = 34 * 3; - const TEXT_COLOR = "#FFFFFF"; //默认文字颜色 - const globalAlpha = 0.7; //默认底框透明度 - const FORCE_COUNTABLE_ITEMS = ["centerFly"]; //常态显示数量的非永久道具,如果道具不在此数组中,则只有道具多余1时显示数量 + const TEXT_COLOR = "#FFFFFF"; //默认文字颜色 + const globalAlpha = 0.7; //默认底框透明度 + const FORCE_COUNTABLE_ITEMS = ["centerFly"]; //常态显示数量的非永久道具,如果道具不在此数组中,则只有道具多余1时显示数量 - const outerBackground = document.createElement("canvas"); //背景画布设置 - let globalAlphafloor = 0, - globalAlphafloorStatus = 4; - outerBackground.style.position = "absolute"; - outerBackground.style.zIndex = 5; - outerBackground.id = "outerBackground"; - main.dom.outerBackground = outerBackground; - main.dom.startPanel.insertAdjacentElement("afterend", outerBackground); + const outerBackground = document.createElement("canvas"); //背景画布设置 + let globalAlphafloor = 0, + globalAlphafloorStatus = 4; + outerBackground.style.position = "absolute"; + outerBackground.style.zIndex = 5; + outerBackground.id = "outerBackground"; + main.dom.outerBackground = outerBackground; + main.dom.startPanel.insertAdjacentElement("afterend", outerBackground); - const outerUI = document.createElement("canvas"); //额外ui画布设置(状态栏所有绘制、点击都在额外ui上) - outerUI.style.position = "absolute"; - outerUI.style.zIndex = 165; - outerUI.id = "outerUI"; + const outerUI = document.createElement("canvas"); //额外ui画布设置(状态栏所有绘制、点击都在额外ui上) + outerUI.style.position = "absolute"; + outerUI.style.zIndex = 165; + outerUI.id = "outerUI"; - main.dom.outerUI = outerUI; - outerBackground.insertAdjacentElement("afterend", outerUI); - setTimeout(function () { - // Should be executed immediately after init() - main.canvas.outerUI = outerUI.getContext("2d"); - }); - outerUI.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.statusBar.onclick(px * 3, py * 3); - } catch (ee) { - main.log(ee); - } - }; + main.dom.outerUI = outerUI; + outerBackground.insertAdjacentElement("afterend", outerUI); + setTimeout(function () { + // Should be executed immediately after init() + main.canvas.outerUI = outerUI.getContext("2d"); + }); + outerUI.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.statusBar.onclick(px * 3, py * 3); + } catch (ee) { + main.log(ee); + } + }; - const _resize_gameGroup = function (obj) { - //游戏画面自适应调节 - const gameGroup = core.dom.gameGroup; - gameGroup.style.width = obj.totalWidth + "px"; - gameGroup.style.height = obj.totalHeight + "px"; - gameGroup.style.left = (obj.clientWidth - obj.totalWidth) / 2 + "px"; - gameGroup.style.top = (obj.clientHeight - obj.totalHeight) / 2 + "px"; - //floorMsgGroup为切换楼层中生效,显示时间可通过‘全塔属性’——‘切换楼层时间’或游戏内设置调整 - //显示内容为游戏名/版本号/楼层名 - // floorMsgGroup - var floorMsgGroup = core.dom.floorMsgGroup; - var globalAttribute = - core.status.globalAttribute || core.initStatus.globalAttribute; - floorMsgGroup.style = globalAttribute.floorChangingStyle; - floorMsgGroup.style.height = floorMsgGroup.style.width = - (GAMEVIEW_HEIGHT / 3) * core.domStyle.scale + "px"; - floorMsgGroup.style.fontSize = 16 * core.domStyle.scale + "px"; + const _resize_gameGroup = function (obj) { + //游戏画面自适应调节 + const gameGroup = core.dom.gameGroup; + gameGroup.style.width = obj.totalWidth + "px"; + gameGroup.style.height = obj.totalHeight + "px"; + gameGroup.style.left = (obj.clientWidth - obj.totalWidth) / 2 + "px"; + gameGroup.style.top = (obj.clientHeight - obj.totalHeight) / 2 + "px"; + //floorMsgGroup为切换楼层中生效,显示时间可通过‘全塔属性’——‘切换楼层时间’或游戏内设置调整 + //显示内容为游戏名/版本号/楼层名 + // floorMsgGroup + var floorMsgGroup = core.dom.floorMsgGroup; + var globalAttribute = + core.status.globalAttribute || core.initStatus.globalAttribute; + floorMsgGroup.style = globalAttribute.floorChangingStyle; + floorMsgGroup.style.height = floorMsgGroup.style.width = + (GAMEVIEW_HEIGHT / 3) * core.domStyle.scale + "px"; + floorMsgGroup.style.fontSize = 16 * core.domStyle.scale + "px"; - if (core.domStyle.isVertical) { - floorMsgGroup.style.left = "0px"; - floorMsgGroup.style.top = - ((GAMEVIEW_HEIGHT_VERTICAL / 3 - GAMEVIEW_WIDTH_VERTICAL / 3) * - core.domStyle.scale) / - 2 + - "px"; - } else { - floorMsgGroup.style.left = - ((GAMEVIEW_WIDTH / 3 - GAMEVIEW_HEIGHT / 3) * core.domStyle.scale) / - 2 + - "px"; - floorMsgGroup.style.top = "0px"; - } - core.dom.musicBtn.style.right = - (obj.clientWidth - obj.totalWidth) / 2 + "px"; - core.dom.musicBtn.style.bottom = - (obj.clientHeight - obj.totalHeight) / 2 - 27 + "px"; - let startBackground = core.domStyle.isVertical - ? main.styles.startVerticalBackground || main.styles.startBackground - : main.styles.startBackground; - if (main.dom.startBackground.getAttribute("__src__") != startBackground) { - main.dom.startBackground.setAttribute("__src__", startBackground); - main.dom.startBackground.src = startBackground; - } - const span = document - .getElementById("startButtons") - .getElementsByTagName("span"); - let font = (GAMEVIEW_WIDTH / 100) * core.domStyle.scale; - if (core.domStyle.isVertical) - font = ((GAMEVIEW_WIDTH_VERTICAL * 2) / 100) * core.domStyle.scale; + if (core.domStyle.isVertical) { + floorMsgGroup.style.left = "0px"; + floorMsgGroup.style.top = + ((GAMEVIEW_HEIGHT_VERTICAL / 3 - GAMEVIEW_WIDTH_VERTICAL / 3) * + core.domStyle.scale) / + 2 + + "px"; + } else { + floorMsgGroup.style.left = + ((GAMEVIEW_WIDTH / 3 - GAMEVIEW_HEIGHT / 3) * core.domStyle.scale) / + 2 + + "px"; + floorMsgGroup.style.top = "0px"; + } + core.dom.musicBtn.style.right = + (obj.clientWidth - obj.totalWidth) / 2 + "px"; + core.dom.musicBtn.style.bottom = + (obj.clientHeight - obj.totalHeight) / 2 - 27 + "px"; + let startBackground = core.domStyle.isVertical ? + main.styles.startVerticalBackground || main.styles.startBackground : + main.styles.startBackground; + if (main.dom.startBackground.getAttribute("__src__") != startBackground) { + main.dom.startBackground.setAttribute("__src__", startBackground); + main.dom.startBackground.src = startBackground; + } + const span = document + .getElementById("startButtons") + .getElementsByTagName("span"); + let font = (GAMEVIEW_WIDTH / 100) * core.domStyle.scale; + if (core.domStyle.isVertical) + font = ((GAMEVIEW_WIDTH_VERTICAL * 2) / 100) * core.domStyle.scale; - core.dom.playGame.style.fontSize = font + "px"; - core.dom.loadGame.style.fontSize = font + "px"; - core.dom.CGMode.style.fontSize = font + "px"; - core.dom.musicMode.style.fontSize = font + "px"; - core.dom.replayGame.style.fontSize = font + "px"; - core.dom.startButtonGroup.style.padding = font * 0.3 + "px 25px"; - }; - const _resize_canvas = function (obj) { - //自适应画布 - main.dom.outerBackground.style.width = obj.totalWidth + "px"; - main.dom.outerBackground.style.height = obj.totalHeight + "px"; - main.dom.outerUI.style.width = obj.totalWidth + "px"; - main.dom.outerUI.style.height = obj.totalHeight + "px"; - if (main.dom.CGUI) { - main.dom.CGUI.style.width = obj.totalWidth + 3 + "px"; - main.dom.CGUI.style.height = obj.totalHeight + 3 + "px"; - } - if (main.dom.music) { - main.dom.music.style.width = obj.totalWidth + 3 + "px"; - main.dom.music.style.height = obj.totalHeight + 3 + "px"; - } - if (main.dom.cgText) { - main.dom.cgText.style.width = obj.totalWidth + 3 + "px"; - main.dom.cgText.style.height = obj.totalHeight + 3 + "px"; - } - if (main.dom.logcanvas) { - main.dom.logcanvas.style.width = obj.totalWidth + 3 + "px"; - main.dom.logcanvas.style.height = obj.totalHeight + 3 + "px"; - } - if (main.dom.over) { - main.dom.over.style.width = obj.totalWidth + 3 + "px"; - main.dom.over.style.height = obj.totalHeight + 3 + "px"; - } - if (main.dom.video) { - main.dom.video.style.width = obj.totalWidth + 3 + "px"; - main.dom.video.style.height = obj.totalHeight + 3 + "px"; - if (core.domStyle.isVertical) - main.dom.video.style.width = obj.totalHeight + 3 + "px"; - if (core.domStyle.isVertical) - main.dom.video.style.height = obj.totalWidth + 3 + "px"; - main.dom.video.style.top = "50%"; - main.dom.video.style.left = "50%"; + core.dom.playGame.style.fontSize = font + "px"; + core.dom.loadGame.style.fontSize = font + "px"; + core.dom.CGMode.style.fontSize = font + "px"; + core.dom.musicMode.style.fontSize = font + "px"; + core.dom.replayGame.style.fontSize = font + "px"; + core.dom.startButtonGroup.style.padding = font * 0.3 + "px 25px"; + }; + const _resize_canvas = function (obj) { + //自适应画布 + main.dom.outerBackground.style.width = obj.totalWidth + "px"; + main.dom.outerBackground.style.height = obj.totalHeight + "px"; + main.dom.outerUI.style.width = obj.totalWidth + "px"; + main.dom.outerUI.style.height = obj.totalHeight + "px"; + if (main.dom.CGUI) { + main.dom.CGUI.style.width = obj.totalWidth + 3 + "px"; + main.dom.CGUI.style.height = obj.totalHeight + 3 + "px"; + } + if (main.dom.music) { + main.dom.music.style.width = obj.totalWidth + 3 + "px"; + main.dom.music.style.height = obj.totalHeight + 3 + "px"; + } + if (main.dom.cgText) { + main.dom.cgText.style.width = obj.totalWidth + 3 + "px"; + main.dom.cgText.style.height = obj.totalHeight + 3 + "px"; + } + if (main.dom.logcanvas) { + main.dom.logcanvas.style.width = obj.totalWidth + 3 + "px"; + main.dom.logcanvas.style.height = obj.totalHeight + 3 + "px"; + } + if (main.dom.over) { + main.dom.over.style.width = obj.totalWidth + 3 + "px"; + main.dom.over.style.height = obj.totalHeight + 3 + "px"; + } + if (main.dom.book) { + main.dom.book.style.width = obj.totalWidth + 3 + "px"; + main.dom.book.style.height = obj.totalHeight + 3 + "px"; + } + if (main.dom.video) { + main.dom.video.style.width = obj.totalWidth + 3 + "px"; + main.dom.video.style.height = obj.totalHeight + 3 + "px"; + if (core.domStyle.isVertical) + main.dom.video.style.width = obj.totalHeight + 3 + "px"; + if (core.domStyle.isVertical) + main.dom.video.style.height = obj.totalWidth + 3 + "px"; + main.dom.video.style.top = "50%"; + main.dom.video.style.left = "50%"; - main.dom.video.style.transform = "translate(-50%,-50%)"; + main.dom.video.style.transform = "translate(-50%,-50%)"; - if (core.domStyle.isVertical) - main.dom.video.style.transform = "translate(-50%,-50%) rotate(90deg)"; - } - if (main.dom.video1) { - main.dom.video1.style.width = obj.totalWidth + 3 + "px"; - main.dom.video1.style.height = obj.totalHeight + 3 + "px"; - } + if (core.domStyle.isVertical) + main.dom.video.style.transform = "translate(-50%,-50%) rotate(90deg)"; + } + if (main.dom.video1) { + main.dom.video1.style.width = obj.totalWidth + 3 + "px"; + main.dom.video1.style.height = obj.totalHeight + 3 + "px"; + } - const innerSize = obj.canvasWidth * core.domStyle.scale + "px"; - for (let i = 0; i < core.dom.gameCanvas.length; ++i) - core.dom.gameCanvas[i].style.width = core.dom.gameCanvas[ - i - ].style.height = innerSize; - core.dom.gif.style.width = core.dom.gif.style.height = innerSize; - core.dom.gif2.style.width = core.dom.gif2.style.height = innerSize; + main.dom.boss1.style.width = obj.totalWidth + 3 + "px"; + main.dom.boss1.style.height = obj.totalHeight + 3 + "px"; - 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; + main.dom.boss2.style.width = obj.totalWidth + 3 + "px"; + main.dom.boss2.style.height = obj.totalHeight + 3 + "px"; - 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(); - } + main.dom.boss3.style.width = obj.totalWidth + 3 + "px"; + main.dom.boss3.style.height = obj.totalHeight + 3 + "px"; - 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; - } - } - }); + main.dom.boss4.style.width = obj.totalWidth + 3 + "px"; + main.dom.boss4.style.height = obj.totalHeight + 3 + "px"; - core.control.resize = function () { - //自适应,可实现横竖屏切换 - if (main.mode == "editor") return; + main.dom.boss5.style.width = obj.totalWidth + 3 + "px"; + main.dom.boss5.style.height = obj.totalHeight + 3 + "px"; + main.dom.boss6.style.width = obj.totalWidth + 3 + "px"; + main.dom.boss6.style.height = obj.totalHeight + 3 + "px"; + main.dom.boss7.style.width = obj.totalWidth + 3 + "px"; + main.dom.boss7.style.height = obj.totalHeight + 3 + "px"; + main.dom.boss8.style.width = obj.totalWidth + 3 + "px"; + main.dom.boss8.style.height = obj.totalHeight + 3 + "px"; - const clientWidth = main.dom.body.clientWidth, - clientHeight = main.dom.body.clientHeight; - const canvasWidth = core.__PIXELS__; + main.dom.boss.style.width = obj.totalWidth + 3 + "px"; + main.dom.boss.style.height = obj.totalHeight + 3 + "px"; - const isVertical = clientHeight > clientWidth; - core.domStyle.isVertical = isVertical; + const innerSize = obj.canvasWidth * core.domStyle.scale + "px"; + for (let i = 0; i < core.dom.gameCanvas.length; ++i) + core.dom.gameCanvas[i].style.width = core.dom.gameCanvas[ + i + ].style.height = innerSize; + core.dom.gif.style.width = core.dom.gif.style.height = innerSize; + core.dom.gif2.style.width = core.dom.gif2.style.height = innerSize; - const totalWidth = isVertical - ? GAMEVIEW_WIDTH_VERTICAL / 3 - : GAMEVIEW_WIDTH / 3, - totalHeight = isVertical - ? GAMEVIEW_HEIGHT_VERTICAL / 3 - : GAMEVIEW_HEIGHT / 3; + 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; - const maxRatio = Math.min( - clientWidth / totalWidth, - clientHeight / totalHeight - ); + 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(); + } - core.domStyle.availableScale = []; - [1, 1.25, 1.5, 1.75, 2].forEach(function (v) { - if (maxRatio >= v) { - core.domStyle.availableScale.push(v); - } - }); + 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; + } + } + }); - 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); - } + core.control.resize = function () { + //自适应,可实现横竖屏切换 + if (main.mode == "editor") return; - const totalWidthScaled = totalWidth * core.domStyle.scale, - totalHeightScaled = totalHeight * core.domStyle.scale; + const clientWidth = main.dom.body.clientWidth, + clientHeight = main.dom.body.clientHeight; + const canvasWidth = core.__PIXELS__; - 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 isVertical = clientHeight > clientWidth; + core.domStyle.isVertical = isVertical; - const obj = { - clientWidth: clientWidth, - clientHeight: clientHeight, - canvasWidth: canvasWidth, - totalWidth: totalWidthScaled, - totalHeight: totalHeightScaled, - gameDrawBox: gameDrawBox, - globalAttribute: - core.status.globalAttribute || core.initStatus.globalAttribute, - }; + const totalWidth = isVertical ? + GAMEVIEW_WIDTH_VERTICAL / 3 : + GAMEVIEW_WIDTH / 3, + totalHeight = isVertical ? + GAMEVIEW_HEIGHT_VERTICAL / 3 : + GAMEVIEW_HEIGHT / 3; - _resize_gameGroup(obj); - _resize_canvas(obj); + const maxRatio = Math.min( + clientWidth / totalWidth, + clientHeight / totalHeight + ); - 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(); - }; + core.domStyle.availableScale = []; + [1, 1.25, 1.5, 1.75, 2].forEach(function (v) { + if (maxRatio >= v) { + core.domStyle.availableScale.push(v); + } + }); - 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; + 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 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 totalWidthScaled = totalWidth * core.domStyle.scale, + totalHeightScaled = totalHeight * core.domStyle.scale; - 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 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 }; - 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 - ); + const obj = { + clientWidth: clientWidth, + clientHeight: clientHeight, + canvasWidth: canvasWidth, + totalWidth: totalWidthScaled, + totalHeight: totalHeightScaled, + gameDrawBox: gameDrawBox, + globalAttribute: core.status.globalAttribute || core.initStatus.globalAttribute, + }; - // 四舍五入 - 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 - ); + _resize_gameGroup(obj); + _resize_canvas(obj); - 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 - ); + 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 (main.dom.boss1 && main.dom.boss1.style.display === "block") + core.ui.boss.update(); + }; - 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); - } - }); - } - } + 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, + function () { + core.control._replay_SL(); + }, + ], + ]; + } + //更新 + 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; - _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; + 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; - if (!floorId) return; - const info = core.plugin.getMapDrawInfo(floorId, Infinity, true); - core.setTextAlign("outerUI", "center"); + 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; - core.plugin.drawSmallMap(uictx, info, floorId, x, y, 300, 300); - } + 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", + "spell", + "mdef", + "matk", + "mhp", + "speed", + "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.strokeRect("outerUI", baseX - 96 * 3, + curh - 16 * 3, 100 * 3, 22 * 3, "#FFFFFF", 3) + core.setFont("outerUI", "bold 24px Verdana"); + core.fillBoldText1( + "outerUI", + core.getStatusLabel(item), + baseX - 65 * 3, + curh - 4 * 3, + TEXT_COLOR, + "#000000", + 6 + ); + core.setFont("outerUI", "bold 36px Verdana"); + // 四舍五入 + core.status.hero[item] = Math.round(core.status.hero[item]); + let text = core.getRealStatus(item); + // 大数据格式化 + switch (item) { + case "mdef": + text += "%"; + break; + case "matk": + case "mhp": + text = `${Math.floor(core.getRealStatus("spell")* core.getRealStatus(item)/100)}(${text})%`; + break; + } + core.fillBoldText1( + "outerUI", + text, + baseX, + curh, + TEXT_COLOR, + "#000000", + 6 + ); - _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]; - }); + 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 + ); - let dn = 3; - for (let i = 0; i <= dn; i++) { - let delta = i * 32 * 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 + ); - if (core.domStyle.isVertical) { - this.drawKey(keyList[i], baseX, baseY + delta); - } else { - this.drawKey(keyList[i], baseX + delta, baseY); - } + 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); + } + }); + } + } - 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; + _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 (key == "yellowKey") sx += 13; - else if (key == "blueKey") sx += 26; - else if (key == "greenKey") sx += 39; + if (!floorId) return; + const info = core.plugin.getMapDrawInfo(floorId, Infinity, true); + core.setTextAlign("outerUI", "center"); - 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.plugin.drawSmallMap(uictx, info, floorId, x, y, 300, 300); + } - 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 - ); + _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]; + }); - 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 - ); + let dn = 3; + for (let i = 0; i <= dn; i++) { + let delta = i * 32 * 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 - ); + if (core.domStyle.isVertical) { + this.drawKey(keyList[i], baseX, baseY + delta); + } else { + this.drawKey(keyList[i], baseX + delta, baseY); + } - 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; + 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 (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 (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 + ); + + 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: 24, + }); + } + } else { + core.clearMap( + "outerUI", + INFO_BLOCK_LEFT, + INFO_BLOCK_TOP, + 115 * 3, + 230 * 3 + ); + core.setFont("outerUI", "bold 36px Verdana") + 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: 24, + }); + } + } + } + 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 + 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 (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, - 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.getDamage(id, x, y) === null && !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(); + }; + actions.prototype._sys_ondown_lockControl = function (x, y, px, py) { + if (core.status.played && !core.status.lockControl) return false; + + switch (core.status.event.id) { + case "battle": + core.plugin.battle_onclick(x, y, px, py); + break; + case "centerFly": + this._clickCenterFly(x, y, px, py); + break; + case "book": + this._clickBook(x, y, px, py); + break; + case "book-detail": + this._clickBookDetail(x, y, px, py); + break; + case "fly": + this._clickFly(x, y, px, py); + break; + case "viewMaps": + this._clickViewMaps(x, y, px, py); + break; + case "switchs": + this._clickSwitchs(x, y, px, py); + break; + case "switchs-sounds": + this._clickSwitchs_sounds(x, y, px, py); + break; + case "switchs-display": + this._clickSwitchs_display(x, y, px, py); + break; + case "switchs-action": + this._clickSwitchs_action(x, y, px, py); + break; + case "settings": + this._clickSettings(x, y, px, py); + break; + case "selectShop": + this._clickQuickShop(x, y, px, py); + break; + case "equipbox": + this._clickEquipbox(x, y, px, py); + break; + case "toolbox": + this._clickToolbox(x, y, px, py); + break; + case "save": + case "load": + case "replayLoad": + case "replayRemain": + case "replaySince": + this._clickSL(x, y, px, py); + break; + case "confirmBox": + this._clickConfirmBox(x, y, px, py); + break; + case "keyBoard": + this._clickKeyBoard(x, y, px, py); + break; + case "action": + this._clickAction(x, y, px, py); + break; + case "text": + core.drawText(); + break; + case "notes": + this._clickNotes(x, y, px, py); + break; + case "syncSave": + this._clickSyncSave(x, y, px, py); + break; + case "syncSelect": + this._clickSyncSelect(x, y, px, py); + break; + case "localSaveSelect": + this._clickLocalSaveSelect(x, y, px, py); + break; + case "storageRemove": + this._clickStorageRemove(x, y, px, py); + break; + case "cursor": + this._clickCursor(x, y, px, py); + break; + case "replay": + this._clickReplay(x, y, px, py); + break; + case "gameInfo": + this._clickGameInfo(x, y, px, py); + break; + case "about": + case "help": + core.ui.closePanel(); + break; + } + + // --- 长按判定 + if (core.timeout.onDownTimeout == null) { + core.timeout.onDownTimeout = setTimeout(function () { + if (core.interval.onDownInterval == null) { + core.interval.onDownInterval = setInterval(function () { + if (!core.actions.longClick(x, y, px, py)) { + clearInterval(core.interval.onDownInterval); + core.interval.onDownInterval = null; + } + }, 40); + } + }, 500); + } + return true; + }; + core.registerAction( + "ondown", + "_sys_ondown_lockControl", + core.actions._sys_ondown_lockControl, + 30 + ); +}, "额外信息": function () { /* 宝石血瓶左下角显示数值 * 注意!!!不要在道具属性中直接操作flags,使用core.status.hero.flags或core.setFlag系列函数代替! @@ -4478,708 +4657,956 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 = } } }, - "编辑器显伤": function () { + "跳伤": function () { // 在此增加新插件 - /////// 用户设置 /////// - // 将__enable置为false将关闭插件 - var __enable = true; - // 魔防攻速之类的属性可以在这里加 ['atk', 'def', 'mdef'] - var heroStatus = ["atk", "def", "mdef", "hp"]; - // saveHero为true 将会把每次造塔测试时的角色数据存下来 否则会读取初始属性 - // 用不着可以关了 节约缓存空间 (虽然根本没多少 还没一个存档大 - // 也可以手动清理 控制台输入core.removeLocalStorage('editorHero')即可 - var saveHero = true; - - // 下为具体实现 懒得写注释了 大概就是写HTML然后注册交互 - if (!__enable || main.mode != "editor") return; - core.plugin.initEditorDamage = false; - if (heroStatus.length >= 4 && !editor.isMobile) - editor.dom.mid2.style.top = 650 + 30 * (heroStatus.length - 3) + "px"; - editor.statusRatio = core.getLocalStorage("statusRatio", 1); - editor.saveHero = saveHero; - editor._heroStatus = heroStatus; - editor.dom.mapEdit.appendChild(core.canvas.damage.canvas); - var HTML = - ""; - - //if (heroStatus.length >= 4 && !editor.isMobile) editor.dom.mid2.style.top = 650 + 30 * (heroStatus.length - 3) + 'px'; - heroStatus.forEach(function (status) { - var id = status + "set", - id2 = status + "add", - id3 = status + "rec", - id4 = status + "help"; - HTML += - "
"; - }); - document.getElementById("viewportButtons").innerHTML = HTML; - ["set", "add", "rec", "help"].forEach(function (e) { - heroStatus.forEach(function (status) { - editor.dom[status + e] = document.getElementById(status + e); - }); - }); - var _hasItem = core.items.hasItem; - core.items.hasItem = function (itemId) { - if (itemId == "book" && main.mode == "editor") return true; - return _hasItem.call(core.items, itemId); - }; - if (main.mode == "editor") { - var applyList = [ - "getDamageString", - "nextCriticals", - "getEnemyInfo", - "getEnemyValue", - ]; - applyList.forEach(function (name) { - var func = core.enemys[name]; - core.enemys[name] = function () { - var args = - arguments.length === 1 - ? [arguments[0]] - : Array.apply(null, arguments); - if (typeof args[0] == "string") args[0] = core.enemys.enemys[args[0]]; - return func.apply(core.enemys, args); - }; - }); + /** + 函数使用说明 + Dove.MorePerform.ShowDamagePop.PopDamage( + 'ui', // 画布名称或画布2d上下文对象 + 100, 200, // 位置 (x, y) + -50, // 伤害值 + 24, // 字体大小 + "宋体",//字体 + '#FF0000', // 字体颜色 + '#000000', // 描边颜色 + 0.5, // 水平速度 (speedX) + -10, // 垂直速度 (speedY) + 0.5, // 重力 (gravity) + 120 // 显示时长(帧数) + */ + if (!core.registerAnimationFrame) { + throw new Error("require 2.6.1 or higher version"); } - ////// 获得勇士属性 ////// - core.control.getStatus = function (name) { - if (!core.status.hero) return null; - if (name == "x" || name == "y" || name == "direction") - return this.getHeroLoc(name); - /*if ( main.mode == 'editor' && !core.hasFlag('__statistics__')) { + window.Dove = window.Dove || {}; + Dove.MorePerform = Dove.MorePerform || {}; + + Dove.MorePerform.ShowDamagePop = {}; + Dove.MorePerform.ShowDamagePop.version = 1.0; + + Dove.MorePerform.ShowDamagePop.AllPopingCanvas = []; + + // 每帧的处理 + Dove.MorePerform.ShowDamagePop.Update = function () { + this.AllPopingCanvas = this.AllPopingCanvas.filter(function (spr) { + spr.update(); + return spr.isAlive(); + }); + if (!this.AllPopingCanvas.length) PopSprite._count = 0; + }; + + // 弹出伤害气泡 + Dove.MorePerform.ShowDamagePop.PopDamage = function ( + canvasName, + x, + y, + damageValue, + fontSize, + font, + fontColor, + outlineColor, + speedX, + speedY, + gravity, + duration + ) { + if (damageValue) { + var poper = new PopSprite( + canvasName, + x, + y, + damageValue, + fontSize, + font, + fontColor, + outlineColor, + speedX, + speedY, + gravity, + duration + ); + Dove.MorePerform.ShowDamagePop.AllPopingCanvas.push(poper); + } + }; + + // 战斗发生前后记录生命值并处理 + Dove.MorePerform.ShowDamagePop.OnBattle = core.events.battle; + core.events.battle = function () { + var hpBeforeBattle = core.status.hero.hp; + Dove.MorePerform.ShowDamagePop.OnBattle.apply(core.events, arguments); + if (core.getFlag("noAnimate")) + Dove.MorePerform.ShowDamagePop.PopDamage( + "ui", // 默认画布名称 + core.getHeroLoc("x") * 32, // 英雄位置 x + core.getHeroLoc("y") * 32, // 英雄位置 y + Math.floor(core.status.hero.hp - hpBeforeBattle), // 伤害值 + 16, // 默认字体大小 + "Arial", //默认字体 + null, // 默认颜色 + null, // 默认描边颜色 + null, // 默认水平速度 + null, // 默认垂直速度 + null, // 默认重力 + 90 // 默认显示时长(帧数) + ); + }; + let time = 0; + // 注册每帧事件 + core.registerAnimationFrame("ShowDamagePop", true, (temptime) => { + if (temptime - time > 1000 / 60) { + time = temptime; + + Dove.MorePerform.ShowDamagePop.Update.bind( + Dove.MorePerform.ShowDamagePop + )(); + } + }); + + // 弹出精灵类 + function PopSprite( + canvasName, + x, + y, + damage, + fontSize, + font, + fontColor, + outlineColor, + speedX, + speedY, + gravity, + duration + ) { + this.initialize.apply(this, arguments); + } + + PopSprite.prototype = Object.create(Object.prototype); + PopSprite.prototype.constructor = PopSprite; + + // 常量 + PopSprite._count = 0; + PopSprite._baseZOrder = 50; + PopSprite._floorDis = 20; + + // 初始化 + PopSprite.prototype.initialize = function ( + canvasName, + x, + y, + damage, + fontSize, + font, + fontColor, + outlineColor, + speedX, + speedY, + gravity, + duration + ) { + this._canvasName = canvasName ?? "ui"; // 默认画布名称 + this._x = x; + this._y = y; + this._damage = damage; + this._fontSize = fontSize ?? 16; // 默认字体大小 + this._font = font ?? "Arial"; + this._fontColor = fontColor ?? (damage > 0 ? "#22FF44" : "lightcoral"); // 默认颜色 + this._outlineColor = outlineColor ?? "#FFFFFF"; // 默认描边颜色 + this._speedX = speedX ?? -1 + Math.random() * 2; // 水平速度,默认随机 + this._speedY = speedY ?? -3 - Math.random() * 4; // 垂直速度,默认随机 + this._gravity = gravity ?? 0.3; // 重力加速度,默认 0.3 + this._duration = duration ?? 180; // 显示时长(帧数),默认 180 帧 + this.initAllMembers(); + this.requestCanvas(); + }; + + // 自更新 + PopSprite.prototype.update = function () { + if (this._timer < this._duration) { + // 使用传入的显示时长 + this._x += this._vx; + this._y += this._vy; + this._vy += this._gravity; + if (this._y >= this._floorY) { + this._y = this._floorY; + this._vy *= -0.75; // 反弹衰减 + } + core.relocateCanvas(this._symbol, this._x, this._y); + core.setOpacity(this._symbol, 1 - this._timer / this._duration); // 根据显示时长设置透明度 + } else { + this.dispose(); + } + this._timer++; + }; + + // 申请并描绘canvas + PopSprite.prototype.requestCanvas = function () { + core.createCanvas( + this._symbol, + this._x, + this._y, + this._width + 4, + this._height + 4, + this._z + ); + + var canvas = core.getContextByName(this._symbol); + canvas.font = this._fontSize + "px " + this._font; // 动态设置字体大小 + canvas.fillStyle = this._fontColor; // 动态设置字体颜色 + canvas.strokeStyle = this._outlineColor; // 动态设置描边颜色 + canvas.strokeText(this._text, 2, this._height); + canvas.fillText(this._text, 2, this._height); + }; + + // 初始化所有成员变量 + PopSprite.prototype.initAllMembers = function () { + this._text = String(this._damage); + var uiContext = core.ui.getContextByName(this._canvasName); // 使用指定画布 + uiContext.font = this._fontSize + "px " + this._font; // 动态设置字体大小 + var textRect = uiContext.measureText(this._text); + this._width = textRect.width + 4; + this._height = this._fontSize + 4; // 动态设置高度 + this._z = uiContext.canvas.style.zIndex + ? Number(uiContext.canvas.style.zIndex) + PopSprite._count + : PopSprite._baseZOrder + PopSprite._count; + this._symbol = "popSprite" + PopSprite._count++; + this._alive = true; + this._vx = this._speedX; // 使用传入的水平速度 + this._vy = this._speedY; // 使用传入的垂直速度 + this._floorY = this._y + PopSprite._floorDis; + this._timer = 0; + }; + + // 判断是否存活 + PopSprite.prototype.isAlive = function () { + return this._alive; + }; + + // 释放 + PopSprite.prototype.dispose = function () { + this._alive = false; + core.deleteCanvas(this._symbol); + }; + }, + "编辑器显伤": function () { + // 在此增加新插件 + /////// 用户设置 /////// + // 将__enable置为false将关闭插件 + var __enable = true; + // 魔防攻速之类的属性可以在这里加 ['atk', 'def', 'mdef'] + var heroStatus = [ + "atk", + "def", + "spell", + "mdef", + "matk", + "mhp", + "speed", + "hp", + ]; + // saveHero为true 将会把每次造塔测试时的角色数据存下来 否则会读取初始属性 + // 用不着可以关了 节约缓存空间 (虽然根本没多少 还没一个存档大 + // 也可以手动清理 控制台输入core.removeLocalStorage('editorHero')即可 + var saveHero = true; + + // 下为具体实现 懒得写注释了 大概就是写HTML然后注册交互 + if (!__enable || main.mode != "editor") return; + core.plugin.initEditorDamage = false; + if (heroStatus.length >= 4 && !editor.isMobile) { + editor.dom.mid2.style.top = 650 + 30 * (heroStatus.length - 3) + "px"; + editor.dom.mid.style.height = 730 + "px"; + document.querySelector("#mid .tools").style.height = 280 + "px"; + } + editor.statusRatio = core.getLocalStorage("statusRatio", 1); + editor.saveHero = saveHero; + editor._heroStatus = heroStatus; + editor.dom.mapEdit.appendChild(core.canvas.damage.canvas); + const viewportButtons = document.getElementById("viewportButtons"); + + var HTML = + ""; + + //if (heroStatus.length >= 4 && !editor.isMobile) editor.dom.mid2.style.top = 650 + 30 * (heroStatus.length - 3) + 'px'; + heroStatus.forEach(function (status) { + var id = status + "set", + id2 = status + "add", + id3 = status + "rec", + id4 = status + "help"; + HTML += + "
" + + core.getStatusLabel(status) + + ""; + }); + document.getElementById("viewportButtons").innerHTML = HTML; + ["set", "add", "rec", "help"].forEach(function (e) { + heroStatus.forEach(function (status) { + editor.dom[status + e] = document.getElementById(status + e); + }); + }); + var _hasItem = core.items.hasItem; + core.items.hasItem = function (itemId) { + if (itemId == "book" && main.mode == "editor") return true; + return _hasItem.call(core.items, itemId); + }; + if (main.mode == "editor") { + var applyList = [ + "getDamageString", + "nextCriticals", + "getEnemyInfo", + "getEnemyValue", + ]; + applyList.forEach(function (name) { + var func = core.enemys[name]; + core.enemys[name] = function () { + var args = + arguments.length === 1 ? + [arguments[0]] : + Array.apply(null, arguments); + if (typeof args[0] == "string") args[0] = core.enemys.enemys[args[0]]; + return func.apply(core.enemys, args); + }; + }); + } + + ////// 获得勇士属性 ////// + core.control.getStatus = function (name) { + if (!core.status.hero) return null; + if (name == "x" || name == "y" || name == "direction") + return this.getHeroLoc(name); + /*if ( main.mode == 'editor' && !core.hasFlag('__statistics__')) { return data_a1e2fb4a_e986_4524_b0da_9b7ba7c0874d.firstData.hero[name]; }*/ - return core.status.hero[name]; - }; + return core.status.hero[name]; + }; - core.control.updateDamage = function (floorId, ctx) { - floorId = floorId || core.status.floorId; - if (!floorId || core.status.gameOver) return; - var onMap = ctx == null; - if (main.mode == "editor") { - ctx = core.canvas.damage; - core.updateCheckBlock(); - core.clearMap(ctx); - if (editor.uivalues.bigmap) return; - } + core.control.updateDamage = function (floorId, ctx) { + floorId = floorId || core.status.floorId; + if (!floorId || core.status.gameOver) return; + var onMap = ctx == null; + if (main.mode == "editor") { + ctx = core.canvas.damage; + core.updateCheckBlock(); + core.clearMap(ctx); + if (editor.uivalues.bigmap) return; + } - // 没有怪物手册 - if (!core.hasItem("book")) return; - core.status.damage.posX = core.bigmap.posX; - core.status.damage.posY = core.bigmap.posY; - if (!onMap) { - var width = core.floors[floorId].width, - height = core.floors[floorId].height; - // 地图过大的缩略图不绘制显伤 - if (width * height > core.bigmap.threshold) return; - } - this._updateDamage_damage(floorId, onMap); - this._updateDamage_extraDamage(floorId, onMap); - this.drawDamage(ctx); - }; + // 没有怪物手册 + if (!core.hasItem("book")) return; + core.status.damage.posX = core.bigmap.posX; + core.status.damage.posY = core.bigmap.posY; + if (!onMap) { + var width = core.floors[floorId].width, + height = core.floors[floorId].height; + // 地图过大的缩略图不绘制显伤 + if (width * height > core.bigmap.threshold) return; + } + this._updateDamage_damage(floorId, onMap); + this._updateDamage_extraDamage(floorId, onMap); + this.drawDamage(ctx); + }; - core.control.drawDamage = function (ctx) { - if ( - core.status.gameOver || - !core.status.damage /* || main.mode != 'play'*/ - ) - return; - var onMap = false; - if (ctx == null) { - ctx = core.canvas.damage; - core.clearMap("damage"); - onMap = true; - } + core.control.drawDamage = function (ctx) { + if ( + core.status.gameOver || + !core.status.damage /* || main.mode != 'play'*/ + ) + return; + var onMap = false; + if (ctx == null) { + ctx = core.canvas.damage; + core.clearMap("damage"); + onMap = true; + } - if (onMap && core.bigmap.v2) { - // 检查是否需要重算... - if ( - Math.abs(core.bigmap.posX - core.status.damage.posX) >= - core.bigmap.extend - 1 || - Math.abs(core.bigmap.posY - core.status.damage.posY) >= - core.bigmap.extend - 1 - ) { - return this.updateDamage(); - } - } - return this._drawDamage_draw(ctx, onMap); - }; + if (onMap && core.bigmap.v2) { + // 检查是否需要重算... + if ( + Math.abs(core.bigmap.posX - core.status.damage.posX) >= + core.bigmap.extend - 1 || + Math.abs(core.bigmap.posY - core.status.damage.posY) >= + core.bigmap.extend - 1 + ) { + return this.updateDamage(); + } + } + return this._drawDamage_draw(ctx, onMap); + }; - ////// 以x,y的形式返回每个点的事件 ////// - core.maps.getMapBlocksObj = function (floorId, noCache) { - floorId = floorId || core.status.floorId; - if ( - core.status.mapBlockObjs[floorId] && - !noCache && - main.mode != "editor" - ) - return core.status.mapBlockObjs[floorId]; + ////// 以x,y的形式返回每个点的事件 ////// + core.maps.getMapBlocksObj = function (floorId, noCache) { + floorId = floorId || core.status.floorId; + if ( + core.status.mapBlockObjs[floorId] && + !noCache && + main.mode != "editor" + ) + return core.status.mapBlockObjs[floorId]; - var obj = {}; - core.extractBlocks(floorId); - core.status.maps[floorId].blocks.forEach(function (block) { - obj[block.x + "," + block.y] = block; - }); - core.status.mapBlockObjs[floorId] = obj; - return obj; - }; + var obj = {}; + core.extractBlocks(floorId); + core.status.maps[floorId].blocks.forEach(function (block) { + obj[block.x + "," + block.y] = block; + }); + core.status.mapBlockObjs[floorId] = obj; + return obj; + }; - this.bignum = function (num, defaultValue) { - if (num == null || num == "") return defaultValue; - num = num + ""; - var list = { - w: 1e4, - e: 1e8, - z: 1e12, - j: 1e16, - g: 1e20, - }; - // 浮点数问题 - function checkFloat(num) { - if (!core.isset(num)) return 0; - num = num + ""; - var index = num.indexOf("."); - if (index < 0) return 0; - else return num.slice(index + 1).length; - } - var index = num.search(/w|e|z|j|g/); - if (index <= 0) { - num = parseInt(num); - if (core.isset(num)) return num; - else { - alert("不正确的输入"); - return defaultValue; - } - } - for (; index > 0; index = num.search(/w|e|z|j|g/)) { - var p = num[index], - q = list[p], - n = num.slice(0, index), - m = Math.pow(10, checkFloat(n)); - num = (n * m * q) / m + num.slice(index + 1); - } - return parseInt(num); - }; + this.bignum = function (num, defaultValue) { + if (num == null || num == "") return defaultValue; + num = num + ""; + var list = { + w: 1e4, + e: 1e8, + z: 1e12, + j: 1e16, + g: 1e20, + }; + // 浮点数问题 + function checkFloat(num) { + if (!core.isset(num)) return 0; + num = num + ""; + var index = num.indexOf("."); + if (index < 0) return 0; + else return num.slice(index + 1).length; + } + var index = num.search(/w|e|z|j|g/); + if (index <= 0) { + num = parseInt(num); + if (core.isset(num)) return num; + else { + alert("不正确的输入"); + return defaultValue; + } + } + for (; index > 0; index = num.search(/w|e|z|j|g/)) { + var p = num[index], + q = list[p], + n = num.slice(0, index), + m = Math.pow(10, checkFloat(n)); + num = (n * m * q) / m + num.slice(index + 1); + } + return parseInt(num); + }; - this.updateEditorDamage = function (noSave) { - core.updateDamage(); - heroStatus.forEach(function (status) { - editor.dom[status + "set"].value = core.status.hero[status]; - }); - if (!noSave && editor.saveHero) - core.setLocalStorage("editorHero", core.status.hero); - }; + this.updateEditorDamage = function (noSave) { + core.updateDamage(); + heroStatus.forEach(function (status) { + editor.dom[status + "set"].value = core.status.hero[status]; + }); + if (!noSave && editor.saveHero) + core.setLocalStorage("editorHero", core.status.hero); + }; - var _resizeMap = core.maps.resizeMap; - core.maps.resizeMap = function (floorId) { - _resizeMap.call(core.maps, floorId); - if (!core.plugin.initEditorDamage && main.mode == "editor") { - core.plugin.initEditorDamage = true; - var editorHero = core.getLocalStorage("editorHero"); - if (editorHero && saveHero) core.status.hero = editorHero; - else core.removeLocalStorage("editorHero"); - editor._heroStatus.forEach(function (e) { - editor.dom[e + "set"].onchange = function () { - var status = this.id.slice(0, -3); - core.status.hero[status] = core.bignum( - this.value, - core.status.hero[status] - ); - core.updateEditorDamage(); - }; - editor.dom[e + "add"].onclick = function () { - var status = this.id.slice(0, -3); - core.status.hero[status] += editor.statusRatio; - core.updateEditorDamage(); - }; - editor.dom[e + "rec"].onclick = function () { - var status = this.id.slice(0, -3); - core.status.hero[status] -= editor.statusRatio; - core.updateEditorDamage(); - }; - editor.dom[e + "help"].onclick = function () { - var status = this.id.slice(0, -4), - name = core.getStatusLabel(status); - var ratio = parseInt( - prompt( - "当前属性:" + - name + - "\n现在的点击按钮变化值:" + - editor.statusRatio + - ",请输入按下一次+/-按钮的属性变化量,可以写4w 10.2e这种字母缩写" - ) - ); - if (!core.isset(ratio)) { - printe("不合法的输入"); - return; - } - editor.statusRatio = ratio; - core.setLocalStorage("statusRatio", ratio); - }; - }); - var _updateMap = editor.updateMap; - editor.updateMap = function () { - _updateMap.call(editor); - core.updateEditorDamage(true); - }; - editor.mode.onmode = function (mode, callback) { - if (editor_mode.mode != mode) { - if (mode === "save") { - editor_mode.doActionList( - editor_mode.mode, - editor_mode.actionList, - function () { - if (callback) callback(); - core.updateEditorDamage(); - } - ); - } - if (editor_mode.mode === "nextChange" && mode) - editor_mode.showMode(mode); - if (mode !== "save") editor_mode.mode = mode; - editor_mode.actionList = []; - } - }; - } - }; - }, + var _resizeMap = core.maps.resizeMap; + core.maps.resizeMap = function (floorId) { + _resizeMap.call(core.maps, floorId); + if (!core.plugin.initEditorDamage && main.mode == "editor") { + core.plugin.initEditorDamage = true; + var editorHero = core.getLocalStorage("editorHero"); + if (editorHero && saveHero) core.status.hero = editorHero; + else core.removeLocalStorage("editorHero"); + editor._heroStatus.forEach(function (e) { + editor.dom[e + "set"].onchange = function () { + var status = this.id.slice(0, -3); + core.status.hero[status] = core.bignum( + this.value, + core.status.hero[status] + ); + if (status === "mdef" && core.status.hero[status] > 100) + core.status.hero[status] = 100; + core.updateEditorDamage(); + }; + editor.dom[e + "add"].onclick = function () { + var status = this.id.slice(0, -3); + core.status.hero[status] += editor.statusRatio; + if (status === "mdef" && core.status.hero[status] > 100) + core.status.hero[status] = 100; + core.updateEditorDamage(); + }; + editor.dom[e + "rec"].onclick = function () { + var status = this.id.slice(0, -3); + core.status.hero[status] -= editor.statusRatio; + core.updateEditorDamage(); + }; + editor.dom[e + "help"].onclick = function () { + var status = this.id.slice(0, -4), + name = core.getStatusLabel(status); + var ratio = parseInt( + prompt( + "当前属性:" + + name + + "\n现在的点击按钮变化值:" + + editor.statusRatio + + ",请输入按下一次+/-按钮的属性变化量,可以写4w 10.2e这种字母缩写" + ) + ); + if (!core.isset(ratio)) { + printe("不合法的输入"); + return; + } + editor.statusRatio = ratio; + core.setLocalStorage("statusRatio", ratio); + }; + }); + var _updateMap = editor.updateMap; + editor.updateMap = function () { + _updateMap.call(editor); + core.updateEditorDamage(true); + }; + editor.mode.onmode = function (mode, callback) { + if (editor_mode.mode != mode) { + if (mode === "save") { + editor_mode.doActionList( + editor_mode.mode, + editor_mode.actionList, + function () { + if (callback) callback(); + core.updateEditorDamage(); + } + ); + } + if (editor_mode.mode === "nextChange" && mode) + editor_mode.showMode(mode); + if (mode !== "save") editor_mode.mode = mode; + editor_mode.actionList = []; + } + }; + } + }; +}, "手册区分特殊属性": function () { - // 在此增加新插件 - this.arrsame = function (Arraya, Arrayb) { - let a = Arraya || []; - let b = Arrayb || []; - if (typeof a === "number") a = [a]; - if (typeof b === "number") b = [b]; - let c = [...a, ...b]; - for (const i of c) - if (!a.includes(i) || !b.includes(i)) { - return false; - } - return true; - }; - enemys.prototype.getCurrentEnemys = function (floorId) { - floorId = floorId || core.status.floorId; - var enemys = [], - used = {}; - core.extractBlocks(floorId); - core.status.maps[floorId].blocks.forEach(function (block) { - if (!block.disable && block.event.cls.indexOf("enemy") == 0) { - this._getCurrentEnemys_addEnemy( - block.event.id, - enemys, - used, - block.x, - block.y, - floorId - ); - } - }, this); - return this._getCurrentEnemys_sort(enemys); - }; + // 在此增加新插件 + this.arrsame = function (Arraya, Arrayb) { + let a = Arraya || []; + let b = Arrayb || []; + if (typeof a === "number") a = [a]; + if (typeof b === "number") b = [b]; + let c = [...a, ...b]; + for (const i of c) + if (!a.includes(i) || !b.includes(i)) { + return false; + } + return true; + }; + enemys.prototype.getCurrentEnemys = function (floorId) { + floorId = floorId || core.status.floorId; + var enemys = [], + used = {}; + core.extractBlocks(floorId); + core.status.maps[floorId].blocks.forEach(function (block) { + if (!block.disable && block.event.cls.indexOf("enemy") == 0) { + this._getCurrentEnemys_addEnemy( + block.event.id, + enemys, + used, + block.x, + block.y, + floorId + ); + } + }, this); + return this._getCurrentEnemys_sort(enemys); + }; - enemys.prototype._getCurrentEnemys_getEnemy = function (enemyId) { - var enemy = core.material.enemys[enemyId]; - if (!enemy) return null; + enemys.prototype._getCurrentEnemys_getEnemy = function (enemyId) { + var enemy = core.material.enemys[enemyId]; + if (!enemy) return null; - // 检查朝向;displayIdInBook - return ( - core.material.enemys[enemy.displayIdInBook] || - core.material.enemys[(enemy.faceIds || {}).down] || - enemy - ); - }; + // 检查朝向;displayIdInBook + return ( + core.material.enemys[enemy.displayIdInBook] || + core.material.enemys[(enemy.faceIds || {}).down] || + enemy + ); + }; - enemys.prototype._getCurrentEnemys_addEnemy = function ( - enemyId, - enemys, - used, - x, - y, - floorId - ) { - var enemy = this._getCurrentEnemys_getEnemy(enemyId); - if (enemy == null) return; + enemys.prototype._getCurrentEnemys_addEnemy = function ( + enemyId, + enemys, + used, + x, + y, + floorId + ) { + var enemy = this._getCurrentEnemys_getEnemy(enemyId); + if (enemy == null) return; - var id = enemy.id; + var id = enemy.id; - var enemyInfo = this.getEnemyInfo(enemy, null, null, null, floorId); - var locEnemyInfo = this.getEnemyInfo(enemy, null, x, y, floorId); - if ( - !core.flags.enableEnemyPoint || - (locEnemyInfo.atk == enemyInfo.atk && - locEnemyInfo.def == enemyInfo.def && - locEnemyInfo.hp == enemyInfo.hp && - core.plugin.arrsame(locEnemyInfo.special, enemyInfo.special)) - ) { - x = null; - y = null; - } else { - // 检查enemys里面是否使用了存在的内容 - for (var i = 0; i < enemys.length; ++i) { - var one = enemys[i]; - if ( - id == one.id && - one.locs != null && - locEnemyInfo.atk == one.atk && - locEnemyInfo.def == one.def && - locEnemyInfo.hp == one.hp && - core.plugin.arrsame(locEnemyInfo.special, one.special) - ) { - one.locs.push([x, y]); - return; - } - } - enemyInfo = locEnemyInfo; - } + var enemyInfo = this.getEnemyInfo(enemy, null, null, null, floorId); + var locEnemyInfo = this.getEnemyInfo(enemy, null, x, y, floorId); + if ( + !core.flags.enableEnemyPoint || + (locEnemyInfo.atk == enemyInfo.atk && + locEnemyInfo.def == enemyInfo.def && + locEnemyInfo.hp == enemyInfo.hp && + core.plugin.arrsame(locEnemyInfo.special, enemyInfo.special)) + ) { + x = null; + y = null; + } else { + // 检查enemys里面是否使用了存在的内容 + for (var i = 0; i < enemys.length; ++i) { + var one = enemys[i]; + if ( + id == one.id && + one.locs != null && + locEnemyInfo.atk == one.atk && + locEnemyInfo.def == one.def && + locEnemyInfo.hp == one.hp && + core.plugin.arrsame(locEnemyInfo.special, one.special) + ) { + one.locs.push([x, y]); + return; + } + } + enemyInfo = locEnemyInfo; + } - var id = enemy.id + ":" + x + ":" + y; - if (used[id]) return; - used[id] = true; + var id = enemy.id + ":" + x + ":" + y; + if (used[id]) return; + used[id] = true; - var specialText = core.enemys.getSpecialText(enemy, x, y, floorId); - var specialColor = core.enemys.getSpecialColor(enemy, x, y, floorId); + var specialText = core.enemys.getSpecialText(enemy, x, y, floorId); + var specialColor = core.enemys.getSpecialColor(enemy, x, y, floorId); - var critical = this.nextCriticals(enemy, 1, x, y, floorId); - if (critical.length > 0) critical = critical[0]; + var critical = this.nextCriticals(enemy, 1, x, y, floorId); + if (critical.length > 0) critical = critical[0]; + var criticalSpeed = core.nextCriticals_speed(enemy, 1, x, y, floorId); + if (criticalSpeed.length > 0) criticalSpeed = criticalSpeed[0]; + var criticalSpell = core.nextCriticals_spell(enemy, 1, x, y, floorId); + if (criticalSpell.length > 0) criticalSpell = criticalSpell[0]; + var e = core.clone(enemy); + for (var v in enemyInfo) { + e[v] = enemyInfo[v]; + } + if (x != null && y != null) { + e.locs = [ + [x, y] + ]; + } + e.name = core.getEnemyValue(enemy, "name", x, y, floorId); + e.specialText = specialText; + e.specialColor = specialColor; + e.damage = this.getDamage(enemy, x, y, floorId); + e.critical = critical[0]; + e.criticalDamage = critical[1]; + e.criticalAtk = [critical[0], critical[1]]; + e.criticalSpeed = criticalSpeed; + e.criticalSpell = criticalSpell; + e.defDamage = this._getCurrentEnemys_addEnemy_defDamage( + enemy, + x, + y, + floorId + ); + enemys.push(e); + }; - var e = core.clone(enemy); - for (var v in enemyInfo) { - e[v] = enemyInfo[v]; - } - if (x != null && y != null) { - e.locs = [[x, y]]; - } - e.name = core.getEnemyValue(enemy, "name", x, y, floorId); - e.specialText = specialText; - e.specialColor = specialColor; - e.damage = this.getDamage(enemy, x, y, floorId); - e.critical = critical[0]; - e.criticalDamage = critical[1]; - e.defDamage = this._getCurrentEnemys_addEnemy_defDamage( - enemy, - x, - y, - floorId - ); - enemys.push(e); - }; + enemys.prototype._getCurrentEnemys_addEnemy_defDamage = function ( + enemy, + x, + y, + floorId + ) { + var ratio = core.status.maps[floorId || core.status.floorId].ratio || 1; + return this.getDefDamage(enemy, ratio, x, y, floorId); + }; - enemys.prototype._getCurrentEnemys_addEnemy_defDamage = function ( - enemy, - x, - y, - floorId - ) { - var ratio = core.status.maps[floorId || core.status.floorId].ratio || 1; - return this.getDefDamage(enemy, ratio, x, y, floorId); - }; + enemys.prototype._getCurrentEnemys_sort = function (enemys) { + return enemys.sort(function (a, b) { + if (a.damage == b.damage) { + return a.money - b.money; + } + if (a.damage == null) { + return 1; + } + if (b.damage == null) { + return -1; + } + return a.damage - b.damage; + }); + }; - enemys.prototype._getCurrentEnemys_sort = function (enemys) { - return enemys.sort(function (a, b) { - if (a.damage == b.damage) { - return a.money - b.money; - } - if (a.damage == null) { - return 1; - } - if (b.damage == null) { - return -1; - } - return a.damage - b.damage; - }); - }; + ////// 获得所有特殊属性的名称 ////// + enemys.prototype.getSpecialText = function (enemy, x, y, floorId) { + if (typeof enemy == "string") + enemy = this.getEnemyInfo(enemy, null, x, y, floorId); + if (!enemy) return []; + var special = enemy.special; + var text = []; - ////// 获得所有特殊属性的名称 ////// - enemys.prototype.getSpecialText = function (enemy, x, y, floorId) { - if (typeof enemy == "string") - enemy = this.getEnemyInfo(enemy, null, x, y, floorId); - if (!enemy) return []; - var special = enemy.special; - var text = []; + var specials = this.getSpecials(); + if (specials) { + for (var i = 0; i < specials.length; i++) { + if (this.hasSpecial(special, specials[i][0])) + text.push(this._calSpecialContent(enemy, specials[i][1])); + } + } + return text; + }; - var specials = this.getSpecials(); - if (specials) { - for (var i = 0; i < specials.length; i++) { - if (this.hasSpecial(special, specials[i][0])) - text.push(this._calSpecialContent(enemy, specials[i][1])); - } - } - return text; - }; + ////// 获得所有特殊属性的颜色 ////// + enemys.prototype.getSpecialColor = function (enemy, x, y, floorId) { + if (typeof enemy == "string") + enemy = this.getEnemyInfo(enemy, null, x, y, floorId); + if (!enemy) return []; + var special = enemy.special; + var colors = []; - ////// 获得所有特殊属性的颜色 ////// - enemys.prototype.getSpecialColor = function (enemy, x, y, floorId) { - if (typeof enemy == "string") - enemy = this.getEnemyInfo(enemy, null, x, y, floorId); - if (!enemy) return []; - var special = enemy.special; - var colors = []; + var specials = this.getSpecials(); + if (specials) { + for (var i = 0; i < specials.length; i++) { + if (this.hasSpecial(special, specials[i][0])) + colors.push(specials[i][3] || null); + } + } + return colors; + }; - var specials = this.getSpecials(); - if (specials) { - for (var i = 0; i < specials.length; i++) { - if (this.hasSpecial(special, specials[i][0])) - colors.push(specials[i][3] || null); - } - } - return colors; - }; + ////// 获得所有特殊属性的额外标记 ////// + enemys.prototype.getSpecialFlag = function (enemy, x, y, floorId) { + if (typeof enemy == "string") + enemy = getEnemyInfo(enemy, null, x, y, floorId); + if (!enemy) return []; + var special = enemy.special; + var flag = 0; - ////// 获得所有特殊属性的额外标记 ////// - enemys.prototype.getSpecialFlag = function (enemy, x, y, floorId) { - if (typeof enemy == "string") - enemy = getEnemyInfo(enemy, null, x, y, floorId); - if (!enemy) return []; - var special = enemy.special; - var flag = 0; + var specials = this.getSpecials(); + if (specials) { + for (var i = 0; i < specials.length; i++) { + if (this.hasSpecial(special, specials[i][0])) + flag |= specials[i][4] || 0; + } + } + return flag; + }; - var specials = this.getSpecials(); - if (specials) { - for (var i = 0; i < specials.length; i++) { - if (this.hasSpecial(special, specials[i][0])) - flag |= specials[i][4] || 0; - } - } - return flag; - }; + ////// 获得每个特殊属性的说明 ////// + enemys.prototype.getSpecialHint = function (enemy, special) { + var specials = this.getSpecials(); + if (special == null) { + if (specials == null) return []; + var hints = []; + for (var i = 0; i < specials.length; i++) { + if (this.hasSpecial(enemy, specials[i][0])) + hints.push( + "\r[" + + core.arrayToRGBA(specials[i][3] || "#FF6A6A") + + "]\\d" + + this._calSpecialContent(enemy, specials[i][1]) + + ":\\d\r[]" + + this._calSpecialContent(enemy, specials[i][2]) + ); + } + return hints; + } - ////// 获得每个特殊属性的说明 ////// - enemys.prototype.getSpecialHint = function (enemy, special) { - var specials = this.getSpecials(); - if (special == null) { - if (specials == null) return []; - var hints = []; - for (var i = 0; i < specials.length; i++) { - if (this.hasSpecial(enemy, specials[i][0])) - hints.push( - "\r[" + - core.arrayToRGBA(specials[i][3] || "#FF6A6A") + - "]\\d" + - this._calSpecialContent(enemy, specials[i][1]) + - ":\\d\r[]" + - this._calSpecialContent(enemy, specials[i][2]) - ); - } - return hints; - } - - if (specials == null) return ""; - for (var i = 0; i < specials.length; i++) { - if (special == specials[i][0]) - return ( - "\r[#FF6A6A]\\d" + - this._calSpecialContent(enemy, specials[i][1]) + - ":\\d\r[]" + - this._calSpecialContent(enemy, specials[i][2]) - ); - } - return ""; - }; - ui.prototype._drawBook_drawName = function ( - index, - enemy, - top, - left, - width - ) { - // 绘制第零列(名称和特殊属性) - // 如果需要添加自己的比如怪物的称号等,也可以在这里绘制 - core.setTextAlign("ui", "center"); - if (core.enemys.getSpecialText(enemy).length == 0) { - core.fillText( - "ui", - enemy.name, - left + width / 2, - top + 35, - "#DDDDDD", - this._buildFont(17, true), - width - ); - } else { - core.fillText( - "ui", - enemy.name, - left + width / 2, - top + 28, - "#DDDDDD", - this._buildFont(17, true), - width - ); - switch (core.enemys.getSpecialText(enemy).length) { - case 1: - core.fillText( - "ui", - core.enemys.getSpecialText(enemy)[0], - left + width / 2, - top + 50, - core.arrayToRGBA( - (core.enemys.getSpecialColor(enemy) || [])[0] || "#FF6A6A" - ), - this._buildFont(15, true), - width - ); - break; - case 2: - // Step 1: 计算字体 - var text = - core.enemys.getSpecialText(enemy)[0] + - " " + - core.enemys.getSpecialText(enemy)[1]; - core.setFontForMaxWidth( - "ui", - text, - width, - this._buildFont(15, true) - ); - // Step 2: 计算总宽度 - var totalWidth = core.calWidth("ui", text); - var leftWidth = core.calWidth( - "ui", - core.enemys.getSpecialText(enemy)[0] - ); - var rightWidth = core.calWidth( - "ui", - core.enemys.getSpecialText(enemy)[1] - ); - // Step 3: 绘制 - core.fillText( - "ui", - core.enemys.getSpecialText(enemy)[0], - left + (width + leftWidth - totalWidth) / 2, - top + 50, - core.arrayToRGBA( - (core.enemys.getSpecialColor(enemy) || [])[0] || "#FF6A6A" - ) - ); - core.fillText( - "ui", - core.enemys.getSpecialText(enemy)[1], - left + (width + totalWidth - rightWidth) / 2, - top + 50, - core.arrayToRGBA( - (core.enemys.getSpecialColor(enemy) || [])[1] || "#FF6A6A" - ) - ); - break; - default: - core.fillText( - "ui", - "多属性...", - left + width / 2, - top + 50, - "#FF6A6A", - this._buildFont(15, true), - width - ); - } - } - }; - ui.prototype._drawBookDetail_getInfo = function (index) { - var floorId = - core.floorIds[(core.status.event.ui || {}).index] || - core.status.floorId; - // 清除浏览地图时的光环缓存 - if (floorId != core.status.floorId && core.status.checkBlock) { - core.status.checkBlock.cache = {}; - } - var enemys = core.enemys.getCurrentEnemys(floorId); - console.log(123); - if (enemys.length == 0) return []; - index = core.clamp(index, 0, enemys.length - 1); - var enemy = enemys[index]; - var texts = core.enemys.getSpecialHint(enemy); - if (texts.length == 0) texts.push("该怪物无特殊属性。"); - if (enemy.description) texts.push(enemy.description + "\r"); - this._drawBookDetail_getTexts(enemy, floorId, texts); - texts.push(""); - return [enemy, texts]; - }; - }, + if (specials == null) return ""; + for (var i = 0; i < specials.length; i++) { + if (special == specials[i][0]) + return ( + "\r[#FF6A6A]\\d" + + this._calSpecialContent(enemy, specials[i][1]) + + ":\\d\r[]" + + this._calSpecialContent(enemy, specials[i][2]) + ); + } + return ""; + }; + ui.prototype._drawBook_drawName = function ( + index, + enemy, + top, + left, + width + ) { + // 绘制第零列(名称和特殊属性) + // 如果需要添加自己的比如怪物的称号等,也可以在这里绘制 + core.setTextAlign("ui", "center"); + if (core.enemys.getSpecialText(enemy).length == 0) { + core.fillText( + "ui", + enemy.name, + left + width / 2, + top + 35, + "#DDDDDD", + this._buildFont(17, true), + width + ); + } else { + core.fillText( + "ui", + enemy.name, + left + width / 2, + top + 28, + "#DDDDDD", + this._buildFont(17, true), + width + ); + switch (core.enemys.getSpecialText(enemy).length) { + case 1: + core.fillText( + "ui", + core.enemys.getSpecialText(enemy)[0], + left + width / 2, + top + 50, + core.arrayToRGBA( + (core.enemys.getSpecialColor(enemy) || [])[0] || "#FF6A6A" + ), + this._buildFont(15, true), + width + ); + break; + case 2: + // Step 1: 计算字体 + var text = + core.enemys.getSpecialText(enemy)[0] + + " " + + core.enemys.getSpecialText(enemy)[1]; + core.setFontForMaxWidth( + "ui", + text, + width, + this._buildFont(15, true) + ); + // Step 2: 计算总宽度 + var totalWidth = core.calWidth("ui", text); + var leftWidth = core.calWidth( + "ui", + core.enemys.getSpecialText(enemy)[0] + ); + var rightWidth = core.calWidth( + "ui", + core.enemys.getSpecialText(enemy)[1] + ); + // Step 3: 绘制 + core.fillText( + "ui", + core.enemys.getSpecialText(enemy)[0], + left + (width + leftWidth - totalWidth) / 2, + top + 50, + core.arrayToRGBA( + (core.enemys.getSpecialColor(enemy) || [])[0] || "#FF6A6A" + ) + ); + core.fillText( + "ui", + core.enemys.getSpecialText(enemy)[1], + left + (width + totalWidth - rightWidth) / 2, + top + 50, + core.arrayToRGBA( + (core.enemys.getSpecialColor(enemy) || [])[1] || "#FF6A6A" + ) + ); + break; + default: + core.fillText( + "ui", + "多属性...", + left + width / 2, + top + 50, + "#FF6A6A", + this._buildFont(15, true), + width + ); + } + } + }; + ui.prototype._drawBookDetail_getInfo = function (index) { + var floorId = + core.floorIds[(core.status.event.ui || {}).index] || + core.status.floorId; + // 清除浏览地图时的光环缓存 + if (floorId != core.status.floorId && core.status.checkBlock) { + core.status.checkBlock.cache = {}; + } + var enemys = core.enemys.getCurrentEnemys(floorId); + console.log(123); + if (enemys.length == 0) return []; + index = core.clamp(index, 0, enemys.length - 1); + var enemy = enemys[index]; + var texts = core.enemys.getSpecialHint(enemy); + if (texts.length == 0) texts.push("该怪物无特殊属性。"); + if (enemy.description) texts.push(enemy.description + "\r"); + this._drawBookDetail_getTexts(enemy, floorId, texts); + texts.push(""); + return [enemy, texts]; + }; +}, "一防减伤": function () { - // 在此增加新插件 - ui.prototype._drawBook_drawRow3 = function ( - index, - enemy, - top, - left, - width, - position - ) { - // 绘制第三行 - core.setTextAlign("ui", "left"); - var b13 = this._buildFont(13, true), - f13 = this._buildFont(13, false); - var col1 = left, - col2 = left + (width * 9) / 25, - col3 = left + (width * 17) / 25; - core.fillText("ui", "临界", col1, position, "#DDDDDD", f13); - core.fillText( - "ui", - core.formatBigNumber(enemy.critical || 0), - col1 + 30, - position, - null, - b13 - ); - core.fillText("ui", "减伤", col2, position, null, f13); - core.fillText( - "ui", - core.formatBigNumber(enemy.criticalDamage || 0), - col2 + 30, - position, - null, - b13 - ); - //core.fillText('ui', '加防', col3, position, null, f13); - core.fillText("ui", "1防", col3, position, null, f13); - core.fillText( - "ui", - core.formatBigNumber(enemy.defDamage || 0), - col3 + 30, - position, - null, - b13 - ); - }; - ////// 1防减伤计算 ////// - enemys.prototype.getDefDamage = function (enemy, k, x, y, floorId) { - if (typeof enemy == "string") enemy = core.material.enemys[enemy]; - k = k || 1; - var nowDamage = this._getDamage(enemy, null, x, y, floorId); - var nextDamage = this._getDamage( - enemy, - { def: core.status.hero.def + k }, - x, - y, - floorId - ); - if (nowDamage == null || nextDamage == null) return "???"; - return nowDamage - nextDamage; - }; - //防御倍数 - enemys.prototype._getCurrentEnemys_addEnemy_defDamage = function ( - enemy, - x, - y, - floorId - ) { - var ratio = core.status.maps[floorId || core.status.floorId].ratio || 1; - //第一行为按照ratio值计算减防,第二行为1防减伤 - //return this.getDefDamage(enemy, ratio, x, y, floorId); - return this.getDefDamage(enemy, null, x, y, floorId); - }; - }, + // 在此增加新插件 + // + + ui.prototype._drawBook_drawRow3 = function ( + index, + enemy, + top, + left, + width, + position + ) { + // 绘制第三行 + core.setTextAlign("ui", "left"); + var b13 = this._buildFont(13, true), + f13 = this._buildFont(13, false); + var col1 = left, + col2 = left + (width * 9) / 25, + col3 = left + (width * 17) / 25; + core.fillText('ui', '攻击临界', col1 - 50, position, '#DDDDDD', f13); + core.fillText('ui', `[${core.formatBigNumber(enemy.criticalAtk?.[0] || 0)},${core.formatBigNumber(enemy.criticalAtk?.[1] || 0)}]`, col1 + 10, position, null, b13); + core.fillText('ui', '法强临界', col2 - 33, position, null, f13); + core.fillText('ui', `[${core.formatBigNumber(enemy.criticalSpell[0] || 0)},${core.formatBigNumber(enemy.criticalSpell?.[1] || 0)}]`, col2 + 27, position, null, b13); + //core.fillText('ui', '加防', col3, position, null, f13); + core.fillText("ui", "1防", col3, position, null, f13); + core.fillText( + "ui", + core.formatBigNumber(enemy.defDamage || 0), + col3 + 30, + position, + null, + b13 + ); + }; + ////// 1防减伤计算 ////// + enemys.prototype.getDefDamage = function (enemy, k, x, y, floorId) { + if (typeof enemy == "string") enemy = core.material.enemys[enemy]; + k = k || 1; + var nowDamage = this._getDamage(enemy, null, x, y, floorId); + var nextDamage = this._getDamage( + enemy, { def: core.status.hero.def + k }, + x, + y, + floorId + ); + if (nowDamage == null || nextDamage == null) return "???"; + return nowDamage - nextDamage; + }; + //防御倍数 + enemys.prototype._getCurrentEnemys_addEnemy_defDamage = function ( + enemy, + x, + y, + floorId + ) { + var ratio = core.status.maps[floorId || core.status.floorId].ratio || 1; + //第一行为按照ratio值计算减防,第二行为1防减伤 + //return this.getDefDamage(enemy, ratio, x, y, floorId); + return this.getDefDamage(enemy, null, x, y, floorId); + }; +}, "新道具栏/装备栏": function () { - // 在此增加新插件 + // 这个插件有点离谱 个人觉得参数过多只会降低可读性,还不如硬编码 + // 注:///// *** 裹起来的区域: 该区域内参数可以随意更改调整ui绘制 不会影响总体布局 // 请尽量修改该区域而不是其他区域 修改的时候最好可以对照现有ui修改 @@ -5194,7 +5621,7 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 = ///// *** // 背景设置 - this.drawBoxBackground = function (ctx) { + function drawBoxBackground(ctx) { core.setTextAlign(ctx, "left"); core.clearMap(ctx); core.deleteCanvas("_selector"); @@ -5276,7 +5703,7 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 = var arrow_width = 20; var arrow_style = "white"; // 暂时只能是1 否则不太行 等待新样板(2.7.3)之后对drawArrow做优化 - var arrow_lineWidth = 1; + var arrow_lineWidth = 2; // 右箭头 var rightArrow_right = leftbar_right - 10; // 道具内栏顶部坐标 本质是通过该项 控制(道具栏顶部文字和箭头)与道具内栏顶部的间隔 @@ -5337,7 +5764,7 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 = var bottomSpace = 8; ///// *** - core.drawItemListbox_setPageBtn( + drawItemListbox_setPageBtn( ctx, pageBtn_left, pageBtn_right, @@ -5349,7 +5776,7 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 = var page = info.page || 1; var pageFontSize = pageBtn_radius * 2 - 4; var pageFont = core.ui._buildFont(pageFontSize); - core.setPageItems(page); + setPageItems(page); var num = itemNum; if (core.status.event.id == "equipbox") num -= 5; var maxPage = info.maxPage; @@ -5364,7 +5791,7 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 = pageText_color, pageFont ); - core.addUIEventListener( + addUIEventListener( start_x, start_y, leftbar_right - start_x, @@ -5393,9 +5820,9 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 = oneItemHeight: oneItemHeight, }, }; - }; + } - this.drawItemListbox = function (ctx, obj) { + function drawItemListbox(ctx, obj) { ctx = ctx || core.canvas.ui; var itembar_x = obj.x, itembar_y = obj.y, @@ -5437,7 +5864,7 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 = itembar_style ); core.setAlpha(ctx, 1); - var pageItems = core.setPageItems(page); + var pageItems = setPageItems(page); var marginHeight = itembar_marginHeightRatio * oneItemHeight; core.setTextBaseline(ctx, "middle"); var originColor = itemName_color; @@ -5446,7 +5873,7 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 = var item = pageItems[i]; // 设置某个的字体颜色的一个例子 // if (item.id == "xxx") itemName_color = "green"; - core.drawItemListbox_drawItem( + drawItemListbox_drawItem( ctx, item_x, item_right, @@ -5467,9 +5894,9 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 = ); item_y += oneItemHeight; } - }; + } - this.drawToolboxRightbar = function (ctx, obj) { + function drawToolboxRightbar(ctx, obj) { ctx = ctx || core.canvas.ui; var info = core.status.thisUIEventInfo || {}; var page = info.page || 1, @@ -5546,7 +5973,6 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 = cls: "equips", name: "未知装备", text: "一无所有,又何尝不是一种装备", - equipCls: "无", equip: { type: "装备", }, @@ -5560,9 +5986,7 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 = itemName = item.name, itemText = item.text; itemText = core.replaceText(itemText); - if (itemText[0] == "," || itemText[0] == ",") - itemText = itemText.substring(1); - + if (!itemText) itemText = "该道具无描述。"; /* 一个根据道具id修改道具名字(右栏)的例子 * if (item.id == "xxx") itemNameColor = "red"; */ @@ -5620,6 +6044,11 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 = var compare2; if (item.equipCls === "双手剑") compare2 = core.compareEquipment(null, core.getEquip(1)); + if ( + item.equipCls === "盾牌" && + core.material.items[core.getEquip(0)]?.equipCls === "双手剑" + ) + compare2 = core.compareEquipment(null, core.getEquip(0)); if (info.select.action == "unload") compare = core.compareEquipment(null, item.id); // --- 变化值... @@ -5636,10 +6065,27 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 = (compare2?.percentage[name] || 0))) / 100 ); + if (name === "mdef") { + var nowValue = core.getRealStatus(name); + var newValue = Math.round( + (core.getStatus(name) - + (compare.value[name] || 0) - + (compare2?.value[name] || 0)) * + (1 - + (1 - core.getBuff(name)) * + (compare.percentage[name] || 1) * + (compare2?.percentage[name] || 1)) + ); + } if (nowValue == newValue) continue; var color = newValue > nowValue ? "#00FF00" : "#FF0000"; nowValue = core.formatBigNumber(nowValue); newValue = core.formatBigNumber(newValue); + + if (name === "mdef") { + nowValue += "%"; + newValue += "%"; + } statusText += core.getStatusLabel(name) + " " + @@ -5689,9 +6135,9 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 = ///// *** // 获取圆心位置 - var btn_x = btnRight - btnRadius - btnBorderWidth / 2, - btn_y = btnBottom - btnRadius - btnBorderWidth / 2; - core.drawToolbox_setExitBtn( + var btn_x = btnRight - btnRadius - btnBorderWidth / 2; + btn_y = btnBottom - btnRadius - btnBorderWidth / 2; + drawToolbox_setExitBtn( ctx, btn_x, btn_y, @@ -5703,14 +6149,16 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 = ///// *** 使用按钮设置 var useBtnHeight = btnRadius * 2; // 这里不设置useBtnWidth而是根据各项数据自动得出width - var useBtnRadius = useBtnHeight / 2; + var useBtnRadius = useBtnHeight / 4; var useBtn_x = rightbar_x + 4, useBtn_y = btnBottom - useBtnHeight; var useBtnBorderStyle = "#fff"; var useBtnBorderWidth = btnBorderWidth; + const batchUseBtn_x = useBtn_x + 50; // 个人觉得,搞这么多参数还不如硬编码 + const hideBtn_y = useBtn_y - useBtnHeight - 8; ///// *** - core.drawToolbox_setUseBtn( + drawToolbox_setUseBtn( ctx, useBtn_x, useBtn_y, @@ -5719,9 +6167,36 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 = useBtnBorderStyle, useBtnBorderWidth ); - }; + if (core.status.event.id === "toolbox") { + drawToolbox_setBatchUseBtn( + ctx, + batchUseBtn_x, + useBtn_y, + useBtnRadius, + useBtnHeight, + useBtnBorderStyle, + useBtnBorderWidth + ); + } + drawToolbox_setHideBtn( + ctx, + useBtn_x, + hideBtn_y, + useBtnRadius, + useBtnHeight, + useBtnBorderStyle, + useBtnBorderWidth + ); + drawToolbox_setShowHideBtn( + ctx, + rightbar_x, + useBtn_y, + useBtnHeight, + useBtnBorderStyle + ); + } - this.drawEquipbox_drawOthers = function (ctx, obj) { + function drawEquipbox_drawOthers(ctx, obj) { var info = core.status.thisUIEventInfo; ///// *** 装备格设置 @@ -5788,7 +6263,7 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 = var borderStyle = selectBorder ? box_selectBorderStyle : box_borderStyle; - core.drawEquipbox_drawOne( + drawEquipbox_drawOne( ctx, name, id, @@ -5805,7 +6280,7 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 = var todo = new Function( "core.clickOneEquipbox('" + id + "'," + i + ")" ); - core.addUIEventListener( + addUIEventListener( box_x - box_borderWidth / 2, box_y - box_borderWidth / 2, oneBoxWidth, @@ -5880,7 +6355,7 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 = var borderStyle = selectBorder ? box_selectBorderStyle : box_borderStyle; - core.drawEquipbox_drawOne( + drawEquipbox_drawOne( ctx, name, id, @@ -5897,7 +6372,7 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 = var todo = new Function( "core.clickOneEquipbox('" + id + "'," + i + ")" ); - core.addUIEventListener( + addUIEventListener( box_x - box_borderWidth / 2, box_y - box_borderWidth / 2, oneBoxWidth, @@ -5906,16 +6381,16 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 = ); box_x += space_x + oneBoxWidth; } - }; + } this.drawToolbox = function (ctx) { ctx = ctx || core.canvas.ui; core.status.thisEventClickArea = []; - var info = core.drawBoxBackground(ctx); + var info = drawBoxBackground(ctx); info.itemNum = itemNum; - core.drawItemListbox(ctx, info.obj); - core.drawToolboxRightbar(ctx, info); + drawItemListbox(ctx, info.obj); + drawToolboxRightbar(ctx, info); core.setTextBaseline(ctx, "alphabetic"); core.setTextAlign("left"); }; @@ -5924,18 +6399,18 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 = this.drawEquipbox = function (ctx) { ctx = ctx || core.canvas.ui; core.status.thisEventClickArea = []; - var info = core.drawBoxBackground(ctx); + var info = drawBoxBackground(ctx); info.itemNum = itemNum - reduceItem; info.obj.y += info.obj.oneItemHeight * reduceItem; info.obj.height -= info.obj.oneItemHeight * reduceItem; - core.drawItemListbox(ctx, info.obj); - core.drawEquipbox_drawOthers(ctx, info); - core.drawToolboxRightbar(ctx, info); + drawItemListbox(ctx, info.obj); + drawEquipbox_drawOthers(ctx, info); + drawToolboxRightbar(ctx, info); core.setTextBaseline(ctx, "alphabetic"); core.setTextAlign("left"); }; - this.drawEquipbox_drawOne = function ( + function drawEquipbox_drawOne( ctx, name, id, @@ -5972,11 +6447,14 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 = var tx = (x + x + lineWidth / 2 + width) / 2, ty = y + height + (lineWidth / 2) * 3 + space; core.fillText(ctx, name, tx, ty, color, font); + + core.setAlpha(ctx, 1); + core.setTextBaseline(ctx, "alphabetic"); core.setTextAlign("left"); - }; + } - this.drawItemListbox_drawItem = function ( + function drawItemListbox_drawItem( ctx, left, right, @@ -6003,6 +6481,14 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 = style, core.ui._buildFont(fontSize) ); + + const hideInfo = core.getFlag("hideInfo", {}); + if ( + item && + (hideInfo.hasOwnProperty(id) ? hideInfo[id] : item.hideInToolbox) + ) + core.setAlpha(ctx, 0.5); + if (name != "???") core.drawIcon( ctx, @@ -6024,18 +6510,21 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 = core.ui._buildFont(fontSize), maxWidth ); - var todo = new Function("core.clickItemFunc('" + id + "');"); - core.addUIEventListener(left, top, right - left, height, todo); - }; + core.setAlpha(ctx, 1); - this.setPageItems = function (page) { + var todo = new Function("core.clickItemFunc('" + id + "');"); + addUIEventListener(left, top, right - left, height, todo); + } + + function setPageItems(page) { var num = itemNum; if (core.status.event.id == "equipbox") num -= reduceItem; var info = core.status.thisUIEventInfo; if (!info) return; page = page || info.page; var items = core.getToolboxItems( - core.status.event.id == "toolbox" ? "all" : "equips" + core.status.event.id == "toolbox" ? "all" : "equips", + core.getFlag("showHideItem", false) ); info.allItems = items; var maxPage = Math.ceil(items.length / num); @@ -6046,12 +6535,12 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 = if (items.length == 0 && pageItems.length == 0) info.index = null; if (pageItems.length == 0 && info.page > 1) { info.page = Math.max(1, info.page - 1); - return core.setPageItems(info.page); + return setPageItems(info.page); } return pageItems; - }; + } - this.drawToolbox_setExitBtn = function (ctx, x, y, r, style, lineWidth) { + function drawToolbox_setExitBtn(ctx, x, y, r, style, lineWidth) { core.strokeCircle(ctx, x, y, r, style, lineWidth); ctx.textAlign = "center"; ctx.textBaseline = "middle"; @@ -6071,10 +6560,10 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 = var todo = function () { core.closePanel(); }; - core.addUIEventListener(x - r, y - r, r * 2, r * 2, todo); - }; + addUIEventListener(x - r, y - r, r * 2, r * 2, todo); + } - this.drawToolbox_setUseBtn = function (ctx, x, y, r, h, style, lineWidth) { + function drawToolbox_setUseBtn(ctx, x, y, r, h, style, lineWidth) { core.setTextAlign(ctx, "left"); core.setTextBaseline(ctx, "top"); var fontSize = h - 4; @@ -6089,10 +6578,182 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 = var todo = function () { core.useSelectItemInBox(); }; - core.addUIEventListener(x, y, w, h, todo); + addUIEventListener(x, y, w, h, todo); + } + + function getSelectedItem() { + var info = core.status.thisUIEventInfo; + if ( + !( + info && + info.select.id && + ["toolbox", "equipbox"].includes(core.status.event.id) + ) + ) { + core.drawFailTip("发生了未知错误!"); + return; + } + return info.select.id; + } + + function batchUse(item, count) { + try { + const itemCount = core.itemCount(item); + if (count > itemCount) count = itemCount; + core.closePanel(); + for (let i = 0; i < count; i++) { + if (core.canUseItem(item)) core.useItem(item); + else return; + } + } catch (e) { + console.error(e); + core.drawFailTip("批量使用时出现未知错误!"); + } + } + + function drawToolbox_setBatchUseBtn(ctx, x, y, r, h, style, lineWidth) { + try { + const selectedItem = getSelectedItem(); + let canBatchUse = eval(core.material.items[selectedItem]?.canBatchUse); + if (!canBatchUse) return; + } catch (error) { + console.error(error); + return; + } + core.setTextAlign(ctx, "left"); + core.setTextBaseline(ctx, "top"); + var fontSize = h - 4; + var font = core.ui._buildFont(fontSize); + var text = "批量使用"; + var w = core.calWidth(ctx, text, font) + 2 * r + lineWidth / 2; + + core.strokeRoundRect(ctx, x, y, w, h, r, style, lineWidth); + core.fillText(ctx, text, x + r, y + lineWidth / 2 + 2, style, font); + + var todo = function () { + core.utils.myprompt("输入要使用该物品的次数(0~99)。", null, (value) => { + value = parseInt(value); + const id = getSelectedItem(); + + if (Number.isNaN(value) || value < 0 || value > 99) { + core.drawFailTip("输入不合法!"); + return; + } + if (!core.canUseItem(id)) { + core.drawFailTip("当前无法使用该道具!"); + return; + } + core.closePanel(); + batchUse(id, value); + }); + }; + addUIEventListener(x, y, w, h, todo); + } + + function drawToolbox_setHideBtn(ctx, x, y, r, h, style, lineWidth) { + core.setTextAlign(ctx, "left"); + core.setTextBaseline(ctx, "top"); + var fontSize = h - 4; + var font = core.ui._buildFont(fontSize); + var text = "显示/隐藏"; + var w = core.calWidth(ctx, text, font) + 2 * r + lineWidth / 2; + + core.strokeRoundRect(ctx, x, y, w, h, r, style, lineWidth); + core.fillText(ctx, text, x + r, y + lineWidth / 2 + 2, style, font); + + var todo = function () { + //debugger; + var id = getSelectedItem(); + let hideInfo = core.getFlag("hideInfo", {}); + console.log(id); + if (hideInfo.hasOwnProperty(id)) { + hideInfo[id] = !hideInfo[id]; + core.setFlag("hideInfo", hideInfo); + } else { + hideInfo[id] = !core.material.items[id].hideInToolbox; + core.setFlag("hideInfo", hideInfo); + } + if (core.status.event.id === "toolbox") core.plugin.drawToolbox(); + else if (core.status.event.id === "equipbox") + core.plugin.drawEquipbox(); + }; + addUIEventListener(x, y, w, h, todo); + } + + ui.prototype.getToolboxItems = function (cls, showHide) { + let list = Object.keys(core.status.hero.items[cls] || {}); + if (cls === "all") { + for (let name in core.status.hero.items) { + if (name == "equips") continue; + list = list.concat(Object.keys(core.status.hero.items[name])); + } + if (!showHide) + list = list.filter(function (id2) { + const hideInfo = core.getFlag("hideInfo", {}); + if (hideInfo.hasOwnProperty(id2)) return !hideInfo[id2]; + else return !core.material.items[id2].hideInToolbox; + }); + list = list.sort(); + return list; + } + if (cls === "equips") { + if (!showHide) + list = list.filter(function (id2) { + const hideInfo = core.getFlag("hideInfo", {}); + if (hideInfo.hasOwnProperty(id2)) return !hideInfo[id2]; + else return !core.material.items[id2].hideInToolbox; + }); + + list = list.sort(); + return list; + } + if (this.uidata.getToolboxItems) { + return this.uidata.getToolboxItems(cls, showHide); + } + if (!showHide) + list = list.filter(function (id2) { + return !core.material.items[id2].hideInToolbox; + }); + list = list.sort(); + return list; }; - this.drawItemListbox_setPageBtn = function ( + function drawToolbox_setShowHideBtn(ctx, x, y, h, style) { + core.setTextAlign(ctx, "left"); + core.setTextBaseline(ctx, "top"); + var fontSize = h - 6; + var font = core.ui._buildFont(fontSize); + var text = "显示隐藏"; + var w = core.calWidth(ctx, text, font); + h += 4; + const squareSize = h - 6; + + x -= w + squareSize + 26; + + const border = 2; + core.fillRect(ctx, x, y, squareSize, squareSize, " #F5F5F5"); + if (core.hasFlag("showHideItem")) { + core.fillRect( + ctx, + x + border, + y + border, + squareSize - 2 * border, + squareSize - 2 * border, + "lime" + ); + } + core.fillText(ctx, text, x + squareSize + 2, y + 4, style, font); + + var todo = function () { + core.setFlag("showHideItem", !core.getFlag("showHideItem", false)); + if (core.status.event.id === "toolbox") core.plugin.drawToolbox(); + else if (core.status.event.id === "equipbox") + core.plugin.drawEquipbox(); + }; + addUIEventListener(x, y, w, h, todo); + } + + function drawItemListbox_setPageBtn( ctx, left, right, @@ -6119,7 +6780,7 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 = var todo = function () { core.addItemListboxPage(-1); }; - core.addUIEventListener(x - r - 2, y - r - 2, r * 2 + 4, r * 2 + 4, todo); + addUIEventListener(x - r - 2, y - r - 2, r * 2 + 4, r * 2 + 4, todo); x = right - offset; core.fillPolygon( @@ -6135,8 +6796,8 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 = var todo = function () { core.addItemListboxPage(1); }; - core.addUIEventListener(x - r - 2, y - r - 2, r * 2 + 4, r * 2 + 4, todo); - }; + addUIEventListener(x - r - 2, y - r - 2, r * 2 + 4, r * 2 + 4, todo); + } this.clickItemFunc = function (id) { var info = core.status.thisUIEventInfo; @@ -6145,7 +6806,7 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 = info.select = {}; info.select.id = id; core.setIndexAndSelect("index"); - core.refreshBox(); + refreshBox(); }; this.clickOneEquipbox = function (id, type) { @@ -6159,31 +6820,7 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 = type: type, action: "unload", }; - return core.refreshBox(); - }; - - core.ui.getToolboxItems = function (cls) { - var list = Object.keys(core.status.hero.items[cls] || {}); - if (cls == "all") { - for (var name in core.status.hero.items) { - if (name == "equips") continue; - list = list.concat(Object.keys(core.status.hero.items[name])); - } - return list - .filter(function (id) { - return !core.material.items[id].hideInToolbox; - }) - .sort(); - } - - if (this.uidata.getToolboxItems) { - return this.uidata.getToolboxItems(cls); - } - return list - .filter(function (id) { - return !core.material.items[id].hideInToolbox; - }) - .sort(); + return refreshBox(); }; this.useSelectItemInBox = function () { @@ -6210,6 +6847,14 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 = core.status.route.push("unEquip:" + 1); }); } + if ( + equipCls0 === "双手剑" && + !(equipClsid === "饰品" || equipClsid === "护具") + ) { + core.unloadEquip(0, function () { + core.status.route.push("unEquip:" + 0); + }); + } core.loadEquip(id, function () { core.status.route.push("equip:" + id); info.select.type = type; @@ -6221,7 +6866,7 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 = core.unloadEquip(type, function () { core.status.route.push("unEquip:" + type); info.select.type = type; - //info.select.action = 'load' + info.select.action = "load"; core.setIndexAndSelect("select"); core.drawEquipbox(); }); @@ -6229,28 +6874,18 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 = } core.updateStatusBar(); }; + this.setIndexAndSelect = function (toChange) { var info = core.status.thisUIEventInfo; if (!info) return; - core.setPageItems(info.page); + setPageItems(info.page); var index = info.index || 1; var items = info.pageItems; - if (info.select.type != null) { - var type = info.select.type; - id = core.getEquip(type); - info.index = null; - info.select = { - id: id, - action: "unload", - type: type, - }; - return; - } else { - info.select.action = null; - info.select.type = null; - if (toChange == "index") info.index = items.indexOf(info.select.id) + 1; - info.select.id = items[info.index - 1]; - } + + info.select.action = null; + info.select.type = null; + if (toChange == "index") info.index = items.indexOf(info.select.id) + 1; + info.select.id = items[info.index - 1]; }; this.addItemListboxPage = function (num) { @@ -6262,9 +6897,9 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 = if (info.page <= 0) info.page = maxPage; if (info.page > maxPage) info.page = 1; info.index = 1; - core.setPageItems(info.page); + setPageItems(info.page); core.setIndexAndSelect("select"); - core.refreshBox(); + refreshBox(); }; this.addItemListboxIndex = function (num) { @@ -6276,7 +6911,7 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 = if (info.index <= 0) info.index = 1; if (info.index > maxItem) info.index = maxItem; core.setIndexAndSelect("select"); - core.refreshBox(); + refreshBox(); }; this.addEquipboxType = function (num) { @@ -6293,7 +6928,7 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 = var m = Math.abs(info.select.type); if (info.select.type < 0) info.select.type = max - m; core.setIndexAndSelect("select"); - core.refreshBox(); + refreshBox(); return; } }; @@ -6357,7 +6992,7 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 = if (info.index == 1) { info.select.type = core.status.globalAttribute.equipName.length - 1; core.setIndexAndSelect(); - return core.refreshBox(); + return refreshBox(); } if (info.index) return core.addItemListboxIndex(-1); return core.addEquipboxType(-1 * info.equips); @@ -6403,7 +7038,6 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 = "inEventClickAction", function (x, y, px, py) { if (!core.status.thisEventClickArea) return false; - // console.log(px + "," + py); var info = core.status.thisEventClickArea; for (var i = 0; i < info.length; i++) { var obj = info[i]; @@ -6430,7 +7064,7 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 = 51 ); - this.addUIEventListener = function (x, y, width, height, todo) { + function addUIEventListener(x, y, width, height, todo) { if (!core.status.thisEventClickArea) return; var obj = { x: x, @@ -6440,7 +7074,7 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 = todo: todo, }; core.status.thisEventClickArea.push(obj); - }; + } this.initThisEventInfo = function () { core.status.thisUIEventInfo = { @@ -6450,11 +7084,11 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 = core.status.thisEventClickArea = []; }; - this.refreshBox = function () { + function refreshBox() { if (!core.status.event.id) return; if (core.status.event.id == "toolbox") core.drawToolbox(); else core.drawEquipbox(); - }; + } core.ui.closePanel = function () { if (core.status.hero && core.status.hero.flags) { @@ -6543,13 +7177,16 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 = core.status.event.id = "toolbox"; core.initThisEventInfo(); var info = core.status.thisUIEventInfo; - var items = core.getToolboxItems("all"); - core.setPageItems(1); + var items = core.getToolboxItems( + "all", + core.getFlag("showHideItem", false) + ); + setPageItems(1); var index = items.indexOf(itemId) + 1; info.page = Math.ceil(index / info.maxItem); info.index = index % info.maxItem || info.maxItem; core.setIndexAndSelect("select"); - core.setPageItems(info.page); + setPageItems(info.page); core.drawToolbox(); setTimeout(function () { core.ui.closePanel(); @@ -6561,29 +7198,46 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 = core.control._replayAction_equip = function (action) { if (action.indexOf("equip:") != 0) return false; var itemId = action.substring(6); - var items = core.getToolboxItems("equips"); + var items = core.getToolboxItems( + "equips", + core.getFlag("showHideItem", false) + ); var index = items.indexOf(itemId) + 1; - if (index < 1) return false; + if (index < 1) { + core.removeFlag("__doNotCheckAutoEvents__"); + return false; + } + + var cb = function () { + var next = core.status.replay.toReplay[0] || ""; + if (!next.startsWith("equip:") && !next.startsWith("unEquip:")) { + core.removeFlag("__doNotCheckAutoEvents__"); + core.checkAutoEvents(); + } + core.replay(); + }; + core.setFlag("__doNotCheckAutoEvents__", true); + core.status.route.push(action); if ( core.material.items[itemId].hideInReplay || core.status.replay.speed == 24 ) { - core.loadEquip(itemId, core.replay); + core.loadEquip(itemId, cb); return true; } core.status.event.id = "equipbox"; core.initThisEventInfo(); var info = core.status.thisUIEventInfo; - core.setPageItems(1); + setPageItems(1); info.page = Math.ceil(index / info.maxItem); info.index = index % info.maxItem || info.maxItem; core.setIndexAndSelect("select"); - core.setPageItems(info.page); + setPageItems(info.page); core.drawEquipbox(); setTimeout(function () { core.ui.closePanel(); - core.loadEquip(itemId, core.replay); + core.loadEquip(itemId, cb); }, core.control.__replay_getTimeout()); return true; }; @@ -6591,26 +7245,39 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 = core.control._replayAction_unEquip = function (action) { if (action.indexOf("unEquip:") != 0) return false; var equipType = parseInt(action.substring(8)); - if (!core.isset(equipType)) return false; + if (!core.isset(equipType)) { + core.removeFlag("__doNotCheckAutoEvents__"); + return false; + } + + var cb = function () { + var next = core.status.replay.toReplay[0] || ""; + if (!next.startsWith("equip:") && !next.startsWith("unEquip:")) { + core.removeFlag("__doNotCheckAutoEvents__"); + core.checkAutoEvents(); + } + core.replay(); + }; + core.setFlag("__doNotCheckAutoEvents__", true); + core.status.route.push(action); if (core.status.replay.speed == 24) { - core.unloadEquip(equipType, core.replay); + core.unloadEquip(equipType, cb); return true; } core.status.event.id = "equipbox"; core.initThisEventInfo(); var info = core.status.thisUIEventInfo; - core.setPageItems(1); + setPageItems(1); info.select.type = equipType; core.setIndexAndSelect(); core.drawEquipbox(); setTimeout(function () { core.ui.closePanel(); - core.unloadEquip(equipType, core.replay); + core.unloadEquip(equipType, cb); }, core.control.__replay_getTimeout()); return true; }; - core.registerReplayAction("item", core.control._replayAction_item); core.registerReplayAction("equip", core.control._replayAction_equip); core.registerReplayAction("unEquip", core.control._replayAction_unEquip); @@ -8317,7 +8984,42 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 = return arr; } } + /** + * 图片叠加滤镜 + * @param {img} image 需要叠加的图片, + * @param {color} style 需要叠加的颜色 + */ + function imagelighter(image, style) { + // 创建一个canvas元素 + const canvas = document.createElement("canvas"); + const ctx = canvas.getContext("2d"); + // 设置canvas的尺寸与图片相同 + canvas.width = image.width; + canvas.height = image.height; + ctx.drawImage(image, 0, 0); + // 创建一个临时canvas用于红色滤镜 + const tempCanvas = document.createElement("canvas"); + const tempCtx = tempCanvas.getContext("2d"); + tempCanvas.width = image.width; + tempCanvas.height = image.height; + + // 在临时canvas上绘制红色滤镜 + tempCtx.fillStyle = style ?? "rgba(255, 0, 0, 0.5)"; // 半透明红色 + tempCtx.fillRect(0, 0, tempCanvas.width, tempCanvas.height); + // 使用lighter混合模式叠加红色滤镜 + ctx.globalCompositeOperation = "lighter"; + ctx.drawImage(tempCanvas, 0, 0); + // 使用destination-in混合模式保留原始图片的透明度 + ctx.globalCompositeOperation = "destination-in"; + ctx.drawImage(image, 0, 0); + + // 恢复默认混合模式 + ctx.globalCompositeOperation = "source-over"; + + // 返回处理后的canvas + return canvas; + } /** * 获取一个方向的反方向 * @example backDir('up'); // 'down' @@ -8671,6 +9373,35 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 = yellowgreen: "#9acd32", transparent: "#0000", }; + // 计算两个数的最大公约数 + function gcdOfTwo(a, b) { + while (b !== 0) { + let temp = b; + b = a % b; + a = temp; + } + return a; + } + + // 计算任意项整数的最大公约数 + function gcd(...numbers) { + if (numbers.length < 2) { + throw new Error("至少需要两个数"); + } + return numbers.reduce((a, b) => gcdOfTwo(a, b)); + } + // 计算两个数的最小公倍数 + function lcmOfTwo(a, b) { + return (a * b) / gcdOfTwo(a, b); + } + + // 计算任意项整数的最小公倍数 + function lcm(...numbers) { + if (numbers.length < 2) { + throw new Error("至少需要两个数"); + } + return numbers.reduce((a, b) => lcmOfTwo(a, b)); + } if (has(core.plugin.utils)) { throw new ReferenceError( @@ -8678,6 +9409,11 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 = ); } core.plugin.utils = { + imagelighter, + gcdOfTwo, + lcmOfTwo, + gcd, + lcm, has, slide, backDir, @@ -14871,6 +15607,7 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 = core.clearContinueAutomaticRoute(); core.status.replay.animate = true; clearInterval(core.interval.onDownInterval); + delete core.animateFrame.tip; core.interval.onDownInterval = "tmp"; this._changeFloor_beforeChange(info, block, callback); @@ -14885,7 +15622,8 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 = block && block?.event && !main.replayChecking && - !core.isReplaying() + !core.isReplaying() && + !core.getFlag("__isFlying__", false) ) { const dirEntries = allChangeEntries.find( (v) => v[1] === block.event.id @@ -15170,6 +15908,7 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 = class cgText { constructor() { + this.nobg = false; //绘制需要的变量 this.image = ""; this.head = { name: "face_050445.webp", px: -300 }; @@ -15229,7 +15968,7 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 = (!core.domStyle.isVertical && inRect(pos, backbox)) ) { core.clearMap(logctx); - core.stopSound() + core.stopSound(); main.dom.logcanvas.style.display = "none"; this.log = false; } else if ( @@ -15246,16 +15985,26 @@ 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))) { + } 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) + 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) + const sound = + this.textList[ + (this.page - 1) * 6 + + Math.min(Math.floor((py - 150) / 150), 5) + ][2]; + core.stopSound(); + core.playSound(sound); } } } else { @@ -15568,7 +16317,7 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 = const name = this.textList[i][0] ? "【" + this.textList[i][0] + "】" : ""; - const sound = this.textList[i][2] + const sound = this.textList[i][2]; if (name) { core.fillBoldText1( logctx, @@ -15581,7 +16330,7 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 = core.ui._buildFont(42, true) ); } - if (sound) core.drawImage(logctx, "sound.webp", 550, posy + 30) + if (sound) core.drawImage(logctx, "sound.webp", 550, posy + 30); if (text.length < 30) { core.fillBoldText1( logctx, @@ -15703,14 +16452,15 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 = 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); + if (this.nobg) {} else { + 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) => { //绘制立绘 @@ -16409,53 +17159,2245 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 = }; }, "回合制boss战": function () { - // 在此增加新插件 - const boss = document.createElement("canvas"); //boss战画布设置 - boss.style.position = "absolute"; - boss.style.zIndex = 300; - boss.style.display = "none"; - boss.id = "boss"; - main.dom.gameGroup.insertAdjacentElement("afterend", boss); - boss.style.top = "50%"; - boss.style.left = "50%"; - boss.style.transform = "translate(-50%,-50%)"; - const ctx = boss.getContext("2d"); - main.dom.boss = boss; - boss.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.boss.onclick(px * 3, py * 3); - } catch (ee) { - main.log(ee); - } - }; - class boss1 { - constructor() { - this.bg = ""; - } - cavans() { - if (core.domStyle.isVertical) { - ctx.canvas.width = 1248; - ctx.canvas.height = 2028; + // 在此增加新插件 + const boss = document.createElement("canvas"); //boss战画布设置 + boss.style.position = "absolute"; + boss.style.zIndex = 310; + boss.style.display = "none"; + boss.id = "boss"; + main.dom.gameGroup.insertAdjacentElement("afterend", boss); + boss.style.top = "50%"; + boss.style.left = "50%"; + boss.style.transform = "translate(-50%,-50%)"; + const ctx = boss.getContext("2d"); + main.dom.boss = boss; + const boss1 = document.createElement("canvas"); //boss战画布设置 + boss1.style.position = "absolute"; + boss1.style.zIndex = 300; + boss1.style.display = "none"; + boss1.id = "boss1"; + main.dom.gameGroup.insertAdjacentElement("afterend", boss1); + boss1.style.top = "50%"; + boss1.style.left = "50%"; + boss1.style.transform = "translate(-50%,-50%)"; + const ctx1 = boss1.getContext("2d"); + main.dom.boss1 = boss1; + const boss2 = document.createElement("canvas"); //boss战画布设置 + boss2.style.position = "absolute"; + boss2.style.zIndex = 301; + boss2.style.display = "none"; + boss2.id = "boss2"; + main.dom.gameGroup.insertAdjacentElement("afterend", boss2); + boss2.style.top = "50%"; + boss2.style.left = "50%"; + boss2.style.transform = "translate(-50%,-50%)"; + main.dom.boss2 = boss2; + const ctx2 = boss2.getContext("2d"); + const boss3 = document.createElement("canvas"); //boss战画布设置 + boss3.style.position = "absolute"; + boss3.style.zIndex = 302; + boss3.style.display = "none"; + boss3.id = "boss3"; + main.dom.gameGroup.insertAdjacentElement("afterend", boss3); + boss3.style.top = "50%"; + boss3.style.left = "50%"; + boss3.style.transform = "translate(-50%,-50%)"; + main.dom.boss3 = boss3; + const ctx3 = boss3.getContext("2d"); + const boss4 = document.createElement("canvas"); //boss战画布设置 + boss4.style.position = "absolute"; + boss4.style.zIndex = 303; + boss4.style.display = "none"; + boss4.id = "boss4"; + main.dom.gameGroup.insertAdjacentElement("afterend", boss4); + boss4.style.top = "50%"; + boss4.style.left = "50%"; + boss4.style.transform = "translate(-50%,-50%)"; + const ctx4 = boss4.getContext("2d"); + main.dom.boss4 = boss4; + const boss5 = document.createElement("canvas"); //boss战画布设置 + boss5.style.position = "absolute"; + boss5.style.zIndex = 304; + boss5.style.display = "none"; + boss5.id = "boss5"; + main.dom.gameGroup.insertAdjacentElement("afterend", boss5); + boss5.style.top = "50%"; + boss5.style.left = "50%"; + boss5.style.transform = "translate(-50%,-50%)"; + const ctx5 = boss5.getContext("2d"); + main.dom.boss5 = boss5; - core.setTextAlign(ctx, "center"); - } else { - ctx.canvas.width = 2028; - ctx.canvas.height = 1248; + const boss6 = document.createElement("canvas"); //boss战画布设置 + boss6.style.position = "absolute"; + boss6.style.zIndex = 305; + boss6.style.display = "none"; + boss6.id = "boss6"; + main.dom.gameGroup.insertAdjacentElement("afterend", boss6); + boss6.style.top = "50%"; + boss6.style.left = "50%"; + boss6.style.transform = "translate(-50%,-50%)"; + const ctx6 = boss6.getContext("2d"); + main.dom.boss6 = boss6; + const boss7 = document.createElement("canvas"); //boss战画布设置 + boss7.style.position = "absolute"; + boss7.style.zIndex = 306; + boss7.style.display = "none"; + boss7.id = "boss7"; + main.dom.gameGroup.insertAdjacentElement("afterend", boss7); + boss7.style.top = "50%"; + boss7.style.left = "50%"; + boss7.style.transform = "translate(-50%,-50%)"; + const ctx7 = boss7.getContext("2d"); + main.dom.boss7 = boss7; + const boss8 = document.createElement("canvas"); //boss战画布设置 + boss8.style.position = "absolute"; + boss8.style.zIndex = 307; + boss8.style.display = "none"; + boss8.id = "boss8"; + main.dom.gameGroup.insertAdjacentElement("afterend", boss8); + boss8.style.top = "50%"; + boss8.style.left = "50%"; + boss8.style.transform = "translate(-50%,-50%)"; + const ctx8 = boss8.getContext("2d"); + main.dom.boss8 = boss8; + const { imagelighter } = core.plugin.utils; - core.setTextAlign(ctx, "center"); - } - } - start() {} - onclick(px, py) {} - } - core.ui.boss = new boss1(); - }, + function getClick() { + return new Promise((resolve) => { + function handleBossClick(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); + + let x, y; + if (core.domStyle.isVertical) { + x = py * 3; + y = 1248 - px * 3; + } else { + x = px * 3; + y = py * 3; + } + core.ui.boss.click(x, y); + + if ( + x > 1050 && + x < 1450 && + y > 250 && + y < 390 && + !core.ui.boss.show && + core.ui.boss.hasEnemy() + ) { + // 移除事件监听器 + boss.removeEventListener("click", handleBossClick); + resolve("普通攻击"); //有小怪时点击普通攻击 + return; // 退出函数 + } + if ( + x > 850 && + x < 1250 && + y > 250 && + y < 390 && + !core.ui.boss.show && + !core.ui.boss.hasEnemy() + ) { + // 移除事件监听器 + boss.removeEventListener("click", handleBossClick); + resolve("普通攻击"); //无小怪时点击普通攻击 + return; // 退出函数 + } + } catch (ee) { + main.log(ee); + } + } + boss.addEventListener("click", handleBossClick); + }); + } + const { sleep } = core.plugin.utils; + + class Boss { + constructor() { + //绘制需要的变量 + this.enemyfarme = 0; + this.bg = "bg_3512.webp"; + this.heroImage = "tati_310101.webp"; + this.hero = { + id: "hero", + name: "凯伊姆", + hp: 1000, + atk: 150, + def: 100, + spell: 100, + speed: 10, + mdef: 10, + }; + this.boss = { + name: "菲奥奈", + id: "angel", + image: "tati_050143.webp", + hp: 1000, + atk: 200, + def: 100, + speed: 10, + mdef: 10, + skill: ["普通攻击", "重斩"], + index: 0, + }; + this.enemy = []; + this.enemy = [{ + name: "小蝙蝠", + id: "bat", + image: "tati_020125a.webp", + hp: 1000, + atk: 100, + def: 20, + speed: 10, + mdef: 10, + skill: ["普通攻击", "重斩"], + index: 0, + }, + { + name: "红蝙蝠", + id: "redBat", + image: "tati_050301.webp", + hp: 1000, + atk: 100, + def: 120, + speed: 10, + mdef: 10, + skill: ["普通攻击", "重斩"], + index: 0, + }, + { + name: "大蝙蝠", + id: "bigBat", + image: "tati_120101.webp", + hp: 1000, + atk: 100, + def: 100, + speed: 10, + mdef: 10, + skill: ["普通攻击", "重斩"], + index: 0, + }, + { + name: "绿色史莱姆", + id: "greenSlime", + image: "tati_340115.webp", + hp: 1000, + atk: 100, + def: 100, + speed: 10, + mdef: 10, + skill: ["普通攻击", "重斩"], + index: 0, + }, + { + name: "红色史莱姆", + id: "redSlime", + image: "tati_430101.webp", + hp: 1000, + atk: 100, + def: 100, + speed: 10, + mdef: 10, + skill: ["普通攻击", "重斩"], + index: 0, + }, + { + name: "黑色史莱姆", + id: "blackSlime", + image: "tati_440101.webp", + hp: 1000, + atk: 100, + def: 100, + speed: 10, + mdef: 10, + skill: ["普通攻击", "重斩"], + index: 0, + }, + ]; + this.selection = "boss"; + this.herobuff = [ + { id: "sword1", count: 1 }, + { id: "fly", count: 30 }, + ]; + this.bossbuff = [ + { id: "fly", count: 2 }, + { id: "book", count: 12, hp: 100 }, + ]; + this.enemybuff = [ + [], + [], + [], + [], + [], + [] + ]; + this.skills = { + //技能列表,便于调用(可通过this.skills[name]调用) + 菲奥奈: ["普通攻击", "重斩"], + }; + this.skillShow = { + //技能说明 + 普通攻击: "常规攻击形式,伤害为自身攻击-对手防御", + }; + + this.turn = 0; + this.playingAnimate = new Set(); + this.playerTurn = false; + this.show = false; + } + buffshow(a) { + //buff说明(均未实装,之后改为实际需要的buff) + let text = ""; + switch (a.id) { + case "sword1": + text = `\r[rgb(30,66,30)]剑气:\r造成伤害提升\r[red]${ + 10 * a.count + }%\r`; + break; + case "fly": + text = `羽翼守护:接下来\r[gold]${a.count}回合\r不受速度差值影响`; + break; + case "book": + text = `恢复之书:接下来\r[#000033]${a.count}回合\r,每回合行动时回复\r[green]${a.hp}\r点生命`; + break; + } + return text; + } + shake(hero) { + let time = 0, + farme = 0; + + const xlist = [Math.random() * 40 + 10, Math.random() * -40 - 10, 0]; + return new Promise((resolve) => { + core.registerAnimationFrame("shake", true, (temptime) => { + if (temptime - time > 1000 / 60) { + time = temptime; + + const x = xlist[Math.floor(farme / 5) % 3]; + if (hero) { + const img = imagelighter( + core.material.images.images[this.heroImage] + ); + core.clearMap(ctx2); + if (core.domStyle.isVertical) { + ctx2.canvas.width = 1248; + ctx2.canvas.height = 2028; + ctx2.save(); //保存设置 + ctx2.translate(1248, 0); //重新定位右上角为基准 + ctx2.rotate(Math.PI / 2); //旋转90度 + } else { + ctx2.canvas.width = 2028; + ctx2.canvas.height = 1248; + } + + core.drawImage(ctx2, img, x, 168, 750, 1080); + ctx2.restore(); + } else { + core.clearMap(ctx3); + if (core.domStyle.isVertical) { + ctx3.canvas.width = 1248; + ctx3.canvas.height = 2028; + ctx3.save(); //保存设置 + ctx3.translate(1248, 0); //重新定位右上角为基准 + ctx3.rotate(Math.PI / 2); //旋转90度 + } else { + ctx3.canvas.width = 2028; + ctx3.canvas.height = 1248; + } + if (this.selection === "boss" || this.selection === "") { + const img = imagelighter( + core.material.images.images[this.boss.image] + ); + core.drawImage(ctx3, img, 1400 + x, 168, 750, 1080); + } else { + const img = imagelighter( + core.material.images.images[ + this.enemy[this.selection].image + ] + ); + core.drawImage(ctx3, img, 1400 + x, 168, 750, 1080); + } + + ctx3.restore(); + } + farme++; + if (farme > 30) { + core.unregisterAnimationFrame("shake"); + + this.drawhero(); + this.drawboss(); + resolve(); + } + } + }); + }); + } + popDamage(damage, onhero) { + 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; + } + let color = "#FFFFFF"; + if (typeof damage === "number") { + color = damage < 0 ? "#22FF44" : "lightcoral"; + } + let farme = 0, + time = 0; + let posx = onhero ? 300 : 1800; + const speed = 9; + return new Promise((resolve) => { + core.registerAnimationFrame("popDamageonboss", true, (temptime) => { + if (temptime - time > 1000 / 60) { + time = temptime; + core.clearMap(ctx); + core.setTextAlign(ctx, "center"); + core.fillBoldText1( + ctx, + damage, + posx, + 800 - speed * farme, + color, + "#000000", + 6, + "bold 72px Arial" + ); + farme++; + ctx2.restore(); + if (farme > 30) { + core.unregisterAnimationFrame("popDamageonboss"); + + core.clearMap(ctx); + resolve(); + } + } + }); + }); + } + async skill(sk, a, b) { + //a为发起方属性,sk为技能名 + let damage = 0; + switch ( + sk //所有技能效果及动画写在这里 + ) { + case "普通攻击": + damage = Math.max(a.atk - b.def, 0); //基础伤害 + damage = Math.floor((damage * a.speed) / b.speed); //速度比值伤害加成 + b.hp -= damage; //承受伤害 + if (b.id === "hero") + core.status.hero.statistics.battleDamage += damage; //数据统计记录伤害 + if (damage === 0) damage = "抵抗"; + + switch ( + a.id //根据id选取不同的特效 + ) { + case "hero": + this.popDamage(damage, false); + if (damage > 0 && typeof damage !== "string") this.shake(false); + await this.playanimate("sword", 1800, 800); + break; + case "angel": + this.popDamage(damage, true); + if (damage > 0 && typeof damage !== "string") this.shake(true); + await this.playanimate("sword", 350, 800); //播放动画sword + + break; + case "bat": + this.popDamage(damage, true); + if (damage > 0 && typeof damage !== "string") this.shake(true); + await this.playanimate("sword", 350, 800); //播放动画sword + + break; + case "redBat": + this.popDamage(damage, true); + if (damage > 0 && typeof damage !== "string") this.shake(true); + await this.playanimate("Fire01", 350, 800); //播放动画Fire01 + break; + case "bigBat": + this.popDamage(damage, true); + if (damage > 0 && typeof damage !== "string") this.shake(true); + await this.playanimate("Fire02", 350, 800); //播放动画Fire02 + break; + case "greenSlime": + this.popDamage(damage, true); + if (damage > 0 && typeof damage !== "string") this.shake(true); + await this.playanimate("005-Attack03", 350, 800); //播放动画005-Attack03 + break; + case "redSlime": + this.popDamage(damage, true); + if (damage > 0 && typeof damage !== "string") this.shake(true); + await this.playanimate("012-Heal01", 350, 800); //播放动画012-Heal01 + break; + case "blackSlime": + this.popDamage(damage, true); + if (damage > 0 && typeof damage !== "string") this.shake(true); + await this.playanimate("sword", 350, 800); //播放动画sword + break; + } + break; //下面写其余技能 + } + await sleep(500); //等待1000ms + } + + 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]; + if (main.replayChecking || core.isReplaying()) return; + const enemyStatusBox = makeBox([50, 50], [1900, 200]), + heroStatusBox = makeBox([600, 920], [900, 300]), + bossBox = makeBox([800, 300], [100, 150]), + enemyBox = makeBox([700, 500], [300, 300]), + imageBox = makeBox([1500, 250], [550, 1000]); + if (this.show) { + //清除展示画面 + this.show = !this.show; + core.clearMap(ctx8); + } else { + if ( + inRect(pos, enemyStatusBox) && + this.selection !== "" && + this.selection !== "boss" && + this.hasEnemy() + ) { + //绘制怪物详情 + this.show = !this.show; + this.moreShow(this.selection); + } else if ( + inRect(pos, enemyStatusBox) && + (!this.hasEnemy() || this.selection === "boss") + ) { + //绘制boss详情 + this.show = !this.show; + this.moreShow("boss"); + } else if (inRect(pos, heroStatusBox)) { + //绘制勇士详情 + this.show = !this.show; + this.moreShow("hero"); + } else if (inRect(pos, bossBox) && this.hasEnemy()) { + //切换selection为boss + this.selection = "boss"; + this.update(); + } else if (inRect(pos, enemyBox) && this.hasEnemy()) { + //切换selection为enemy + const symbol = + Math.floor((px - 700) / 100) + Math.floor((py - 500) / 150) * 3; + + if (this.enemy[symbol] && this.enemy[symbol].hp > 0) { + this.selection = symbol; + this.update(); + } + } + } + } + drawchoose() { + if (core.domStyle.isVertical) { + ctx7.canvas.width = 1248; + ctx7.canvas.height = 2028; + ctx7.save(); //保存设置 + ctx7.translate(1248, 0); //重新定位右上角为基准 + ctx7.rotate(Math.PI / 2); //旋转90度 + } else { + ctx7.canvas.width = 2028; + ctx7.canvas.height = 1248; + } + boss7.style.display = "block"; + core.clearMap(ctx7); + if (this.hasEnemy()) { + core.drawWindowSkin( + "winskin.webp", + ctx7, + 1050, + 250, + 400, + 660, + null, + null, + null, + 3 + ); + core.fillBoldText1( + ctx7, + "普通攻击", + 1120, + 350, + "#FFFFFF", + "#000000", + 6, + "bold 64px Verdana" + ); + core.drawLine(ctx7, 1050, 390, 1450, 390, "#FFFFFF", 6); + } else { + core.drawWindowSkin( + "winskin.webp", + ctx7, + 850, + 250, + 400, + 660, + null, + null, + null, + 3 + ); + core.fillBoldText1( + ctx7, + "普通攻击", + 920, + 350, + "#FFFFFF", + "#000000", + 6, + "bold 64px Verdana" + ); + core.drawLine(ctx7, 850, 390, 1250, 390, "#FFFFFF", 6); + } + } + moreShow(select) { + if (core.domStyle.isVertical) { + ctx8.canvas.width = 1248; + ctx8.canvas.height = 2028; + ctx8.save(); //保存设置 + ctx8.translate(1248, 0); //重新定位右上角为基准 + ctx8.rotate(Math.PI / 2); //旋转90度 + } else { + ctx8.canvas.width = 2028; + ctx8.canvas.height = 1248; + } + core.clearMap(ctx8); + core.fillRect(ctx8, 100, 100, 1800, 1000, "rgba(0,0,0,0.7)"); + core.drawWindowSkin( + "winskin.webp", + ctx8, + 100, + 100, + 1800, + 1000, + null, + null, + null, + 3 + ); + let posy = 200; + switch (select) { + case "hero": + //勇士技能/buff + core.fillBoldText1( + ctx8, + this.hero.name, + 1000, + posy, + "#FFFFFF", + "#000000", + 6, + "bold 48px Verdana" + ); + posy += 100; + if (this.herobuff.length === 0) { + core.fillBoldText1( + ctx8, + "当前无特殊状态", + 200, + posy, + "#FFFFFF", + "#000000", + 6, + "bold 48px Verdana" + ); + posy += 100; + } else { + this.herobuff.forEach((v) => { + core.drawTextContent(ctx8, this.buffshow(v), { + left: 200, + top: posy, + bold: true, + color: "#FFFFFF", + align: "left", + fontSize: 48, + time: 0, + font: "Verdana", + maxWidth: 1600, + }); + posy += 100; + }); + } + posy += 50; + core.fillBoldText1( + ctx8, + "技能说明", + 1000, + posy, + "#FFFFFF", + "#000000", + 6, + "bold 48px Verdana" + ); + posy += 100; + core.fillBoldText1( + ctx8, + "普通攻击:" + this.skillShow["普通攻击"], + 200, + posy, + "#FFFFFF", + "#000000", + 6, + "bold 48px Verdana" + ); + break; + case "boss": + core.fillBoldText1( + ctx8, + this.boss.name, + 1000, + posy, + "#FFFFFF", + "#000000", + 6, + "bold 48px Verdana" + ); + posy += 100; + //boss技能/buff + if (this.bossbuff.length === 0) { + core.fillBoldText1( + ctx8, + "当前无特殊状态", + 200, + posy, + "#FFFFFF", + "#000000", + 6, + "bold 48px Verdana" + ); + posy += 100; + } else { + this.bossbuff.forEach((v) => { + core.drawTextContent(ctx8, this.buffshow(v), { + left: 200, + top: posy, + bold: true, + color: "#FFFFFF", + align: "left", + fontSize: 48, + time: 0, + font: "Verdana", + maxWidth: 1600, + }); + posy += 100; + }); + } + posy += 50; + core.fillBoldText1( + ctx8, + "当前技能", + 1000, + posy, + "#FFFFFF", + "#000000", + 6, + "bold 48px Verdana" + ); + posy += 100; + core.fillBoldText1( + ctx8, + this.boss.skill[this.boss.index] + + this.skillShow[this.boss.skill[this.boss.index]], + 200, + posy, + "#FFFFFF", + "#000000", + 6, + "bold 48px Verdana" + ); + break; + default: + const enemy = this.enemy[select]; + const enemybuff = this.enemybuff[select]; + core.fillBoldText1( + ctx8, + enemy.name, + 1000, + posy, + "#FFFFFF", + "#000000", + 6, + "bold 48px Verdana" + ); + posy += 100; + if (enemybuff.length === 0) { + core.fillBoldText1( + ctx8, + "当前无特殊状态", + 200, + posy, + "#FFFFFF", + "#000000", + 6, + "bold 48px Verdana" + ); + posy += 100; + } else { + enemybuff.forEach((v) => { + core.drawTextContent(ctx8, this.buffshow(v), { + left: 200, + top: posy, + bold: true, + color: "#FFFFFF", + align: "left", + fontSize: 48, + time: 0, + font: "Verdana", + maxWidth: 1600, + }); + posy += 100; + }); + } + posy += 50; + core.fillBoldText1( + ctx8, + "当前技能", + 1000, + posy, + "#FFFFFF", + "#000000", + 6, + "bold 48px Verdana" + ); + posy += 100; + core.fillBoldText1( + ctx8, + enemy.skill[enemy.index] + + this.skillShow[enemy.skill[enemy.index]], + 200, + posy, + "#FFFFFF", + "#000000", + 6, + "bold 48px Verdana" + ); + break; + } + ctx8.restore(); + } + hasEnemy() { + let enemy = false; + this.enemy.forEach((v) => { + if (v.hp > 0) enemy = true; + }); + return enemy; + } + async bossStart() { + boss.style.display = "block"; + this.selection = "boss"; + this.playerturn = false; + this.show = false; + this.turn = 0; + core.lockControl(); + await this.blackBg(); + this.moveboss(); + await this.movehero(); + await this.moveStatus(); + this.update(); + this.fight(); + } + async bossEnd() { + hero.hp = this.hero.hp; + this.selection = "boss"; + await this.close(); + + core.unlockControl(); + core.updateStatusBar(); + if (hero.hp <= 0) { + hero.hp = 0; + core.events.lose("BOSS战失败"); + } + } + async fight() { + await this.drawturn(); + const fightList = []; + fightList.push(["hero", this.hero.speed]); + if (this.boss.hp > 0) fightList.push(["boss", this.boss.speed]); + this.enemy.forEach((v, i) => { + if (v.id && v.hp > 0) fightList.push([i, v.speed]); + }); + fightList.sort((a, b) => b[1] - a[1]); + let damage; + for (const v of fightList) { + switch (v[0]) { + case "hero": + this.drawchoose(); + const skill = await getClick(); + let select = this.boss; + if (this.selection !== "" && this.selection !== "boss") + select = this.enemy[this.selection]; + this.skill(skill, this.hero, select); + + core.clearMap(ctx7); + break; + case "boss": + if (this.boss.hp > 0) { + this.selection = "boss"; + this.update(); + await sleep(500); //等待500ms + //这里写boss技能的效果 + this.skill( + this.boss.skill[this.boss.index], + this.boss, + this.hero + ); + + this.boss.index++; + if (this.boss.index >= this.boss.skill.length) + this.boss.index = 0; + } + break; + default: + const enemy = this.enemy[v[0]]; + if (enemy.hp > 0) { + this.selection = v[0]; + this.update(); + await sleep(500); //等待500ms + this.skill(enemy.skill[enemy.index], enemy, this.hero); + enemy.index++; + if (enemy.index >= enemy.skill.length) enemy.index = 0; + } + break; + } + await sleep(1000); + this.selection = ""; + this.update(); + } + let end = true; + if (this.boss.hp > 0) end = false; + this.enemy.forEach((v) => { + if (v.hp > 0) end = false; + }); + + if (this.hero.hp <= 0) end = true; + if (end) { + this.bossEnd(); + } else { + this.fight(); + } + } + drawturn() { + boss8.style.display = "block"; + this.turn += 1; + let time = 0, + frame = 0, + frame2 = 0, + right = 1, + once = 10; + return new Promise((resolve) => { + core.registerAnimationFrame("drawturn", true, (temptime) => { + if (temptime - time > 1000 / 60) { + time = temptime; + frame += 1 * right; + core.clearMap(ctx); + 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; + } + + core.fillRect( + ctx, + 0, + 624 - once * frame, + 2028, + once * frame * 2, + "rgba(0,0,0,0.7)" + ); + core.setTextAlign(ctx, "center"); + core.fillBoldText1( + ctx, + "ROUND " + this.turn, + 1014, + 624, + "#FFFFFF", + "#000000", + 6, + core.ui._buildFont(frame * 5, true) + ); + if (1014 - once * frame * 7 <= 0) { + frame -= 1; + frame2++; + + if (frame2 > 30) right = -1; + } + if (frame < 0) { + core.clearMap(ctx); + core.unregisterAnimationFrame("drawturn"); + resolve(); + } + } + }); + }); + } + drawenemy() { + let block, + time = 0; + + boss5.style.display = "block"; + core.registerAnimationFrame("enemyanimate", true, (temptime) => { + if (temptime - time > 1000 / 60) { + time = temptime; + this.enemyfarme += 1; + let animate = Math.floor(this.enemyfarme / 30), + posx = 700, + posy = 500; + core.clearMap(ctx5); + if (core.domStyle.isVertical) { + ctx5.canvas.width = 1248; + ctx5.canvas.height = 2028; + ctx5.save(); //保存设置 + ctx5.translate(1248, 0); //重新定位右上角为基准 + ctx5.rotate(Math.PI / 2); //旋转90度 + } else { + ctx5.canvas.width = 2028; + ctx5.canvas.height = 1248; + } + + if (this.hasEnemy()) { + core.drawWindowSkin( + "winskin.webp", + ctx5, + 650, + 250, + 400, + 660, + null, + null, + null, + 3 + ); + if (this.selection === "boss") + core.strokeRect(ctx5, 800, 300, 100, 150, "yellow", 6); + const bossBlock = core.getBlockInfo(this.boss.id); + core.drawImage( + ctx5, + bossBlock.image, + 32 * (animate % 4), + bossBlock.posY * 48, + 32, + 48, + 800, + 300, + 96, + 144 + ); + core.drawImage( + ctx5, + "hero.webp", + 32 * (animate % 4), + 144, + 32, + 48, + 800, + 750, + 96, + 144 + ); + for (let i = 0; i < this.enemy.length; i++) { + if (this.enemy[i].id && this.enemy[i].hp > 0) { + block = core.getBlockInfo(this.enemy[i].id); + } else { + posx += 100; + if (i === 2) { + posx = 700; + posy += 150; + } + continue; + } + + if (block.cls === "enemys") { + core.drawImage( + ctx5, + block.image, + 32 * (animate % 2), + block.posY * 32, + 32, + 32, + posx, + posy, + 96, + 96 + ); + if (this.selection === i) + core.strokeRect(ctx5, posx, posy, 100, 100, "yellow", 6); + } else { + core.drawImage( + ctx5, + block.image, + 32 * (animate % 4), + block.posY * 48, + 32, + 48, + posx, + posy, + 96, + 144 + ); + if (this.selection === i) + core.strokeRect(ctx5, posx, posy, 100, 150, "yellow", 6); + } + + posx += 100; + if (i === 2) { + posx = 700; + posy += 150; + } + } + } + + ctx5.restore(); + } + }); + } + drawhero() { + core.clearMap(ctx2); + if (core.domStyle.isVertical) { + ctx2.canvas.width = 1248; + ctx2.canvas.height = 2028; + ctx2.save(); //保存设置 + ctx2.translate(1248, 0); //重新定位右上角为基准 + ctx2.rotate(Math.PI / 2); //旋转90度 + } else { + ctx2.canvas.width = 2028; + ctx2.canvas.height = 1248; + } + core.drawImage(ctx2, this.heroImage, 0, 168, 750, 1080); + ctx2.restore(); + } + movehero() { + boss2.style.display = "block"; + core.clearMap(ctx2); + let time = 0, + px = -200; + return new Promise((resolve) => { + core.registerAnimationFrame("moveheroImage", true, (temptime) => { + if (temptime - time > 1000 / 60) { + time = temptime; + core.clearMap(ctx2); + if (core.domStyle.isVertical) { + ctx2.canvas.width = 1248; + ctx2.canvas.height = 2028; + ctx2.save(); //保存设置 + ctx2.translate(1248, 0); //重新定位右上角为基准 + ctx2.rotate(Math.PI / 2); //旋转90度 + } else { + ctx2.canvas.width = 2028; + ctx2.canvas.height = 1248; + } + core.drawImage(ctx2, this.heroImage, px, 168, 750, 1080); + px += 10; + ctx2.restore(); + if (px >= 0) { + core.unregisterAnimationFrame("moveheroImage"); + this.drawhero(); + resolve(); + } + } + }); + }); + } + update() { + core.drawImage(ctx1, this.bg, 0, 0, 2028, 1248); + this.drawboss(); + this.drawhero(); + this.drawStatus(); + let dodraw = false; + for (let i = 0; i < this.enemy.length; i++) { + if (this.enemy[i].id && this.enemy[i].hp > 0) { + dodraw = true; + } + } + if (dodraw === true) this.drawenemy(); + } + playanimate(name, x, y, scalex = 10, scaley = 10) { + const one = { + name: name, + x: x, + y: y, + scalex: scalex, + scaley: scaley, + farme: 0, + }; + let time = 0; + boss6.style.display = "block"; + return new Promise((resolve) => { + core.registerAnimationFrame("animateboss", true, (timestamp) => { + if (timestamp - time > 1000 / 60) { + time = timestamp; + core.clearMap(ctx6); + + const data = flags["animate_" + one.name]; + if (core.domStyle.isVertical) { + ctx6.canvas.width = 1248; + ctx6.canvas.height = 2028; + ctx6.save(); //保存设置 + ctx6.translate(1248, 0); //重新定位右上角为基准 + ctx6.rotate(Math.PI / 2); //旋转90度 + } else { + ctx6.canvas.width = 2028; + ctx6.canvas.height = 1248; + } + + if (!data) { + core.unregisterAnimationFrame("animateboss"); + resolve(); + } 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; + + ctx6.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; + + core.drawImage( + ctx6, + 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++; + ctx6.restore(); + if (one.farme > data.allFarme) { + core.clearMap(ctx6); + core.unregisterAnimationFrame("animateboss"); + resolve(); + } + } + } + }); + }); + } + + drawboss() { + core.clearMap(ctx3); + if (core.domStyle.isVertical) { + ctx3.canvas.width = 1248; + ctx3.canvas.height = 2028; + ctx3.save(); //保存设置 + ctx3.translate(1248, 0); //重新定位右上角为基准 + ctx3.rotate(Math.PI / 2); //旋转90度 + } else { + ctx3.canvas.width = 2028; + ctx3.canvas.height = 1248; + } + if (this.selection === "boss" || this.selection === "") { + core.drawImage(ctx3, this.boss.image, 1400, 168, 750, 1080); + } else { + core.drawImage( + ctx3, + this.enemy[this.selection].image, + 1400, + 168, + 750, + 1080 + ); + } + + ctx3.restore(); + } + moveboss() { + boss3.style.display = "block"; + core.clearMap(ctx3); + let time = 0, + px = 1600; + return new Promise((resolve) => { + core.registerAnimationFrame("movebossImage", true, (temptime) => { + if (temptime - time > 1000 / 60) { + time = temptime; + core.clearMap(ctx3); + if (core.domStyle.isVertical) { + ctx3.canvas.width = 1248; + ctx3.canvas.height = 2028; + ctx3.save(); //保存设置 + ctx3.translate(1248, 0); //重新定位右上角为基准 + ctx3.rotate(Math.PI / 2); //旋转90度 + } else { + ctx3.canvas.width = 2028; + ctx3.canvas.height = 1248; + } + core.drawImage(ctx3, this.boss.image, px, 168, 750, 1080); + px -= 10; + ctx3.restore(); + if (px <= 1400) { + core.unregisterAnimationFrame("movebossImage"); + this.drawboss(); + resolve(); + } + } + }); + }); + } + drawStatus() { + core.clearMap(ctx4); + if (core.domStyle.isVertical) { + ctx4.canvas.width = 1248; + ctx4.canvas.height = 2028; + ctx4.save(); //保存设置 + ctx4.translate(1248, 0); //重新定位右上角为基准 + ctx4.rotate(Math.PI / 2); //旋转90度 + } else { + ctx4.canvas.width = 2028; + ctx4.canvas.height = 1248; + } + core.drawWindowSkin( + "winskin.webp", + ctx4, + 600, + 920, + 900, + 300, + null, + null, + null, + 3 + ); + core.fillBoldText1( + ctx4, + hero.name, + 630, + 1000, + "#FFFFFF", + "#000000", + 6, + core.ui._buildFont(44, true) + ); + core.fillBoldText1( + ctx4, + "状态", + 880, + 1000, + "#FFFFFF", + "#000000", + 6, + core.ui._buildFont(44, true) + ); + core.fillBoldText1( + ctx4, + "生命 " + this.hero.hp, + 630, + 1070, + "#FFFFFF", + "#000000", + 6, + core.ui._buildFont(44, true) + ); + core.fillBoldText1( + ctx4, + "攻击 " + this.hero.atk, + 630, + 1120, + "#FFFFFF", + "#000000", + 6, + core.ui._buildFont(44, true) + ); + core.fillBoldText1( + ctx4, + "防御 " + this.hero.def, + 630, + 1170, + "#FFFFFF", + "#000000", + 6, + core.ui._buildFont(44, true) + ); + core.fillBoldText1( + ctx4, + "法强 " + this.hero.spell, + 1080, + 1070, + "#FFFFFF", + "#000000", + 6, + core.ui._buildFont(44, true) + ); + core.fillBoldText1( + ctx4, + "法抗 " + this.hero.mdef + "%", + 1080, + 1120, + "#FFFFFF", + "#000000", + 6, + core.ui._buildFont(44, true) + ); + core.fillBoldText1( + ctx4, + "速度 " + this.hero.speed, + 1080, + 1170, + "#FFFFFF", + "#000000", + 6, + core.ui._buildFont(44, true) + ); + let posx = 980; + this.herobuff.forEach((v) => { + if (v) { + core.drawIcon(ctx4, v.id, posx, 950, 64, 64); + core.setTextAlign(ctx4, "right"); + core.fillBoldText1( + ctx4, + v.count, + posx + 50, + 1000, + "#FFFFFF", + "#000000", + 6, + core.ui._buildFont(24, true) + ); + core.setTextAlign(ctx4, "left"); + posx += 80; + } + }); + + if (this.selection === "boss" || !this.hasEnemy()) { + core.drawWindowSkin( + "winskin.webp", + ctx4, + 50, + 50, + 1900, + 200, + null, + null, + null, + 3 + ); + core.fillBoldText1( + ctx4, + this.boss.name, + 100, + 120, + "#FFFFFF", + "#000000", + 6, + core.ui._buildFont(44, true) + ); + core.fillBoldText1( + ctx4, + "状态", + 500, + 120, + "#FFFFFF", + "#000000", + 6, + core.ui._buildFont(44, true) + ); + core.fillBoldText1( + ctx4, + "当前技能", + 1400, + 120, + "#FFFFFF", + "#000000", + 6, + core.ui._buildFont(44, true) + ); + const bosstext = this.boss.skill[this.boss.index]; + core.fillBoldText1( + ctx4, + bosstext, + 1600, + 120, + "#FFFFFF", + "#000000", + 6, + core.ui._buildFont(44, true) + ); + core.fillBoldText1( + ctx4, + "生命 " + this.boss.hp, + 100, + 220, + "#FFFFFF", + "#000000", + 6, + core.ui._buildFont(44, true) + ); + core.fillBoldText1( + ctx4, + "攻击 " + this.boss.atk, + 500, + 220, + "#FFFFFF", + "#000000", + 6, + core.ui._buildFont(44, true) + ); + core.fillBoldText1( + ctx4, + "防御 " + this.boss.def, + 900, + 220, + "#FFFFFF", + "#000000", + 6, + core.ui._buildFont(44, true) + ); + core.fillBoldText1( + ctx4, + "法抗 " + this.boss.mdef + "%", + 1300, + 220, + "#FFFFFF", + "#000000", + 6, + core.ui._buildFont(44, true) + ); + core.fillBoldText1( + ctx4, + "速度 " + this.boss.speed, + 1700, + 220, + "#FFFFFF", + "#000000", + 6, + core.ui._buildFont(44, true) + ); + let posx = 600; + this.bossbuff.forEach((v) => { + if (v) { + core.drawIcon(ctx4, v.id, posx, 80, 64, 64); + core.setTextAlign(ctx4, "right"); + core.fillBoldText1( + ctx4, + v.count, + posx + 50, + 130, + "#FFFFFF", + "#000000", + 6, + core.ui._buildFont(24, true) + ); + core.setTextAlign(ctx4, "left"); + posx += 80; + } + }); + } else if (this.selection === "") {} else { + core.drawWindowSkin( + "winskin.webp", + ctx4, + 50, + 50, + 1900, + 200, + null, + null, + null, + 3 + ); + core.fillBoldText1( + ctx4, + this.enemy[this.selection].name, + 100, + 120, + "#FFFFFF", + "#000000", + 6, + core.ui._buildFont(44, true) + ); + core.fillBoldText1( + ctx4, + "状态", + 500, + 120, + "#FFFFFF", + "#000000", + 6, + core.ui._buildFont(44, true) + ); + core.fillBoldText1( + ctx4, + "当前技能", + 1400, + 120, + "#FFFFFF", + "#000000", + 6, + core.ui._buildFont(44, true) + ); + const enemytext = + this.enemy[this.selection].skill[this.enemy[this.selection].index]; + core.fillBoldText1( + ctx4, + enemytext, + 1600, + 120, + "#FFFFFF", + "#000000", + 6, + core.ui._buildFont(44, true) + ); + core.fillBoldText1( + ctx4, + "生命 " + this.enemy[this.selection].hp, + 100, + 220, + "#FFFFFF", + "#000000", + 6, + core.ui._buildFont(44, true) + ); + core.fillBoldText1( + ctx4, + "攻击 " + this.enemy[this.selection].atk, + 500, + 220, + "#FFFFFF", + "#000000", + 6, + core.ui._buildFont(44, true) + ); + core.fillBoldText1( + ctx4, + "防御 " + this.enemy[this.selection].def, + 900, + 220, + "#FFFFFF", + "#000000", + 6, + core.ui._buildFont(44, true) + ); + core.fillBoldText1( + ctx4, + "法抗 " + this.enemy[this.selection].mdef + "%", + 1300, + 220, + "#FFFFFF", + "#000000", + 6, + core.ui._buildFont(44, true) + ); + core.fillBoldText1( + ctx4, + "速度 " + this.enemy[this.selection].speed, + 1700, + 220, + "#FFFFFF", + "#000000", + 6, + core.ui._buildFont(44, true) + ); + let posx = 600; + this.enemybuff[this.selection].forEach((v) => { + if (v) { + core.drawIcon(ctx4, v.id, posx, 80, 64, 64); + core.setTextAlign(ctx4, "right"); + core.fillBoldText1( + ctx4, + v.count, + posx + 50, + 130, + "#FFFFFF", + "#000000", + 6, + core.ui._buildFont(24, true) + ); + core.setTextAlign(ctx4, "left"); + posx += 80; + } + }); + } + ctx4.restore(); + } + moveStatus() { + boss4.style.display = "block"; + let time = 0, + posy = 400; + return new Promise((resolve) => { + core.registerAnimationFrame("moveStatus", true, (temptime) => { + if (temptime - time > 1000 / 60) { + time = temptime; + core.clearMap(ctx4); + if (core.domStyle.isVertical) { + ctx4.canvas.width = 1248; + ctx4.canvas.height = 2028; + ctx4.save(); //保存设置 + ctx4.translate(1248, 0); //重新定位右上角为基准 + ctx4.rotate(Math.PI / 2); //旋转90度 + } else { + ctx4.canvas.width = 2028; + ctx4.canvas.height = 1248; + } + core.drawWindowSkin( + "winskin.webp", + ctx4, + 600, + 920 + posy, + 900, + 300, + null, + null, + null, + 3 + ); + core.fillBoldText1( + ctx4, + hero.name, + 630, + 1000 + posy, + "#FFFFFF", + "#000000", + 6, + core.ui._buildFont(44, true) + ); + core.fillBoldText1( + ctx4, + "状态", + 880, + 1000 + posy, + "#FFFFFF", + "#000000", + 6, + core.ui._buildFont(44, true) + ); + core.fillBoldText1( + ctx4, + "生命 " + this.hero.hp, + 630, + 1070 + posy, + "#FFFFFF", + "#000000", + 6, + core.ui._buildFont(44, true) + ); + core.fillBoldText1( + ctx4, + "攻击 " + this.hero.atk, + 630, + 1120 + posy, + "#FFFFFF", + "#000000", + 6, + core.ui._buildFont(44, true) + ); + core.fillBoldText1( + ctx4, + "防御 " + this.hero.def, + 630, + 1170 + posy, + "#FFFFFF", + "#000000", + 6, + core.ui._buildFont(44, true) + ); + core.fillBoldText1( + ctx4, + "法强 " + this.hero.spell, + 1080, + 1070 + posy, + "#FFFFFF", + "#000000", + 6, + core.ui._buildFont(44, true) + ); + core.fillBoldText1( + ctx4, + "法抗 " + this.hero.mdef + "%", + 1080, + 1120 + posy, + "#FFFFFF", + "#000000", + 6, + core.ui._buildFont(44, true) + ); + core.fillBoldText1( + ctx4, + "速度 " + this.hero.speed, + 1080, + 1170 + posy, + "#FFFFFF", + "#000000", + 6, + core.ui._buildFont(44, true) + ); + let posx = 980; + this.herobuff.forEach((v) => { + if (v) { + core.drawIcon(ctx4, v.id, posx, 950 + posy, 64, 64); + core.setTextAlign(ctx4, "right"); + core.fillBoldText1( + ctx4, + v.count, + posx + 50, + 1000 + posy, + "#FFFFFF", + "#000000", + 6, + core.ui._buildFont(24, true) + ); + core.setTextAlign(ctx4, "left"); + posx += 80; + } + }); + if (this.selection === "boss") { + core.drawWindowSkin( + "winskin.webp", + ctx4, + 50, + 50 - posy / 2, + 1900, + 200, + null, + null, + null, + 3 + ); + core.fillBoldText1( + ctx4, + this.boss.name, + 100, + 120 - posy / 2, + "#FFFFFF", + "#000000", + 6, + core.ui._buildFont(44, true) + ); + core.fillBoldText1( + ctx4, + "状态", + 500, + 120 - posy / 2, + "#FFFFFF", + "#000000", + 6, + core.ui._buildFont(44, true) + ); + core.fillBoldText1( + ctx4, + "生命 " + this.boss.hp, + 100, + 220 - posy / 2, + "#FFFFFF", + "#000000", + 6, + core.ui._buildFont(44, true) + ); + core.fillBoldText1( + ctx4, + "攻击 " + this.boss.atk, + 500, + 220 - posy / 2, + "#FFFFFF", + "#000000", + 6, + core.ui._buildFont(44, true) + ); + core.fillBoldText1( + ctx4, + "防御 " + this.boss.def, + 900, + 220 - posy / 2, + "#FFFFFF", + "#000000", + 6, + core.ui._buildFont(44, true) + ); + core.fillBoldText1( + ctx4, + "法抗 " + this.boss.mdef + "%", + 1300, + 220 - posy / 2, + "#FFFFFF", + "#000000", + 6, + core.ui._buildFont(44, true) + ); + core.fillBoldText1( + ctx4, + "速度 " + this.boss.speed, + 1700, + 220 - posy / 2, + "#FFFFFF", + "#000000", + 6, + core.ui._buildFont(44, true) + ); + let posx = 600; + this.bossbuff.forEach((v) => { + if (v) { + core.drawIcon(ctx4, v.id, posx, 80 - posy / 2, 64, 64); + core.setTextAlign(ctx4, "right"); + core.fillBoldText1( + ctx4, + v.count, + posx + 50, + 130 - posy / 2, + "#FFFFFF", + "#000000", + 6, + core.ui._buildFont(24, true) + ); + core.setTextAlign(ctx4, "left"); + posx += 80; + } + }); + } else if (this.selection === "") {} else { + core.drawWindowSkin( + "winskin.webp", + ctx4, + 50, + 50 - posy / 2, + 1900, + 200, + null, + null, + null, + 3 + ); + core.fillBoldText1( + ctx4, + this.enemy[this.selection].name, + 100, + 120 - posy / 2, + "#FFFFFF", + "#000000", + 6, + core.ui._buildFont(44, true) + ); + core.fillBoldText1( + ctx4, + "状态", + 500, + 120 - posy / 2, + "#FFFFFF", + "#000000", + 6, + core.ui._buildFont(44, true) + ); + core.fillBoldText1( + ctx4, + "生命 " + this.enemy[this.selection].hp, + 100, + 220 - posy / 2, + "#FFFFFF", + "#000000", + 6, + core.ui._buildFont(44, true) + ); + core.fillBoldText1( + ctx4, + "攻击 " + this.enemy[this.selection].atk, + 500, + 220 - posy / 2, + "#FFFFFF", + "#000000", + 6, + core.ui._buildFont(44, true) + ); + core.fillBoldText1( + ctx4, + "防御 " + this.enemy[this.selection].def, + 900, + 220 - posy / 2, + "#FFFFFF", + "#000000", + 6, + core.ui._buildFont(44, true) + ); + core.fillBoldText1( + ctx4, + "法抗 " + this.enemy[this.selection].mdef + "%", + 1300, + 220 - posy / 2, + "#FFFFFF", + "#000000", + 6, + core.ui._buildFont(44, true) + ); + core.fillBoldText1( + ctx4, + "速度 " + this.enemy[this.selection].speed, + 1700, + 220 - posy / 2, + "#FFFFFF", + "#000000", + 6, + core.ui._buildFont(44, true) + ); + let posx = 600; + this.enemybuff[this.selection].forEach((v) => { + if (v) { + core.drawIcon(ctx4, v.id, posx, 80 - posy / 2, 64, 64); + core.setTextAlign(ctx4, "right"); + core.fillBoldText1( + ctx4, + v.count, + posx + 50, + 130 - posy / 2, + "#FFFFFF", + "#000000", + 6, + core.ui._buildFont(24, true) + ); + core.setTextAlign(ctx4, "left"); + posx += 80; + } + }); + } + ctx4.restore(); + posy -= 10; + if (posy <= 0) { + core.unregisterAnimationFrame("moveStatus"); + this.drawStatus(); + resolve(); + } + } + }); + }); + } + close() { + let globalAlpha = 0, + time = 0; + return new Promise((resolve) => { + core.registerAnimationFrame("closeblack", true, (temptime) => { + if (temptime - time > 1000 / 60) { + time = temptime; + core.clearMap(ctx); + 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; + } + + ctx.globalAlpha = globalAlpha; + + core.fillRect(ctx, 0, 0, 2028, 1248); + globalAlpha += 1 / 30; + ctx.restore(); + if (globalAlpha > 1) { + time = 0; + globalAlpha = 1; + core.unregisterAnimationFrame("closeblack"); + core.unregisterAnimationFrame("enemyanimate"); + boss1.style.display = "none"; + boss2.style.display = "none"; + boss3.style.display = "none"; + boss4.style.display = "none"; + boss5.style.display = "none"; + boss6.style.display = "none"; + boss7.style.display = "none"; + boss8.style.display = "none"; + + core.registerAnimationFrame("closeblack2", true, (temptime) => { + if (temptime - time > 1000 / 60) { + time = temptime; + core.clearMap(ctx); + 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; + } + ctx.globalAlpha = globalAlpha; + core.fillRect(ctx, 0, 0, 2028, 1248, "#000000"); + ctx.restore(); + globalAlpha -= 1 / 30; + if (globalAlpha < 0) { + core.unregisterAnimationFrame("closeblack2"); + + boss.style.display = "none"; + + resolve(); + } + } + }); + } + } + }); + }); + } + + blackBg() { + let globalAlpha = 0, + time = 0, + img = core.material.images.images[this.bg]; + boss1.style.display = "block"; + return new Promise((resolve) => { + core.registerAnimationFrame("bossblack", true, (temptime) => { + if (temptime - time > 1000 / 60) { + time = temptime; + core.clearMap(ctx1); + if (core.domStyle.isVertical) { + ctx1.canvas.width = 1248; + ctx1.canvas.height = 2028; + ctx1.save(); //保存设置 + ctx1.translate(1248, 0); //重新定位右上角为基准 + ctx1.rotate(Math.PI / 2); //旋转90度 + } else { + ctx1.canvas.width = 2028; + ctx1.canvas.height = 1248; + } + + ctx1.globalAlpha = globalAlpha; + + core.fillRect(ctx1, 0, 0, 2028, 1248); + globalAlpha += 1 / 30; + ctx1.restore(); + if (globalAlpha > 1) { + time = 0; + globalAlpha = 0; + core.unregisterAnimationFrame("bossblack"); + core.registerAnimationFrame("bossBg", true, (temptime) => { + if (temptime - time > 1000 / 60) { + time = temptime; + core.clearMap(ctx1); + if (core.domStyle.isVertical) { + ctx1.canvas.width = 1248; + ctx1.canvas.height = 2028; + ctx1.save(); //保存设置 + ctx1.translate(1248, 0); //重新定位右上角为基准 + ctx1.rotate(Math.PI / 2); //旋转90度 + } else { + ctx1.canvas.width = 2028; + ctx1.canvas.height = 1248; + } + + ctx1.globalAlpha = 1; + core.fillRect(ctx1, 0, 0, 2028, 1248); + ctx1.globalAlpha = globalAlpha; + if (img) ctx1.drawImage(img, 0, 0, 2028, 1248); + ctx1.restore(); + globalAlpha += 1 / 30; + if (globalAlpha > 1) { + core.unregisterAnimationFrame("bossBg"); + resolve(); + } + } + }); + } + } + }); + }); + } + } + core.ui.boss = new Boss(); +}, "剧情视频引用": function () { // 在此增加新插件 let a; @@ -16762,1153 +19704,1150 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 = }; }, "musicMode": function () { - // 在此增加新插件 - const music = document.createElement("canvas"); - music.style.position = "absolute"; - music.style.zIndex = 300; - music.style.display = "none"; - music.id = "music"; - main.dom.gameGroup.insertAdjacentElement("afterend", music); - music.style.top = "50%"; - music.style.left = "50%"; - music.style.transform = "translate(-50%,-50%)"; - const ctx = music.getContext("2d"); - main.dom.music = music; - - const audio = core.plugin.audioSystem.bgmController; - - let page = 0; //初始页面 - - let isvolume = false; - - function shuffle(arr) { - let n = arr.length, - random; - while (n) { - random = (Math.random() * n--) >>> 0; - [arr[n], arr[random]] = [arr[random], arr[n]]; - } - return arr; - } - music.addEventListener("mousedown", function (e) { - e.stopPropagation(); - 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.music.mousedown(px * 3, py * 3); - }); - music.addEventListener("mousemove", function (e) { - e.stopPropagation(); - 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.music.mousemove(px * 3, py * 3); - }); - music.addEventListener("mouseup", function (e) { - e.stopPropagation(); - - isvolume = false; - }); - music.addEventListener("mouseleave", function (e) { - e.stopPropagation(); - - isvolume = false; - }); - music.addEventListener("touchstart", function (e) { - e.preventDefault(); - const left = core.dom.gameGroup.offsetLeft; - const top = core.dom.gameGroup.offsetTop; - const px = Math.floor( - (e.touches[0].clientX - left) / core.domStyle.scale - ), - py = Math.floor((e.touches[0].clientY - top) / core.domStyle.scale); - core.ui.music.mousedown(px * 3, py * 3); - }); - music.addEventListener("touchmove", function (e) { - e.stopPropagation(); - const left = core.dom.gameGroup.offsetLeft; - const top = core.dom.gameGroup.offsetTop; - const px = Math.floor( - (e.touches[0].clientX - left) / core.domStyle.scale - ), - py = Math.floor((e.touches[0].clientY - top) / core.domStyle.scale); - core.ui.music.mousemove(px * 3, py * 3); - }); - music.addEventListener("touchend", function (e) { - e.stopPropagation(); - - isvolume = false; - }); - music.addEventListener("touchcancel", function (e) { - e.stopPropagation(); - - isvolume = false; - }); - - class musicclass { - constructor() { - this.musics = ["theme.mp3"]; - //music列表 - //需全塔属性注册并保存在bgms文件夹,每个数组为显示的一页内容 - this.musicMx = [ - [ - "Crawler.opus", - "Blood_Stain.opus", - "Blind_Alley.opus", - "Halbmond.opus", - ], - ["theme.mp3", "op.opus", "Asphodelus_Ceui.opus", "ed.opus"], - ]; - //音乐别名(将在播放器内显示的音乐名,music列表内的都要有对应歌名) - this.musicname = { - "Asphodelus_Ceui.opus": "Asphodelus (Full.ver)", - "Blind_Alley.opus": "Blind Alley", - "Crawler.opus": "Crawler", - "op.opus": "Asphodelus", - "theme.mp3": "One of Episodes", - "ed.opus": "親愛なる世界へ", - "Blood_Stain.opus": "Blood Stain", - "Halbmond.opus": "Halbmond", - }; - this.selection = [0, 0]; - this.stop = false; - this.type = "xunhuan"; - this.randomList = []; - this.random = 0; - } - - //更新 - update() { - this.background(); - this.drawUI(); - } - background() { - //画布大小设置 - if (core.domStyle.isVertical) { - music.width = 1248; - music.height = 2028; - } else { - music.width = 2028; - music.height = 1248; - } - } - - mousedown(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 backbox = makeBox([15, 35], [210, 90]); - if (inRect(pos, backbox)) { - //离开按钮是一致的,其余的记区分横竖屏 - music.style.display = "none"; - core.clearMap(ctx); - - core.unregisterAnimationFrame("music"); - core.restart(); - - return; - } - if (core.domStyle.isVertical) { - //竖屏 - - const pageupbox = makeBox([100, 1230], [200, 100]); - const pagedownbox = makeBox([950, 1230], [200, 100]); - const musicbox = makeBox( - [100, 200], - [1048, this.musicMx[page].length * 100] - ); - const beforebox = makeBox([120, 1620], [100, 100]); - const afterbox = makeBox([780, 1620], [100, 100]); - const playbox = makeBox([420, 1580], [200, 200]); - const typebox = makeBox([1040, 1600], [120, 120]); - - const volumebox = makeBox([250, 1940], [1050, 20]); - if (inRect(pos, pageupbox)) { - if (page !== 0) page -= 1; - return; - } - if (inRect(pos, pagedownbox)) { - if (page !== this.musicMx.length - 1) page += 1; - return; - } - if (inRect(pos, playbox)) { - if (this.stop) { - this.stop = !this.stop; - - core.resumeBgm(); - } else { - this.stop = !this.stop; - core.pauseBgm(); - } - return; - } - if (inRect(pos, beforebox)) { - this.stop = false; - switch (this.type) { - case "danqu": - core.playBgm( - main.core.ui.music.musicMx[main.core.ui.music.selection[0]][ - main.core.ui.music.selection[1] - ], - 0 - ); - - page = this.selection[0]; - - break; - case "xunhuan": - for (;;) { - if (this.selection[1] === 0) { - if (this.selection[0] === 0) { - this.selection[0] = this.musicMx.length - 1; - this.selection[1] = - this.musicMx[this.selection[0]].length - 1; - } else { - this.selection[0] -= 1; - this.selection[1] = - this.musicMx[this.selection[0]].length - 1; - } - } else { - this.selection[1] -= 1; - } - this.random = this.randomList.indexOf( - this.musicMx[this.selection[0]][this.selection[1]] - ); - page = this.selection[0]; - if ( - this.musics.includes( - this.musicMx[this.selection[0]][this.selection[1]] - ) || - page !== this.musicMx.length - 1 - ) - break; - } - core.playBgm( - main.core.ui.music.musicMx[main.core.ui.music.selection[0]][ - main.core.ui.music.selection[1] - ], - 0 - ); - - break; - case "suiji": - for (;;) { - if (this.random > 0) { - this.random -= 1; - } else { - this.random = this.randomList.length - 1; - } - this.selection[0] = this.musicMx.findIndex((v) => - v.includes(this.randomList[this.random]) - ); - this.selection[1] = this.musicMx[this.selection[0]].indexOf( - this.randomList[this.random] - ); - - page = this.selection[0]; - if ( - this.musics.includes( - this.musicMx[this.selection[0]][this.selection[1]] - ) || - page !== this.musicMx.length - 1 - ) - break; - } - core.playBgm( - main.core.ui.music.musicMx[main.core.ui.music.selection[0]][ - main.core.ui.music.selection[1] - ], - 0 - ); - - break; - } - return; - } - if (inRect(pos, afterbox)) { - this.stop = false; - switch (this.type) { - case "danqu": - core.playBgm( - main.core.ui.music.musicMx[main.core.ui.music.selection[0]][ - main.core.ui.music.selection[1] - ], - 0 - ); - - page = this.selection[0]; - break; - case "xunhuan": - for (;;) { - if ( - this.selection[1] === - this.musicMx[this.selection[0]].length - 1 - ) { - if (this.selection[0] === this.musicMx.length - 1) { - this.selection[0] = 0; - this.selection[1] = 0; - } else { - this.selection[0] += 1; - this.selection[1] = 0; - } - } else { - this.selection[1] += 1; - } - this.random = this.randomList.indexOf( - this.musicMx[this.selection[0]][this.selection[1]] - ); - page = this.selection[0]; - if ( - this.musics.includes( - this.musicMx[this.selection[0]][this.selection[1]] - ) || - page !== this.musicMx.length - 1 - ) - break; - } - core.playBgm( - main.core.ui.music.musicMx[main.core.ui.music.selection[0]][ - main.core.ui.music.selection[1] - ], - 0 - ); - - break; - case "suiji": - for (;;) { - if (this.random < this.randomList.length - 1) { - this.random += 1; - } else { - this.random = 0; - } - this.selection[0] = this.musicMx.findIndex((v) => - v.includes(this.randomList[this.random]) - ); - this.selection[1] = this.musicMx[this.selection[0]].indexOf( - this.randomList[this.random] - ); - - page = this.selection[0]; - if ( - this.musics.includes( - this.musicMx[this.selection[0]][this.selection[1]] - ) || - page !== this.musicMx.length - 1 - ) - break; - } - core.playBgm( - main.core.ui.music.musicMx[main.core.ui.music.selection[0]][ - main.core.ui.music.selection[1] - ], - 0 - ); - - break; - } - return; - } - if (inRect(pos, typebox)) { - switch (this.type) { - case "danqu": - this.type = "xunhuan"; - break; - case "xunhuan": - this.type = "suiji"; - break; - case "suiji": - this.type = "danqu"; - break; - } - return; - } - if (inRect(pos, musicbox)) { - const index = Math.floor((py - 200) / 100); - if (page !== this.selection[0] || index !== this.selection[1]) { - if ( - this.musics.includes(this.musicMx[page][index]) || - page !== this.musicMx.length - 1 - ) { - this.selection[0] = page; - - this.selection[1] = index; - this.randomList.indexOf( - this.musicMx[this.selection[0]][this.selection[1]] - ); - - core.playBgm( - main.core.ui.music.musicMx[main.core.ui.music.selection[0]][ - main.core.ui.music.selection[1] - ], - 0 - ); - - this.stop = false; - } - } else { - if (this.stop) { - this.stop = !this.stop; - core.resumeBgm(); - } else { - this.stop = !this.stop; - core.pauseBgm(); - } - } - return; - } - - if (inRect(pos, volumebox)) { - const time = Math.min(Math.max((px - 250) / 800, 0), 1); - audio.setVolume(time); - core.plugin.audioSystem.soundPlayer.setVolume(time); - isvolume = true; - } - } else { - //横屏 - const pageupbox = makeBox([1050, 1100], [200, 100]); - const pagedownbox = makeBox([1550, 1100], [200, 100]); - const musicbox = makeBox( - [900, 100], - [1000, this.musicMx[page].length * 100] - ); - const beforebox = makeBox([60, 620], [100, 100]); - const afterbox = makeBox([450, 620], [100, 100]); - const playbox = makeBox([200, 570], [200, 200]); - const typebox = makeBox([620, 600], [120, 120]); - - const volumebox = makeBox([100, 990], [600, 20]); - if (inRect(pos, pageupbox)) { - if (page !== 0) page -= 1; - return; - } - if (inRect(pos, pagedownbox)) { - if (page !== this.musicMx.length - 1) page += 1; - return; - } - if (inRect(pos, playbox)) { - if (this.stop) { - this.stop = !this.stop; - core.resumeBgm(); - } else { - this.stop = !this.stop; - core.pauseBgm(); - } - return; - } - if (inRect(pos, beforebox)) { - this.stop = false; - switch (this.type) { - case "danqu": - core.playBgm( - main.core.ui.music.musicMx[main.core.ui.music.selection[0]][ - main.core.ui.music.selection[1] - ], - 0 - ); - - page = this.selection[0]; - - break; - case "xunhuan": - for (;;) { - if (this.selection[1] === 0) { - if (this.selection[0] === 0) { - this.selection[0] = this.musicMx.length - 1; - this.selection[1] = - this.musicMx[this.selection[0]].length - 1; - } else { - this.selection[0] -= 1; - this.selection[1] = - this.musicMx[this.selection[0]].length - 1; - } - } else { - this.selection[1] -= 1; - } - this.random = this.randomList.indexOf( - this.musicMx[this.selection[0]][this.selection[1]] - ); - page = this.selection[0]; - - if ( - this.musics.includes( - this.musicMx[this.selection[0]][this.selection[1]] - ) || - page !== this.musicMx.length - 1 - ) - break; - } - core.playBgm( - main.core.ui.music.musicMx[main.core.ui.music.selection[0]][ - main.core.ui.music.selection[1] - ], - 0 - ); - - break; - case "suiji": - for (;;) { - if (this.random > 0) { - this.random -= 1; - } else { - this.random = this.randomList.length - 1; - } - this.selection[0] = this.musicMx.findIndex((v) => - v.includes(this.randomList[this.random]) - ); - this.selection[1] = this.musicMx[this.selection[0]].indexOf( - this.randomList[this.random] - ); - - page = this.selection[0]; - - if ( - this.musics.includes( - this.musicMx[this.selection[0]][this.selection[1]] - ) || - page !== this.musicMx.length - 1 - ) - break; - } - core.playBgm( - main.core.ui.music.musicMx[main.core.ui.music.selection[0]][ - main.core.ui.music.selection[1] - ], - 0 - ); - - break; - } - return; - } - if (inRect(pos, afterbox)) { - this.stop = false; - switch (this.type) { - case "danqu": - core.playBgm( - main.core.ui.music.musicMx[main.core.ui.music.selection[0]][ - main.core.ui.music.selection[1] - ], - 0 - ); - - page = this.selection[0]; - break; - case "xunhuan": - for (;;) { - if ( - this.selection[1] === - this.musicMx[this.selection[0]].length - 1 - ) { - if (this.selection[0] === this.musicMx.length - 1) { - this.selection[0] = 0; - this.selection[1] = 0; - } else { - this.selection[0] += 1; - this.selection[1] = 0; - } - } else { - this.selection[1] += 1; - } - this.randomList.findIndex( - (v) => - v === this.musicMx[this.selection[0]][this.selection[1]] - ); - page = this.selection[0]; - - if ( - this.musics.includes( - this.musicMx[this.selection[0]][this.selection[1]] - ) || - page !== this.musicMx.length - 1 - ) - break; - } - core.playBgm( - main.core.ui.music.musicMx[main.core.ui.music.selection[0]][ - main.core.ui.music.selection[1] - ], - 0 - ); - - break; - case "suiji": - for (;;) { - if (this.random < this.randomList.length - 1) { - this.random += 1; - } else { - this.random = 0; - } - this.selection[0] = this.musicMx.findIndex((v) => - v.includes(this.randomList[this.random]) - ); - this.selection[1] = this.musicMx[this.selection[0]].indexOf( - main.core.ui.music.randomList[main.core.ui.music.random] - ); - - page = this.selection[0]; - if ( - this.musics.includes( - this.musicMx[this.selection[0]][this.selection[1]] - ) || - page !== this.musicMx.length - 1 - ) - break; - } - core.playBgm( - main.core.ui.music.musicMx[main.core.ui.music.selection[0]][ - main.core.ui.music.selection[1] - ], - 0 - ); - - break; - } - return; - } - if (inRect(pos, typebox)) { - switch (this.type) { - case "danqu": - this.type = "xunhuan"; - break; - case "xunhuan": - this.type = "suiji"; - break; - case "suiji": - this.type = "danqu"; - break; - } - return; - } - if (inRect(pos, musicbox)) { - const index = Math.floor((py - 100) / 100); - if (page !== this.selection[0] || index !== this.selection[1]) { - if ( - this.musics.includes(this.musicMx[page][index]) || - page !== this.musicMx.length - 1 - ) { - this.selection[0] = page; - this.selection[1] = index; - this.randomList.indexOf( - (v) => - v === this.musicMx[this.selection[0]][this.selection[1]] - ); - - core.playBgm( - main.core.ui.music.musicMx[main.core.ui.music.selection[0]][ - main.core.ui.music.selection[1] - ], - 0 - ); - this.stop = false; - } - } else { - if (this.stop) { - this.stop = !this.stop; - core.resumeBgm(); - } else { - this.stop = !this.stop; - core.pauseBgm(); - } - } - return; - } - - if (inRect(pos, volumebox)) { - const time = Math.min(Math.max((px - 100) / 600, 0), 1); - audio.setVolume(time); - core.plugin.audioSystem.soundPlayer.setVolume(time); - isvolume = true; - } - } - } - mousemove(px, py) { - if (isvolume) { - if (core.domStyle.isVertical) { - const time = Math.min(Math.max((px - 250) / 800, 0), 1); - audio.setVolume(time); - core.plugin.audioSystem.soundPlayer.setVolume(time); - } else { - const time = Math.min(Math.max((px - 100) / 600, 0), 1); - audio.setVolume(time); - core.plugin.audioSystem.soundPlayer.setVolume(time); - } - } - } - - drawUI() { - //绘制页面 - core.clearMap(music); - 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.3; //透明度 - if (bgVertical) - ctx.drawImage(bgVertical, 0, 0, 1280, 1500, 0, 0, 1248, 2028); //绘制半透明背景图片 - ctx.globalAlpha = 1; //恢复为不透明 - - core.setTextAlign(ctx, "center"); - core.fillBoldText1( - ctx, - "◀离开", - 110, - 100, - "#FFFFFF", - "#000000", - 6, - core.ui._buildFont(66, true) - ); - - ctx.strokeStyle = "#FFFFFF"; - ctx.lineWidth = 3; - ctx.beginPath(); - ctx.moveTo(100, 200); - ctx.lineTo(1148, 200); - - ctx.stroke(); - let posy = 300; - const indexList = this.musicMx[page]; - core.setTextAlign(ctx, "left"); - for (let i = 0; i < indexList.length; i++) { - const text = this.musicname[indexList[i]]; - if ( - this.musics.includes(this.musicMx[page][i]) || - page !== this.musicMx.length - 1 - ) { - core.fillBoldText1( - ctx, - text, - 150, - posy - 30, - page === this.selection[0] && i === this.selection[1] ? - "#FFFFFF" : - "#444444", - "#000000", - 6, - core.ui._buildFont(66, true) - ); - - ctx.strokeStyle = "#FFFFFF"; - ctx.lineWidth = 3; - ctx.beginPath(); - ctx.moveTo(100, posy); - ctx.lineTo(1148, posy); - ctx.stroke(); - } - posy += 100; - } - ctx.beginPath(); - ctx.moveTo(100, 1210); - ctx.lineTo(1148, 1210); - ctx.moveTo(100, 1200); - ctx.lineTo(1148, 1200); - ctx.stroke(); - - core.fillBoldText1( - ctx, - "上一页", - 100, - 1300, - page === 0 ? "#444444" : "#FFFFFF", - "#000000", - 6, - core.ui._buildFont(66, true) - ); - - core.fillBoldText1( - ctx, - page + 1 + "/" + this.musicMx.length, - 580, - 1300, - "#FFFFFF", - "#000000", - 6, - core.ui._buildFont(66, true) - ); - core.fillBoldText1( - ctx, - "下一页", - 950, - 1300, - page === this.musicMx.length - 1 ? "#444444" : "#FFFFFF", - "#000000", - 6, - core.ui._buildFont(66, true) - ); - - ctx.strokeStyle = "#ffffff"; - ctx.lineWidth = 3; - - core.fillBoldText( - ctx, - "|", - 100, - 1697, - "#FFFFFF", - 6, - core.ui._buildFont(96, true) - ); - core.fillBoldText( - ctx, - "◀", - 115, - 1700, - "#FFFFFF", - 6, - core.ui._buildFont(96, true) - ); - - ctx.beginPath(); - ctx.arc(505, 1670, 80, 0, 3 * Math.PI); - ctx.stroke(); - core.fillText( - ctx, - "|", - 835, - 1697, - "#FFFFFF", - core.ui._buildFont(96, true) - ); - core.fillText( - ctx, - "▶", - 785, - 1700, - "#FFFFFF", - core.ui._buildFont(96, true) - ); - - if (this.stop) { - core.fillText( - ctx, - "▶", - 473, - 1700, - "#FFFFFF", - core.ui._buildFont(96, true) - ); - } else { - core.fillText( - ctx, - "||", - 453, - 1700, - "#FFFFFF", - core.ui._buildFont(96, true) - ); - } - - const img = core.material.images.images[this.type + ".webp"]; - if (img) ctx.drawImage(img, 1000, 1555, 200, 200); - core.setTextAlign(ctx, "center"); - ctx.font = "bold 52px Verdana"; - ctx.fillText("当前歌曲", 625, 1397); - ctx.fillText( - this.musicname[this.musicMx[this.selection[0]][this.selection[1]]], - 625, - 1507 - ); - - ctx.fillStyle = "#ffffff"; - ctx.font = "bold 48px Verdana"; - ctx.fillText("音量", 150, 1970); - ctx.lineWidth = 3; - ctx.beginPath(); - ctx.moveTo(250, 1950); - ctx.lineTo(1050, 1950); - ctx.stroke(); - ctx.strokeStyle = "#ffffff"; - ctx.lineWidth = 9; - ctx.fillStyle = "rgba(255,255,255,0.5)"; - - ctx.beginPath(); - ctx.moveTo(250, 1950); - ctx.lineTo(800 * audio.getVolume() + 250, 1950); - ctx.stroke(); - ctx.beginPath(); - ctx.arc(800 * audio.getVolume() + 250, 1950, 10, 0, 2 * Math.PI); - ctx.fill(); - core.fillBoldText1( - ctx, - Math.floor(100 * audio.getVolume()), - 1120, - 1970, - "#FFFFFF", - "#000000", - 6, - core.ui._buildFont(56, true) - ); - } 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) - ); - - ctx.strokeStyle = "#FFFFFF"; - ctx.lineWidth = 3; - ctx.beginPath(); - ctx.moveTo(800, 100); - ctx.lineTo(800, 1148); - ctx.moveTo(900, 100); - ctx.lineTo(1900, 100); - ctx.stroke(); - let posy = 200; - const indexList = this.musicMx[page]; - core.setTextAlign(ctx, "left"); - for (let i = 0; i < indexList.length; i++) { - const text = this.musicname[indexList[i]]; - if ( - this.musics.includes(this.musicMx[page][i]) || - page !== this.musicMx.length - 1 - ) { - core.fillBoldText1( - ctx, - text, - 950, - posy - 30, - page === this.selection[0] && i === this.selection[1] ? - "#FFFFFF" : - "#444444", - "#000000", - 6, - core.ui._buildFont(66, true) - ); - - ctx.strokeStyle = "#FFFFFF"; - ctx.lineWidth = 3; - ctx.beginPath(); - ctx.moveTo(900, posy); - ctx.lineTo(1900, posy); - ctx.stroke(); - } - posy += 100; - } - core.fillBoldText1( - ctx, - "上一页", - 1050, - 1200 - 30, - page === 0 ? "#444444" : "#FFFFFF", - "#000000", - 6, - core.ui._buildFont(66, true) - ); - - core.fillBoldText1( - ctx, - page + 1 + "/" + this.musicMx.length, - 1350, - 1200 - 30, - "#FFFFFF", - "#000000", - 6, - core.ui._buildFont(66, true) - ); - core.fillBoldText1( - ctx, - "下一页", - 1550, - 1200 - 30, - page === this.musicMx.length - 1 ? "#444444" : "#FFFFFF", - "#000000", - 6, - core.ui._buildFont(66, true) - ); - ctx.strokeStyle = "#ffffff"; - ctx.lineWidth = 3; - - core.fillText( - ctx, - "|", - 55, - 697, - "#FFFFFF", - core.ui._buildFont(96, true) - ); - core.fillText( - ctx, - "◀", - 70, - 700, - "#FFFFFF", - core.ui._buildFont(96, true) - ); - - ctx.beginPath(); - ctx.arc(295, 670, 80, 0, 2 * Math.PI); - ctx.stroke(); - if (this.stop) { - core.fillText( - ctx, - "▶", - 265, - 700, - "#FFFFFF", - core.ui._buildFont(96, true) - ); - } else { - core.fillText( - ctx, - "||", - 245, - 700, - "#FFFFFF", - core.ui._buildFont(96, true) - ); - } - core.fillText( - ctx, - "|", - 495, - 697, - "#FFFFFF", - core.ui._buildFont(96, true) - ); - core.fillText( - ctx, - "▶", - 450, - 700, - "#FFFFFF", - core.ui._buildFont(96, true) - ); - - ctx.font = "bold 48px Verdana"; - ctx.fillText("音量", 350, 900); - ctx.beginPath(); - ctx.moveTo(100, 1000); - ctx.lineTo(700, 1000); - ctx.stroke(); - ctx.strokeStyle = "#ffffff"; - ctx.lineWidth = 9; - ctx.fillStyle = "rgba(255,255,255,0.5)"; - - ctx.beginPath(); - ctx.moveTo(100, 1000); - ctx.lineTo(600 * audio.getVolume() + 100, 1000); - ctx.stroke(); - ctx.beginPath(); - ctx.arc(600 * audio.getVolume() + 100, 1000, 10, 0, 2 * Math.PI); - ctx.fill(); - core.fillBoldText1( - ctx, - Math.floor(100 * audio.getVolume()), - 720, - 1010, - "#FFFFFF", - "#000000", - 6, - core.ui._buildFont(56, true) - ); - const img = core.material.images.images[this.type + ".webp"]; - if (img) ctx.drawImage(img, 580, 560, 200, 200); - core.setTextAlign(ctx, "center"); - ctx.font = "bold 48px Verdana"; - ctx.fillText("当前歌曲", 400, 297); - ctx.fillText( - this.musicname[this.musicMx[this.selection[0]][this.selection[1]]], - 400, - 397 - ); - } - } - } - core.ui.music = new musicclass(); - main.dom.musicMode.onclick = function () { - //点击开始页面的CG MODE进入cg回廊 - if ( - (core.getLocalStorage("musics") && - core.getLocalStorage("musics").length === 0) || - !core.getLocalStorage("musics") - ) - core.setLocalStorage("musics", ["theme.mp3"]); - core.ui.music.musics = core.getLocalStorage("musics"); - core.playBgm( - main.core.ui.music.musicMx[main.core.ui.music.selection[0]][ - main.core.ui.music.selection[1] - ], - 0 - ); - - const arr = main.core.ui.music.musicMx.flat(Infinity); - main.core.ui.music.randomList = shuffle(arr); - main.core.ui.music.random = main.core.ui.music.randomList.indexOf( - main.core.ui.music.musicMx[main.core.ui.music.selection[0]][ - main.core.ui.music.selection[1] - ] - ); - page = 0; - music.style.display = "block"; - let time = 0; - core.registerAnimationFrame("music", null, (temptime) => { - if (temptime > time + 1000 / 60) { - time = temptime; - main.core.ui.music.update(); - const duration = - core.plugin.audioSystem.bgmController.player.getRoute( - "bgms." + - main.core.ui.music.musicMx[main.core.ui.music.selection[0]][ - main.core.ui.music.selection[1] - ] - ).duration; - - const currentTime = - core.plugin.audioSystem.bgmController.player.getRoute( - "bgms." + - main.core.ui.music.musicMx[main.core.ui.music.selection[0]][ - main.core.ui.music.selection[1] - ] - ).currentTime; - if (currentTime && duration && duration - currentTime < 0.05) { - if (core.domStyle.isVertical) { - core.ui.music.mousedown(830, 1770); - } else { - core.ui.music.mousedown(475, 765); - } - } - } - }); - }; - loader.prototype.loadOneMusic = function (name) { - /* var music = new Audio(); + // 在此增加新插件 + const music = document.createElement("canvas"); + music.style.position = "absolute"; + music.style.zIndex = 300; + music.style.display = "none"; + music.id = "music"; + main.dom.gameGroup.insertAdjacentElement("afterend", music); + music.style.top = "50%"; + music.style.left = "50%"; + music.style.transform = "translate(-50%,-50%)"; + const ctx = music.getContext("2d"); + main.dom.music = music; + + const audio = core.plugin.audioSystem.bgmController; + + let page = 0; //初始页面 + + let isvolume = false; + + function shuffle(arr) { + let n = arr.length, + random; + while (n) { + random = (Math.random() * n--) >>> 0; + [arr[n], arr[random]] = [arr[random], arr[n]]; + } + return arr; + } + music.addEventListener("mousedown", function (e) { + e.stopPropagation(); + 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.music.mousedown(px * 3, py * 3); + }); + music.addEventListener("mousemove", function (e) { + e.stopPropagation(); + 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.music.mousemove(px * 3, py * 3); + }); + music.addEventListener("mouseup", function (e) { + e.stopPropagation(); + + isvolume = false; + }); + music.addEventListener("mouseleave", function (e) { + e.stopPropagation(); + + isvolume = false; + }); + music.addEventListener("touchstart", function (e) { + e.preventDefault(); + const left = core.dom.gameGroup.offsetLeft; + const top = core.dom.gameGroup.offsetTop; + const px = Math.floor( + (e.touches[0].clientX - left) / core.domStyle.scale + ), + py = Math.floor((e.touches[0].clientY - top) / core.domStyle.scale); + core.ui.music.mousedown(px * 3, py * 3); + }); + music.addEventListener("touchmove", function (e) { + e.stopPropagation(); + const left = core.dom.gameGroup.offsetLeft; + const top = core.dom.gameGroup.offsetTop; + const px = Math.floor( + (e.touches[0].clientX - left) / core.domStyle.scale + ), + py = Math.floor((e.touches[0].clientY - top) / core.domStyle.scale); + core.ui.music.mousemove(px * 3, py * 3); + }); + music.addEventListener("touchend", function (e) { + e.stopPropagation(); + + isvolume = false; + }); + music.addEventListener("touchcancel", function (e) { + e.stopPropagation(); + + isvolume = false; + }); + + class musicclass { + constructor() { + this.musics = ["theme.mp3"]; + //music列表 + //需全塔属性注册并保存在bgms文件夹,每个数组为显示的一页内容 + this.musicMx = [ + [ + "Crawler.opus", + "Blood_Stain.opus", + "Blind_Alley.opus", + "Halbmond.opus", + ], + ["theme.mp3", "op.opus", "Asphodelus_Ceui.opus", "ed.opus"], + ]; + //音乐别名(将在播放器内显示的音乐名,music列表内的都要有对应歌名) + this.musicname = { + "Asphodelus_Ceui.opus": "Asphodelus (Full.ver)", + "Blind_Alley.opus": "Blind Alley", + "Crawler.opus": "Crawler", + "op.opus": "Asphodelus", + "theme.mp3": "One of Episodes", + "ed.opus": "親愛なる世界へ", + "Blood_Stain.opus": "Blood Stain", + "Halbmond.opus": "Halbmond", + }; + this.selection = [0, 0]; + this.stop = false; + this.type = "xunhuan"; + this.randomList = []; + this.random = 0; + } + + //更新 + update() { + this.background(); + this.drawUI(); + } + background() { + //画布大小设置 + if (core.domStyle.isVertical) { + music.width = 1248; + music.height = 2028; + } else { + music.width = 2028; + music.height = 1248; + } + } + + mousedown(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 backbox = makeBox([15, 35], [210, 90]); + if (inRect(pos, backbox)) { + //离开按钮是一致的,其余的记区分横竖屏 + music.style.display = "none"; + core.clearMap(ctx); + + core.unregisterAnimationFrame("music"); + core.restart(); + + return; + } + if (core.domStyle.isVertical) { + //竖屏 + + const pageupbox = makeBox([100, 1230], [200, 100]); + const pagedownbox = makeBox([950, 1230], [200, 100]); + const musicbox = makeBox( + [100, 200], + [1048, this.musicMx[page].length * 100] + ); + const beforebox = makeBox([120, 1620], [100, 100]); + const afterbox = makeBox([780, 1620], [100, 100]); + const playbox = makeBox([420, 1580], [200, 200]); + const typebox = makeBox([1040, 1600], [120, 120]); + + const volumebox = makeBox([250, 1940], [1050, 20]); + if (inRect(pos, pageupbox)) { + if (page !== 0) page -= 1; + return; + } + if (inRect(pos, pagedownbox)) { + if (page !== this.musicMx.length - 1) page += 1; + return; + } + if (inRect(pos, playbox)) { + if (this.stop) { + this.stop = !this.stop; + + core.resumeBgm(); + } else { + this.stop = !this.stop; + core.pauseBgm(); + } + return; + } + if (inRect(pos, beforebox)) { + this.stop = false; + switch (this.type) { + case "danqu": + core.playBgm( + main.core.ui.music.musicMx[main.core.ui.music.selection[0]][ + main.core.ui.music.selection[1] + ], + 0 + ); + + page = this.selection[0]; + + break; + case "xunhuan": + for (;;) { + if (this.selection[1] === 0) { + if (this.selection[0] === 0) { + this.selection[0] = this.musicMx.length - 1; + this.selection[1] = + this.musicMx[this.selection[0]].length - 1; + } else { + this.selection[0] -= 1; + this.selection[1] = + this.musicMx[this.selection[0]].length - 1; + } + } else { + this.selection[1] -= 1; + } + this.random = this.randomList.indexOf( + this.musicMx[this.selection[0]][this.selection[1]] + ); + page = this.selection[0]; + if ( + this.musics.includes( + this.musicMx[this.selection[0]][this.selection[1]] + ) || + page !== this.musicMx.length - 1 + ) + break; + } + core.playBgm( + main.core.ui.music.musicMx[main.core.ui.music.selection[0]][ + main.core.ui.music.selection[1] + ], + 0 + ); + + break; + case "suiji": + for (;;) { + if (this.random > 0) { + this.random -= 1; + } else { + this.random = this.randomList.length - 1; + } + this.selection[0] = this.musicMx.findIndex((v) => + v.includes(this.randomList[this.random]) + ); + this.selection[1] = this.musicMx[this.selection[0]].indexOf( + this.randomList[this.random] + ); + + page = this.selection[0]; + if ( + this.musics.includes( + this.musicMx[this.selection[0]][this.selection[1]] + ) || + page !== this.musicMx.length - 1 + ) + break; + } + core.playBgm( + main.core.ui.music.musicMx[main.core.ui.music.selection[0]][ + main.core.ui.music.selection[1] + ], + 0 + ); + + break; + } + return; + } + if (inRect(pos, afterbox)) { + this.stop = false; + switch (this.type) { + case "danqu": + core.playBgm( + main.core.ui.music.musicMx[main.core.ui.music.selection[0]][ + main.core.ui.music.selection[1] + ], + 0 + ); + + page = this.selection[0]; + break; + case "xunhuan": + for (;;) { + if ( + this.selection[1] === + this.musicMx[this.selection[0]].length - 1 + ) { + if (this.selection[0] === this.musicMx.length - 1) { + this.selection[0] = 0; + this.selection[1] = 0; + } else { + this.selection[0] += 1; + this.selection[1] = 0; + } + } else { + this.selection[1] += 1; + } + this.random = this.randomList.indexOf( + this.musicMx[this.selection[0]][this.selection[1]] + ); + page = this.selection[0]; + if ( + this.musics.includes( + this.musicMx[this.selection[0]][this.selection[1]] + ) || + page !== this.musicMx.length - 1 + ) + break; + } + core.playBgm( + main.core.ui.music.musicMx[main.core.ui.music.selection[0]][ + main.core.ui.music.selection[1] + ], + 0 + ); + + break; + case "suiji": + for (;;) { + if (this.random < this.randomList.length - 1) { + this.random += 1; + } else { + this.random = 0; + } + this.selection[0] = this.musicMx.findIndex((v) => + v.includes(this.randomList[this.random]) + ); + this.selection[1] = this.musicMx[this.selection[0]].indexOf( + this.randomList[this.random] + ); + + page = this.selection[0]; + if ( + this.musics.includes( + this.musicMx[this.selection[0]][this.selection[1]] + ) || + page !== this.musicMx.length - 1 + ) + break; + } + core.playBgm( + main.core.ui.music.musicMx[main.core.ui.music.selection[0]][ + main.core.ui.music.selection[1] + ], + 0 + ); + + break; + } + return; + } + if (inRect(pos, typebox)) { + switch (this.type) { + case "danqu": + this.type = "xunhuan"; + break; + case "xunhuan": + this.type = "suiji"; + break; + case "suiji": + this.type = "danqu"; + break; + } + return; + } + if (inRect(pos, musicbox)) { + const index = Math.floor((py - 200) / 100); + if (page !== this.selection[0] || index !== this.selection[1]) { + if ( + this.musics.includes(this.musicMx[page][index]) || + page !== this.musicMx.length - 1 + ) { + this.selection[0] = page; + + this.selection[1] = index; + this.randomList.indexOf( + this.musicMx[this.selection[0]][this.selection[1]] + ); + + core.playBgm( + main.core.ui.music.musicMx[main.core.ui.music.selection[0]][ + main.core.ui.music.selection[1] + ], + 0 + ); + + this.stop = false; + } + } else { + if (this.stop) { + this.stop = !this.stop; + core.resumeBgm(); + } else { + this.stop = !this.stop; + core.pauseBgm(); + } + } + return; + } + + if (inRect(pos, volumebox)) { + const time = Math.min(Math.max((px - 250) / 800, 0), 1); + audio.setVolume(time); + core.plugin.audioSystem.soundPlayer.setVolume(time); + isvolume = true; + } + } else { + //横屏 + const pageupbox = makeBox([1050, 1100], [200, 100]); + const pagedownbox = makeBox([1550, 1100], [200, 100]); + const musicbox = makeBox( + [900, 100], + [1000, this.musicMx[page].length * 100] + ); + const beforebox = makeBox([60, 620], [100, 100]); + const afterbox = makeBox([450, 620], [100, 100]); + const playbox = makeBox([200, 570], [200, 200]); + const typebox = makeBox([620, 600], [120, 120]); + + const volumebox = makeBox([100, 990], [600, 20]); + if (inRect(pos, pageupbox)) { + if (page !== 0) page -= 1; + return; + } + if (inRect(pos, pagedownbox)) { + if (page !== this.musicMx.length - 1) page += 1; + return; + } + if (inRect(pos, playbox)) { + if (this.stop) { + this.stop = !this.stop; + core.resumeBgm(); + } else { + this.stop = !this.stop; + core.pauseBgm(); + } + return; + } + if (inRect(pos, beforebox)) { + this.stop = false; + switch (this.type) { + case "danqu": + core.playBgm( + main.core.ui.music.musicMx[main.core.ui.music.selection[0]][ + main.core.ui.music.selection[1] + ], + 0 + ); + + page = this.selection[0]; + + break; + case "xunhuan": + for (;;) { + if (this.selection[1] === 0) { + if (this.selection[0] === 0) { + this.selection[0] = this.musicMx.length - 1; + this.selection[1] = + this.musicMx[this.selection[0]].length - 1; + } else { + this.selection[0] -= 1; + this.selection[1] = + this.musicMx[this.selection[0]].length - 1; + } + } else { + this.selection[1] -= 1; + } + this.random = this.randomList.indexOf( + this.musicMx[this.selection[0]][this.selection[1]] + ); + page = this.selection[0]; + + if ( + this.musics.includes( + this.musicMx[this.selection[0]][this.selection[1]] + ) || + page !== this.musicMx.length - 1 + ) + break; + } + core.playBgm( + main.core.ui.music.musicMx[main.core.ui.music.selection[0]][ + main.core.ui.music.selection[1] + ], + 0 + ); + + break; + case "suiji": + for (;;) { + if (this.random > 0) { + this.random -= 1; + } else { + this.random = this.randomList.length - 1; + } + this.selection[0] = this.musicMx.findIndex((v) => + v.includes(this.randomList[this.random]) + ); + this.selection[1] = this.musicMx[this.selection[0]].indexOf( + this.randomList[this.random] + ); + + page = this.selection[0]; + + if ( + this.musics.includes( + this.musicMx[this.selection[0]][this.selection[1]] + ) || + page !== this.musicMx.length - 1 + ) + break; + } + core.playBgm( + main.core.ui.music.musicMx[main.core.ui.music.selection[0]][ + main.core.ui.music.selection[1] + ], + 0 + ); + + break; + } + return; + } + if (inRect(pos, afterbox)) { + this.stop = false; + switch (this.type) { + case "danqu": + core.playBgm( + main.core.ui.music.musicMx[main.core.ui.music.selection[0]][ + main.core.ui.music.selection[1] + ], + 0 + ); + + page = this.selection[0]; + break; + case "xunhuan": + for (;;) { + if ( + this.selection[1] === + this.musicMx[this.selection[0]].length - 1 + ) { + if (this.selection[0] === this.musicMx.length - 1) { + this.selection[0] = 0; + this.selection[1] = 0; + } else { + this.selection[0] += 1; + this.selection[1] = 0; + } + } else { + this.selection[1] += 1; + } + this.randomList.findIndex( + (v) => + v === this.musicMx[this.selection[0]][this.selection[1]] + ); + page = this.selection[0]; + + if ( + this.musics.includes( + this.musicMx[this.selection[0]][this.selection[1]] + ) || + page !== this.musicMx.length - 1 + ) + break; + } + core.playBgm( + main.core.ui.music.musicMx[main.core.ui.music.selection[0]][ + main.core.ui.music.selection[1] + ], + 0 + ); + + break; + case "suiji": + for (;;) { + if (this.random < this.randomList.length - 1) { + this.random += 1; + } else { + this.random = 0; + } + this.selection[0] = this.musicMx.findIndex((v) => + v.includes(this.randomList[this.random]) + ); + this.selection[1] = this.musicMx[this.selection[0]].indexOf( + main.core.ui.music.randomList[main.core.ui.music.random] + ); + + page = this.selection[0]; + if ( + this.musics.includes( + this.musicMx[this.selection[0]][this.selection[1]] + ) || + page !== this.musicMx.length - 1 + ) + break; + } + core.playBgm( + main.core.ui.music.musicMx[main.core.ui.music.selection[0]][ + main.core.ui.music.selection[1] + ], + 0 + ); + + break; + } + return; + } + if (inRect(pos, typebox)) { + switch (this.type) { + case "danqu": + this.type = "xunhuan"; + break; + case "xunhuan": + this.type = "suiji"; + break; + case "suiji": + this.type = "danqu"; + break; + } + return; + } + if (inRect(pos, musicbox)) { + const index = Math.floor((py - 100) / 100); + if (page !== this.selection[0] || index !== this.selection[1]) { + if ( + this.musics.includes(this.musicMx[page][index]) || + page !== this.musicMx.length - 1 + ) { + this.selection[0] = page; + this.selection[1] = index; + this.randomList.indexOf( + (v) => + v === this.musicMx[this.selection[0]][this.selection[1]] + ); + + core.playBgm( + main.core.ui.music.musicMx[main.core.ui.music.selection[0]][ + main.core.ui.music.selection[1] + ], + 0 + ); + this.stop = false; + } + } else { + if (this.stop) { + this.stop = !this.stop; + core.resumeBgm(); + } else { + this.stop = !this.stop; + core.pauseBgm(); + } + } + return; + } + + if (inRect(pos, volumebox)) { + const time = Math.min(Math.max((px - 100) / 600, 0), 1); + audio.setVolume(time); + core.plugin.audioSystem.soundPlayer.setVolume(time); + isvolume = true; + } + } + } + mousemove(px, py) { + if (isvolume) { + if (core.domStyle.isVertical) { + const time = Math.min(Math.max((px - 250) / 800, 0), 1); + audio.setVolume(time); + core.plugin.audioSystem.soundPlayer.setVolume(time); + } else { + const time = Math.min(Math.max((px - 100) / 600, 0), 1); + audio.setVolume(time); + core.plugin.audioSystem.soundPlayer.setVolume(time); + } + } + } + + drawUI() { + //绘制页面 + core.clearMap(music); + 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.3; //透明度 + if (bgVertical) + ctx.drawImage(bgVertical, 0, 0, 1280, 1500, 0, 0, 1248, 2028); //绘制半透明背景图片 + ctx.globalAlpha = 1; //恢复为不透明 + + core.setTextAlign(ctx, "center"); + core.fillBoldText1( + ctx, + "◀离开", + 110, + 100, + "#FFFFFF", + "#000000", + 6, + core.ui._buildFont(66, true) + ); + + ctx.strokeStyle = "#FFFFFF"; + ctx.lineWidth = 3; + ctx.beginPath(); + ctx.moveTo(100, 200); + ctx.lineTo(1148, 200); + + ctx.stroke(); + let posy = 300; + const indexList = this.musicMx[page]; + core.setTextAlign(ctx, "left"); + for (let i = 0; i < indexList.length; i++) { + const text = this.musicname[indexList[i]]; + if ( + this.musics.includes(this.musicMx[page][i]) || + page !== this.musicMx.length - 1 + ) { + core.fillBoldText1( + ctx, + text, + 150, + posy - 30, + page === this.selection[0] && i === this.selection[1] + ? "#FFFFFF" + : "#444444", + "#000000", + 6, + core.ui._buildFont(66, true) + ); + + ctx.strokeStyle = "#FFFFFF"; + ctx.lineWidth = 3; + ctx.beginPath(); + ctx.moveTo(100, posy); + ctx.lineTo(1148, posy); + ctx.stroke(); + } + posy += 100; + } + ctx.beginPath(); + ctx.moveTo(100, 1210); + ctx.lineTo(1148, 1210); + ctx.moveTo(100, 1200); + ctx.lineTo(1148, 1200); + ctx.stroke(); + + core.fillBoldText1( + ctx, + "上一页", + 100, + 1300, + page === 0 ? "#444444" : "#FFFFFF", + "#000000", + 6, + core.ui._buildFont(66, true) + ); + + core.fillBoldText1( + ctx, + page + 1 + "/" + this.musicMx.length, + 580, + 1300, + "#FFFFFF", + "#000000", + 6, + core.ui._buildFont(66, true) + ); + core.fillBoldText1( + ctx, + "下一页", + 950, + 1300, + page === this.musicMx.length - 1 ? "#444444" : "#FFFFFF", + "#000000", + 6, + core.ui._buildFont(66, true) + ); + + ctx.strokeStyle = "#ffffff"; + ctx.lineWidth = 3; + + core.fillBoldText( + ctx, + "|", + 100, + 1697, + "#FFFFFF", + 6, + core.ui._buildFont(96, true) + ); + core.fillBoldText( + ctx, + "◀", + 115, + 1700, + "#FFFFFF", + 6, + core.ui._buildFont(96, true) + ); + + ctx.beginPath(); + ctx.arc(505, 1670, 80, 0, 3 * Math.PI); + ctx.stroke(); + core.fillText( + ctx, + "|", + 835, + 1697, + "#FFFFFF", + core.ui._buildFont(96, true) + ); + core.fillText( + ctx, + "▶", + 785, + 1700, + "#FFFFFF", + core.ui._buildFont(96, true) + ); + + if (this.stop) { + core.fillText( + ctx, + "▶", + 473, + 1700, + "#FFFFFF", + core.ui._buildFont(96, true) + ); + } else { + core.fillText( + ctx, + "||", + 453, + 1700, + "#FFFFFF", + core.ui._buildFont(96, true) + ); + } + + const img = core.material.images.images[this.type + ".webp"]; + if (img) ctx.drawImage(img, 1000, 1555, 200, 200); + core.setTextAlign(ctx, "center"); + ctx.font = "bold 52px Verdana"; + ctx.fillText("当前歌曲", 625, 1397); + ctx.fillText( + this.musicname[this.musicMx[this.selection[0]][this.selection[1]]], + 625, + 1507 + ); + + ctx.fillStyle = "#ffffff"; + ctx.font = "bold 48px Verdana"; + ctx.fillText("音量", 150, 1970); + ctx.lineWidth = 3; + ctx.beginPath(); + ctx.moveTo(250, 1950); + ctx.lineTo(1050, 1950); + ctx.stroke(); + ctx.strokeStyle = "#ffffff"; + ctx.lineWidth = 9; + ctx.fillStyle = "rgba(255,255,255,0.5)"; + + ctx.beginPath(); + ctx.moveTo(250, 1950); + ctx.lineTo(800 * audio.getVolume() + 250, 1950); + ctx.stroke(); + ctx.beginPath(); + ctx.arc(800 * audio.getVolume() + 250, 1950, 10, 0, 2 * Math.PI); + ctx.fill(); + core.fillBoldText1( + ctx, + Math.floor(100 * audio.getVolume()), + 1120, + 1970, + "#FFFFFF", + "#000000", + 6, + core.ui._buildFont(56, true) + ); + } 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) + ); + + ctx.strokeStyle = "#FFFFFF"; + ctx.lineWidth = 3; + ctx.beginPath(); + ctx.moveTo(800, 100); + ctx.lineTo(800, 1148); + ctx.moveTo(900, 100); + ctx.lineTo(1900, 100); + ctx.stroke(); + let posy = 200; + const indexList = this.musicMx[page]; + core.setTextAlign(ctx, "left"); + for (let i = 0; i < indexList.length; i++) { + const text = this.musicname[indexList[i]]; + if ( + this.musics.includes(this.musicMx[page][i]) || + page !== this.musicMx.length - 1 + ) { + core.fillBoldText1( + ctx, + text, + 950, + posy - 30, + page === this.selection[0] && i === this.selection[1] + ? "#FFFFFF" + : "#444444", + "#000000", + 6, + core.ui._buildFont(66, true) + ); + + ctx.strokeStyle = "#FFFFFF"; + ctx.lineWidth = 3; + ctx.beginPath(); + ctx.moveTo(900, posy); + ctx.lineTo(1900, posy); + ctx.stroke(); + } + posy += 100; + } + core.fillBoldText1( + ctx, + "上一页", + 1050, + 1200 - 30, + page === 0 ? "#444444" : "#FFFFFF", + "#000000", + 6, + core.ui._buildFont(66, true) + ); + + core.fillBoldText1( + ctx, + page + 1 + "/" + this.musicMx.length, + 1350, + 1200 - 30, + "#FFFFFF", + "#000000", + 6, + core.ui._buildFont(66, true) + ); + core.fillBoldText1( + ctx, + "下一页", + 1550, + 1200 - 30, + page === this.musicMx.length - 1 ? "#444444" : "#FFFFFF", + "#000000", + 6, + core.ui._buildFont(66, true) + ); + ctx.strokeStyle = "#ffffff"; + ctx.lineWidth = 3; + + core.fillText( + ctx, + "|", + 55, + 697, + "#FFFFFF", + core.ui._buildFont(96, true) + ); + core.fillText( + ctx, + "◀", + 70, + 700, + "#FFFFFF", + core.ui._buildFont(96, true) + ); + + ctx.beginPath(); + ctx.arc(295, 670, 80, 0, 2 * Math.PI); + ctx.stroke(); + if (this.stop) { + core.fillText( + ctx, + "▶", + 265, + 700, + "#FFFFFF", + core.ui._buildFont(96, true) + ); + } else { + core.fillText( + ctx, + "||", + 245, + 700, + "#FFFFFF", + core.ui._buildFont(96, true) + ); + } + core.fillText( + ctx, + "|", + 495, + 697, + "#FFFFFF", + core.ui._buildFont(96, true) + ); + core.fillText( + ctx, + "▶", + 450, + 700, + "#FFFFFF", + core.ui._buildFont(96, true) + ); + + ctx.font = "bold 48px Verdana"; + ctx.fillText("音量", 350, 900); + ctx.beginPath(); + ctx.moveTo(100, 1000); + ctx.lineTo(700, 1000); + ctx.stroke(); + ctx.strokeStyle = "#ffffff"; + ctx.lineWidth = 9; + ctx.fillStyle = "rgba(255,255,255,0.5)"; + + ctx.beginPath(); + ctx.moveTo(100, 1000); + ctx.lineTo(600 * audio.getVolume() + 100, 1000); + ctx.stroke(); + ctx.beginPath(); + ctx.arc(600 * audio.getVolume() + 100, 1000, 10, 0, 2 * Math.PI); + ctx.fill(); + core.fillBoldText1( + ctx, + Math.floor(100 * audio.getVolume()), + 720, + 1010, + "#FFFFFF", + "#000000", + 6, + core.ui._buildFont(56, true) + ); + const img = core.material.images.images[this.type + ".webp"]; + if (img) ctx.drawImage(img, 580, 560, 200, 200); + core.setTextAlign(ctx, "center"); + ctx.font = "bold 48px Verdana"; + ctx.fillText("当前歌曲", 400, 297); + ctx.fillText( + this.musicname[this.musicMx[this.selection[0]][this.selection[1]]], + 400, + 397 + ); + } + } + } + core.ui.music = new musicclass(); + main.dom.musicMode.onclick = function () { + //点击开始页面的CG MODE进入cg回廊 + if ( + (core.getLocalStorage("musics") && + core.getLocalStorage("musics").length === 0) || + !core.getLocalStorage("musics") + ) + core.setLocalStorage("musics", ["theme.mp3"]); + core.ui.music.musics = core.getLocalStorage("musics"); + core.playBgm( + main.core.ui.music.musicMx[main.core.ui.music.selection[0]][ + main.core.ui.music.selection[1] + ], + 0 + ); + + const arr = main.core.ui.music.musicMx.flat(Infinity); + main.core.ui.music.randomList = shuffle(arr); + main.core.ui.music.random = main.core.ui.music.randomList.indexOf( + main.core.ui.music.musicMx[main.core.ui.music.selection[0]][ + main.core.ui.music.selection[1] + ] + ); + page = 0; + music.style.display = "block"; + let time = 0; + core.registerAnimationFrame("music", null, (temptime) => { + if (temptime > time + 1000 / 60) { + time = temptime; + main.core.ui.music.update(); + const duration = + core.plugin.audioSystem.bgmController.player.getRoute( + "bgms." + + main.core.ui.music.musicMx[main.core.ui.music.selection[0]][ + main.core.ui.music.selection[1] + ] + ).duration; + + const currentTime = + core.plugin.audioSystem.bgmController.player.getRoute( + "bgms." + + main.core.ui.music.musicMx[main.core.ui.music.selection[0]][ + main.core.ui.music.selection[1] + ] + ).currentTime; + if (currentTime && duration && duration - currentTime < 0.05) { + if (core.domStyle.isVertical) { + core.ui.music.mousedown(830, 1770); + } else { + core.ui.music.mousedown(475, 765); + } + } + } + }); + }; + loader.prototype.loadOneMusic = function (name) { + /* var music = new Audio(); music.preload = "none"; if (main.bgmRemote) music.src = main.bgmRemoteRoot + core.firstData.name + "/" + name; else music.src = "project/bgms/" + name; music.loop = "loop"; core.material.bgms[name] = music;*/ - }; -}, + }; + }, "横屏切换": function () { // 在此增加新插件 this.triggerFullscreen = async function (full) { @@ -18036,7 +20975,7 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 = core.plugin.playing.add(data); }; core.registerAnimationFrame("animateonmap", true, function (timestamp) { - if (timestamp - thistime > 1000 / 60) { + if (timestamp - thistime > 1000 / 30) { thistime = timestamp; core.clearMap(anctx); core.plugin.playing.forEach((one) => { @@ -18525,1044 +21464,2220 @@ 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"); + core.plugin.playingattack = new Set(); + const ctx6 = main.dom.animate2.getContext("2d"); + let easy = false; + const { imagelighter } = core.plugin.utils; + + function playanimate(name, x, y, scalex = 1, scaley = 1) { + const data = { + name: name, + x: x, + y: y, + scalex: scalex, + scaley: scaley, + farme: 0, + }; + core.plugin.playingattack.add(data); + } + + function playinganimate() { + let time = 0; + if (core.plugin.playingattack.size === 0) return Promise.resolve(); + return new Promise((resolve) => { + core.registerAnimationFrame("animateenemyattack", true, (timestamp) => { + if (timestamp - time > 1000 / 60) { + time = timestamp; + core.clearMap(ctx6); + + core.plugin.playingattack.forEach((one) => { + const data = flags["animate_" + one.name]; + + if (!data) { + core.plugin.playingattack.delete(one); + if (core.plugin.playingattack.size === 0) { + core.unregisterAnimationFrame("animateenemyattack"); + resolve(); + } + } 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; + + ctx6.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; + + core.drawImage( + ctx6, + 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++; + ctx6.restore(); + if (one.farme > data.allFarme) { + core.clearMap(ctx6); + core.plugin.playingattack.delete(one); + if (core.plugin.playingattack.size === 0) { + core.unregisterAnimationFrame("animateenemyattack"); + resolve(); + } + } + } + }); + } + }); + }); + } + + main.dom.gameDraw.appendChild(animateAttack); + const { lcm, gcd } = core.plugin.utils; + + function animateonAttack(name, onenemy) { + if (onenemy) { + playanimate(name, 290, 180); + } else { + playanimate(name, 130, 180); + } + } + + this.attackAnimate = function ( + enemyId, + heroInfo, + enemyInfo, + equipInfo, + oneTurn, + heroDiffList, + enemyDiffList, + heroanimateList, + enemyanimateList + ) { + //参数分别为怪物id、真实属性,战斗信息,特殊装备(如火焰风衣)属性特殊装备属性为以元组{equipId,oneDamage,speed,now:0}构成的数组(列出每个需要计算的特殊装备,没有则为空数组或不填) + core.lockControl(); + core.clearMap(ctx); + core.status.event.id = "attackAnimate"; + let turn = 0; + enemyInfo.id = enemyId; + enemyInfo.cls = core.getClsFromId(enemyId); + enemyInfo.name = core.material.enemys[enemyId].name; + let max = heroInfo.speed + if (enemyInfo.speed > max) max = enemyInfo.speed + equipInfo.forEach(v => { if (v.speed > max) max = v.speed }) + let i = 0 + while (oneTurn * i / max < 15) { + i++ + } + if (heroInfo.onAttack) heroInfo.now *= i + if (enemyInfo.onAttack) enemyInfo.now *= i + equipInfo.forEach(v => { if (v.onAttack) v.now *= i }) + oneTurn *= i + console.log([oneTurn, heroInfo.now, enemyInfo.now]) + let time = 0, + farme = 0; + return new Promise((res) => { + core.plugin.battle_onclick = function (x, y, 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 easybox = makeBox([90, 232], [80, 22]), + easyclosebox = makeBox([290, 232], [40, 22]), + uneasybox = makeBox([265, 330], [65, 20]), + uneasyclosebox = makeBox([290, 350], [40, 20]); + if (inRect(pos, easybox) && easy) { + easy = false; + } else if (inRect(pos, uneasybox) && !easy) { + easy = true; + } else if ( + (inRect(pos, easyclosebox) && easy) || + (inRect(pos, uneasyclosebox) && !easy) + ) { + core.status.event.id = ""; + core.unregisterAnimationFrame("attackAnimate"); + core.clearMap(ctx); + core.closePanel(); + res(); + } + }; + async function drawAttackAnimate( + heroInfo, + oneTurn, + enemyInfo, + equipInfo, + farme, + heroDiffList, + enemyDiffList, + heroanimateList, + enemyanimateList + ) { + core.lockControl(); + core.status.event.id = "battle"; + + let attack = false; + if (heroInfo.isAttack) attack = true; + if (enemyInfo.isAttack) attack = true; + equipInfo.forEach(function (v) { + if (v.isAttack) attack = true; + }); + let onAttack = false; + if (heroInfo.onAttack) onAttack = true; + if (enemyInfo.onAttack) onAttack = true; + equipInfo.forEach(function (v) { + if (v.onAttack) onAttack = true; + }); + core.clearMap(ctx); + let animate = Math.floor(farme / 30); + if (easy) { + core.fillRect(ctx, 64, 52, 288, 212, "rgba(0,0,0,0.5)"); + core.strokeRect(ctx, 64, 52, 288, 212, "rgba(255,255,255,0.5)", 4); + core.setTextAlign(ctx, "center"); + core.fillBoldText( + ctx, + hero.name, + 127, + 148, + "#FFFFFF", + "#000000", + "bold 14px Verdana" + ); + core.setTextAlign(ctx, "left"); + core.drawIcon(ctx, "hp", 70, 210, 16, 16); + core.fillBoldText( + ctx, + "生命 " + core.formatBigNumber(heroInfo.hp, true), + 90, + 225, + "#FFFFFF", + "#000000", + "bold 14px Arial" + ); + + core.fillBoldText( + ctx, + "详细模式", + 90, + 250, + "#FFFF60", + "#000000", + "bold 18px Verdana" + ); + + core.strokeRect(ctx, 112, 159, 32, 48, "rgba(255,255,255,1)", 1); + let img = + attack && heroDiffList[turn].hp < 0 ? + imagelighter(core.material.images.images["hero.webp"]) : + attack && heroDiffList[turn].hp > 0 ? + imagelighter( + core.material.images.images["hero.webp"], + "rgba(0, 255, 0, 0.5)" + ) : + core.material.images.images["hero.webp"]; + core.drawImage( + ctx, + img, + 32 * (animate % 4), + 0, + 32, + 48, + 112, + 159, + 32, + 48 + ); + + core.setTextAlign(ctx, "center"); + core.fillBoldText( + ctx, + enemyInfo.name, + 289, + 148, + "#FFFFFF", + "#000000", + "bold 14px Verdana" + ); + + core.setTextAlign(ctx, "right"); + if (enemyInfo.cls === "enemys") { + core.strokeRect(ctx, 272, 175, 32, 32, "rgba(255,255,255,1)", 1); + let img = + attack && enemyDiffList[turn].hp < 0 ? + imagelighter(core.getBlockInfo(enemyInfo.id).image) : + attack && enemyDiffList[turn].hp > 0 ? + imagelighter( + core.getBlockInfo(enemyInfo.id).image, + "rgba(0, 255, 0, 0.5)" + ) : + core.getBlockInfo(enemyInfo.id).image; + core.drawImage( + ctx, + img, + 32 * (animate % 2), + core.getBlockInfo(enemyInfo.id).posY * 32, + 32, + 32, + 272, + 175, + 32, + 32 + ); + } else { + core.strokeRect(ctx, 272, 159, 32, 48, "rgba(255,255,255,1)", 1); + let img = + attack && enemyDiffList[turn].hp < 0 ? + imagelighter(core.getBlockInfo(enemyInfo.id).image) : + attack && enemyDiffList[turn].hp > 0 ? + imagelighter( + core.getBlockInfo(enemyInfo.id).image, + "rgba(0, 255, 0, 0.5)" + ) : + core.getBlockInfo(enemyInfo.id).image; + core.drawImage( + ctx, + img, + 32 * (animate % 4), + core.getBlockInfo(enemyInfo.id).posY * 48, + 32, + 48, + 272, + 159, + 32, + 48 + ); + } + core.drawIcon(ctx, "hp", 330, 210, 16, 16); + + core.fillBoldText( + ctx, + core.formatBigNumber(enemyInfo.hp, true) + " 生命", + 330, + 225, + "#FFFFFF", + "#000000", + "bold 14px Verdana" + ); + core.fillBoldText( + ctx, + "跳过", + 330, + 250, + "#FFFF60", + "#000000", + "bold 18px Verdana" + ); + + core.fillBoldText( + ctx, + "V", + 219, + 183, + "#FFFFFF", + "#000000", + "bold 48px pala" + ); + core.fillBoldText( + ctx, + "s", + 231, + 183, + "#FFFFFF", + "#000000", + "bold 36px pala" + ); + + if (!attack && !onAttack) enemyInfo.now += enemyInfo.speed; + let enemynow = Math.min(100 + (enemyInfo.now / oneTurn) * 215, 315); + ctx.fillStyle = "#FFFFFF"; + ctx.beginPath(); + ctx.moveTo(enemynow, 120); + ctx.lineTo(enemynow + 5, 110); + ctx.lineTo(enemynow - 5, 110); + 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, + 74, + 32, + 32 + ); + } else { + core.drawImage( + ctx, + core.getBlockInfo(enemyInfo.id).image, + 32, + core.getBlockInfo(enemyInfo.id).posY * 48, + 32, + 48, + enemynow - 16, + 58, + 32, + 48 + ); + } + core.drawLine(ctx, 100, 125, 315, 125, "#FFFFFF", 5); + equipInfo.forEach(function (v) { + if (!attack && !onAttack) v.now += v.speed; + let vnow = Math.min(100 + (v.now / oneTurn) * 215, 315); + ctx.beginPath(); + ctx.moveTo(vnow, 120); + ctx.lineTo(vnow + 5, 110); + ctx.lineTo(vnow - 5, 110); + ctx.closePath(); + + ctx.fill(); + + core.drawIcon(ctx, v.id, vnow - 16, 54, 32, 32); + }); + if (!attack && !onAttack) heroInfo.now += hero.speed; + let heronow = Math.min(100 + (heroInfo.now / oneTurn) * 215, 315); + ctx.beginPath(); + ctx.moveTo(heronow, 120); + ctx.lineTo(heronow + 5, 110); + ctx.lineTo(heronow - 5, 110); + ctx.closePath(); + + ctx.fill(); + core.drawImage( + ctx, + "hero.webp", + 0, + 0, + 32, + 48, + heronow - 16, + 58, + 32, + 48 + ); + } else { + core.fillRect(ctx, 64, 52, 288, 320, "rgba(0,0,0,0.5)"); + core.strokeRect(ctx, 64, 52, 288, 320, "rgba(255,255,255,0.5)", 4); + core.setTextAlign(ctx, "center"); + core.fillBoldText( + ctx, + hero.name, + 127, + 148, + "#FFFFFF", + "#000000", + "bold 14px Verdana" + ); + core.setTextAlign(ctx, "left"); + core.drawIcon(ctx, "hp", 70, 210, 16, 16); + core.drawIcon(ctx, "atk", 70, 230, 16, 16); + core.drawIcon(ctx, "def", 70, 250, 16, 16); + core.drawIcon(ctx, "I374", 70, 270, 16, 16); + core.drawIcon(ctx, "I375", 70, 290, 16, 16); + core.drawIcon(ctx, "mdef", 70, 310, 16, 16); + core.drawIcon(ctx, "amulet", 70, 330, 16, 16); + core.drawIcon(ctx, "jumpShoes", 70, 350, 16, 16); + core.fillBoldText( + ctx, + "生命 " + core.formatBigNumber(heroInfo.hp, true), + 90, + 225, + "#FFFFFF", + "#000000", + "bold 14px Arial" + ); + + core.fillBoldText( + ctx, + "攻击 " + core.formatBigNumber(heroInfo.atk), + 90, + 245, + "#FFFFFF", + "#000000", + "bold 14px Arial" + ); + core.fillBoldText( + ctx, + "防御 " + core.formatBigNumber(heroInfo.def), + 90, + 265, + "#FFFFFF", + "#000000", + "bold 14px Arial" + ); + core.fillBoldText( + ctx, + "法强 " + core.formatBigNumber(heroInfo.spell), + 90, + 285, + "#FFFFFF", + "#000000", + "bold 14px Arial" + ); + core.fillBoldText( + ctx, + "法攻 " + core.formatBigNumber(heroInfo.matk), + 90, + 305, + "#FFFFFF", + "#000000", + "bold 14px Arial" + ); + core.fillBoldText( + ctx, + "护盾 " + core.formatBigNumber(heroInfo.mhp), + 90, + 325, + "#FFFFFF", + "#000000", + "bold 14px Arial" + ); + core.fillBoldText( + ctx, + "法抗 " + heroInfo.mdef + "%", + 90, + 345, + "#FFFFFF", + "#000000", + "bold 14px Arial" + ); + core.fillBoldText( + ctx, + "速度 " + core.formatBigNumber(heroInfo.speed), + 90, + 365, + "#FFFFFF", + "#000000", + "bold 14px Arial" + ); + + core.strokeRect(ctx, 112, 159, 32, 48, "rgba(255,255,255,1)", 1); + let img = + attack && heroDiffList[turn].hp < 0 ? + imagelighter(core.material.images.images["hero.webp"]) : + attack && heroDiffList[turn].hp > 0 ? + imagelighter( + core.material.images.images["hero.webp"], + "rgba(0, 255, 0, 0.5)" + ) : + core.material.images.images["hero.webp"]; + core.drawImage( + ctx, + img, + 32 * (animate % 4), + 0, + 32, + 48, + 112, + 159, + 32, + 48 + ); + + core.setTextAlign(ctx, "center"); + core.fillBoldText( + ctx, + enemyInfo.name, + 289, + 148, + "#FFFFFF", + "#000000", + "bold 14px Verdana" + ); + + core.setTextAlign(ctx, "right"); + if (enemyInfo.cls === "enemys") { + core.strokeRect(ctx, 272, 175, 32, 32, "rgba(255,255,255,1)", 1); + let img = + attack && enemyDiffList[turn].hp < 0 ? + imagelighter(core.getBlockInfo(enemyInfo.id).image) : + attack && enemyDiffList[turn].hp > 0 ? + imagelighter( + core.getBlockInfo(enemyInfo.id).image, + "rgba(0, 255, 0, 0.5)" + ) : + core.getBlockInfo(enemyInfo.id).image; + core.drawImage( + ctx, + img, + 32 * (animate % 2), + core.getBlockInfo(enemyInfo.id).posY * 32, + 32, + 32, + 272, + 175, + 32, + 32 + ); + } else { + core.strokeRect(ctx, 272, 159, 32, 48, "rgba(255,255,255,1)", 1); + let img = + attack && enemyDiffList[turn].hp < 0 ? + imagelighter(core.getBlockInfo(enemyInfo.id).image) : + attack && enemyDiffList[turn].hp > 0 ? + imagelighter( + core.getBlockInfo(enemyInfo.id).image, + "rgba(0, 255, 0, 0.5)" + ) : + core.getBlockInfo(enemyInfo.id).image; + core.drawImage( + ctx, + img, + 32 * (animate % 4), + core.getBlockInfo(enemyInfo.id).posY * 48, + 32, + 48, + 272, + 159, + 32, + 48 + ); + } + core.drawIcon(ctx, "hp", 330, 210, 16, 16); + core.drawIcon(ctx, "atk", 330, 230, 16, 16); + core.drawIcon(ctx, "def", 330, 250, 16, 16); + core.drawIcon(ctx, "I374", 330, 270, 16, 16); + core.drawIcon(ctx, "amulet", 330, 290, 16, 16); + core.drawIcon(ctx, "jumpShoes", 330, 310, 16, 16); + core.fillBoldText( + ctx, + core.formatBigNumber(enemyInfo.hp, true) + " 生命", + 330, + 225, + "#FFFFFF", + "#000000", + "bold 14px Arial" + ); + core.fillBoldText( + ctx, + core.formatBigNumber(enemyInfo.atk) + " 攻击", + 330, + 245, + "#FFFFFF", + "#000000", + "bold 14px Arial" + ); + core.fillBoldText( + ctx, + core.formatBigNumber(enemyInfo.def) + " 防御", + 330, + 265, + "#FFFFFF", + "#000000", + "bold 14px Arial" + ); + core.fillBoldText( + ctx, + (enemyInfo.spell ?? 0) + " 法强", + 330, + 285, + "#FFFFFF", + "#000000", + "bold 14px Arial" + ); + core.fillBoldText( + ctx, + (enemyInfo.mdef ?? 0) * 100 + "% 法抗", + 330, + 305, + "#FFFFFF", + "#000000", + "bold 14px Arial" + ); + core.fillBoldText( + ctx, + core.formatBigNumber(enemyInfo.speed) + " 速度", + 330, + 325, + "#FFFFFF", + "#000000", + "bold 14px Arial" + ); + core.fillBoldText( + ctx, + "简易模式", + 330, + 345, + "#FFFF60", + "#000000", + "bold 16px Verdana" + ); + core.fillBoldText( + ctx, + "跳过", + 330, + 365, + "#FFFF60", + "#000000", + "bold 16px Verdana" + ); + + core.fillBoldText( + ctx, + "V", + 219, + 183, + "#FFFFFF", + "#000000", + "bold 48px pala" + ); + core.fillBoldText( + ctx, + "s", + 231, + 183, + "#FFFFFF", + "#000000", + "bold 36px pala" + ); + + if (!attack && !onAttack) enemyInfo.now += enemyInfo.speed; + let enemynow = Math.min(100 + (enemyInfo.now / oneTurn) * 215, 315); + ctx.fillStyle = "#FFFFFF"; + ctx.beginPath(); + ctx.moveTo(enemynow, 120); + ctx.lineTo(enemynow + 5, 110); + ctx.lineTo(enemynow - 5, 110); + 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, + 74, + 32, + 32 + ); + } else { + core.drawImage( + ctx, + core.getBlockInfo(enemyInfo.id).image, + 32, + core.getBlockInfo(enemyInfo.id).posY * 48, + 32, + 19, + enemynow - 16, + 58, + 32, + 48 + ); + } + core.drawLine(ctx, 100, 125, 315, 125, "#FFFFFF", 5); + equipInfo.forEach(function (v) { + if (!attack && !onAttack) v.now += v.speed; + let vnow = Math.min(100 + (v.now / oneTurn) * 215, 315); + ctx.beginPath(); + ctx.moveTo(vnow, 120); + ctx.lineTo(vnow + 5, 110); + ctx.lineTo(vnow - 5, 110); + ctx.closePath(); + + ctx.fill(); + + core.drawIcon(ctx, v.id, vnow - 16, 54, 32, 32); + }); + if (!attack && !onAttack) heroInfo.now += hero.speed; + let heronow = Math.min(100 + (heroInfo.now / oneTurn) * 215, 315); + ctx.beginPath(); + ctx.moveTo(heronow, 120); + ctx.lineTo(heronow + 5, 110); + ctx.lineTo(heronow - 5, 110); + ctx.closePath(); + + ctx.fill(); + core.drawImage( + ctx, + "hero.webp", + 0, + 0, + 32, + 48, + heronow - 16, + 58, + 32, + 48 + ); + } + let nowattacking = false; + if (heroInfo.now >= oneTurn && !heroInfo.isAttack) { + heroInfo.onAttack = false; + heroInfo.isAttack = true; + nowattacking = true; + } + if (enemyInfo.now >= oneTurn && !enemyInfo.isAttack) { + enemyInfo.onAttack = false; + enemyInfo.isAttack = true; + nowattacking = true; + } + const equipanimate = []; + equipInfo.forEach((v) => { + if (v.now >= oneTurn && !v.isAttack) { + v.isAttack = true; + v.onAttack = false; + nowattacking = true; + equipanimate.push(v); + } + }); + if (!attack && nowattacking) { + let herodamage = enemyDiffList[turn].hp; + if (herodamage > 0) herodamage = "+" + herodamage; + let text = herodamage === 0 ? "抵抗" : herodamage; + + Dove.MorePerform.ShowDamagePop.PopDamage( + ctx, // 默认画布名称 + 270, // 英雄位置 x + 160, // 英雄位置 y + text, // 伤害值 + 18, // 默认字体大小 + "Arial", //默认字体 + typeof text === "string" && text.startsWith("+") ? + "#22FF44" : + typeof text === "string" ? + "#FFFFFF" : + null, // 默认颜色 + text === "抵抗" ? "#000000" : null, // 默认描边颜色 + 0, // 默认水平速度 + -1, // 默认垂直速度 + 0, // 默认重力 + 90 // 默认显示时长(帧数) + ); + for (const v in enemyDiffList[turn]) { + enemyInfo[v] += enemyDiffList[turn][v]; + } + enemyanimateList[turn].forEach((v) => animateonAttack(v, true)); + let enemydamage = heroDiffList[turn].hp; + if (enemydamage > 0) enemydamage = "+" + enemydamage; + text = enemydamage === 0 ? "抵抗" : enemydamage; + Dove.MorePerform.ShowDamagePop.PopDamage( + ctx, // 默认画布名称 + 110, // 英雄位置 x + 160, // 英雄位置 y + text, // 伤害值 + 18, // 默认字体大小 + "Arial", //默认字体 + typeof text === "string" && text.startsWith("+") ? + "#22FF44" : + typeof text === "string" ? + "#FFFFFF" : + null, // 默认颜色 + text === "抵抗" ? "#000000" : null, // 默认描边颜色 + 0, // 默认水平速度 + -1, // 默认垂直速度 + 0, // 默认重力 + 90 // 默认显示时长(帧数) + ); + for (const v in heroDiffList[turn]) { + heroInfo[v] += heroDiffList[turn][v]; + } + heroanimateList[turn].forEach((v) => animateonAttack(v, false)); + + if (enemyDiffList[turn] < 0) enemyInfo.inAttack = true; + if (heroDiffList[turn] < 0) heroInfo.inAttack = true; + if (heroInfo.hp < 0) heroInfo.hp = 0; + if (enemyInfo.hp < 0) enemyInfo.hp = 0; + await Promise.all([ + await playinganimate(), + new Promise((resolve) => { + if (heroInfo.isAttack) { + heroInfo.now = 0; + heroInfo.isAttack = false; + } + resolve(); + }), + new Promise((resolve) => { + if (enemyInfo.isAttack) { + enemyInfo.now = 0; + enemyInfo.isAttack = false; + } + resolve(); + }), + new Promise((resolve) => { + if (equipanimate.length > 0) { + equipanimate.forEach((v) => { + v.now = 0; + v.isAttack = false; + }); + } + resolve(); + }), + new Promise((resolve) => { + turn++; + resolve(); + }), + ]); + + if (heroInfo.hp <= 0 || enemyInfo.hp <= 0) { + core.status.event.id = ""; + core.unregisterAnimationFrame("attackAnimate"); + core.clearMap(ctx); + core.closePanel(); + res(); + } + } + } + core.registerAnimationFrame("attackAnimate", true, (temptime) => { + if (temptime - time > 1000 / 60) { + time = temptime; + drawAttackAnimate( + heroInfo, + oneTurn, + enemyInfo, + equipInfo, + farme, + heroDiffList, + enemyDiffList, + heroanimateList, + enemyanimateList + ); + + farme++; + } + }); + }); + }; +}, + "剧情内容": function () { + // 每项为一个数组,第一项是名字,第二项是对话内容,第三项为音频文件名(没有则不需要第三项) + // 回放只会在同一个this下回放,进入剧情前请以事件块声明进入哪个剧情数组 + this.chapter000 = [ + ["", "这些天,街道不曾下雨。"], + ["", "所以,那浸湿地面的,定是那些女孩们流落的鲜血无疑。"], + ["", "我蹲在充斥着铁锈味般恶臭的小巷中,悠闲地如是想着。"], + ["", "扑哧。"], + ["", "耳旁再次响起象征着某个女孩子死去的声音。"], + ["", "再一次——"], + ["", "再一次。"], + ["", "女子们被肢解成单纯的肉块。"], + ["", "我任由流下的血浸满全身,屏住自己的呼吸。"], + ["", "祈求自己能拥有从猎人手中逃脱的幸运。"], + ["", "扑哧。"], + ["", "直到刚才,我们还坐在去往娼馆的马车的路上。"], + ["", "而在这之中的某些人,已经不在这个世上了。"], + ["", "不,应该把“某些”换成“几乎所有”才更为恰当吧。"], + ["", "恐怕,不久之后我也会变成小巷中血腥的装饰品。"], + ["", "我是为了得到这种死法,才辛苦苟活至今的吗?"], + ["", "来个人告诉我啊——"], + ["", "谁都好。"], + ["", "来人啊!!"], + ["少女", "「呃······!?」", "aiy010000010.opus"], //小动物01 + ["", "漆黑的物体充斥了我的整个视野"], + ["", "我很快意识到,那是只很大的脚。"], + ["", "必须要出声求救。"], + ["", "可是,耳中却只能听到自己的牙关不停交战的声音。"], + ["", "我是如此的无助。"], + ["", "逃跑也好,道歉也罢。"], + ["", "就连抬头看一眼将要杀掉我的人的面孔都做不到。"], + ["少女", "「······被杀」", "aiy010000020.opus"], //小动物02 + ["", "会被杀。"], + ["", "会被杀!!"], + ["", "来自内心深处的冰冷预感,渐渐地在体内蔓延开来。"], + ["少女", "「不,不要······」", "aiy010000030.opus"], //小动物03 + ] + this.chapter001 = [ + ["", "浮游都市,《诺瓦斯·艾蒂尔》。"], + ["", "《特别受灾地区》——"], + ["", "通称,《牢狱》"], + ["", "是被险峻的峭壁环绕,与世隔绝的,都市的最底部。"], + ] + this.chapter002 = [ + ["年轻人", "「放开我!」", "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 = [ + ["不蚀金锁成员", "「凯伊姆先生,凯伊姆先生」", "aiy860000010.ogg"], + [ + "不蚀金锁成员", + "「您已经和艾莉斯大夫见过面了吗?」", + "aiy860000020.ogg", + ], + ["凯伊姆", "「啊啊,所以才会追过来的」", "aiy310000310.ogg"], //男主31 + ["凯伊姆", "「看到小偷了吗?」", "aiy310000320.ogg"], //男主32 + [ + "不蚀金锁成员", + "「没有,他向广场那边逃了过去,今天这么拥挤,我们也只能放弃了」", + "aiy860000030.ogg", + ], + [ + "不蚀金锁成员", + "「不过,我也只是刚好在店里所以才追了过去,并不是受人所托」", + "aiy860000040.ogg", + ], + ["不蚀金锁成员", "「我已经准备撤退了」", "aiy860000050.ogg"], + ["不蚀金锁成员", "「凯伊姆先生还要继续追吗?」", "aiy860000060.ogg"], + ["凯伊姆", "「啊啊」", "aiy310000330.ogg"], //男主33 + ["", "做完情报交换之后,我跟男人道别。"], + ["凯伊姆", "「和我想的一样啊······」", "aiy310000340.ogg"], //男主34 + ["", "在牢狱中最大的广场上,聚集着看不到尽头的人群。"], + ["", "就算是来参见圣女祈祷,这人数也太多了点吧。"], + ["", "自然,我也找不到逃跑的孩子。"], + ["", "是混杂到人群中了吧。"], + ["", "如果已经从广场上脱身了的话,就更难发现了。"], + ["", "只好赌他还在这里了。"], + ["", "我先移动到了一个视野良好的地方。"], + ["", "从这里,一眼就可以看到人群的变化。"], + ["", "广场还是沸腾起来。"], + ["", "抬头望去,原来是在天台之上出现了一个人影"], + ["", "但是,与周围的期待不同,现身的是一名中年的神官。"], + ["", "骂声四溢。"], + ["", "神官则是笑着摆正衣领"], + ["神官", "「从现在开始,举行谒见的仪式」", "aiy440000010.ogg"], //神官01 + [ + "神官", + "「在参见那位大人之前,我希望牢狱的诸位再次思考这个《诺瓦斯·艾蒂尔》存在的意义······」", + "aiy440000020.ogg", + ], //神官02 + [ + "神官", + "「初代圣女伊莲大人,便是也难怪这崇高的祈祷之力,令《诺瓦斯·艾蒂尔》浮在空中,拯救了我们的祖先」", + "aiy440000030.ogg", + ], //神官03 + [ + "神官", + "「这之后的几百年来,传承了初代大人力量的历代圣女伊莲大人,让这里留在了空中」", + "aiy440000040.ogg", + ], //神官04 + [ + "神官", + "「这座都市是被圣女大人守护的人类最后的圣域,而我们则是被选召的虔诚的信徒」", + "aiy440000050.ogg", + ], //神官05 + [ + "神官", + "「怀着对圣女的感激祈祷吧,感谢圣女伊莲吧!并献上祈祷!」", + "aiy440000060.ogg", + ], //神官06 + ["圣女", "「不忘感谢与祈祷,神才会拯救我们」", "aiy030000010.ogg"], //圣女01 + ["圣女", "「与我一起,向神虔诚地祈祷吧」", "aiy030000020.ogg"], //圣女02 + ["", "广场上欢声雷动。"], + ["", "圣女没有回应喧嚣的人声,而是静静地合上双眼面向广场。"], + ["", "虽然感觉有些冷淡,但总比像个傻瓜似的笑着向这群人挥手要强。"], + ["", "她掌握着这条街道,还有在这条街上生活的人的命运。"], + ["", "比起揽得人气,她更想要为了街道的继续存在而献出全力。"], + ["", "也是为了不让《大崩落》的惨剧再度发生。"], + ["", "十几年前的那场悲剧。"], + [ + "", + "虽然在我脑海中的记忆已经相当模糊,但哪怕只是稍有触及,不快的感觉都会在胸口蔓延开。", + ], + ["凯伊姆", "「······」", "aiy310000350.ogg"], //男主35 + ["", "这时我才想起,现在不是我在这里看圣女的时候。"], + ["女声", "「——っ!?」", "aiy510000010.ogg"], + ["围观的女人", "「羽,羽化病人!?」", "aiy510000020.ogg"], + ["围观的中年人", "「喂,谁去叫下羽狩」", "aiy720000010.ogg"], + [ + "惊慌的观众", + "「你这家伙不要靠近我,要是传染了可怎么办」", + "aiy730000010.ogg", + ], + ["粗鲁的观众", "「你这小鬼赶快滚开」", "aiy740000010.ogg"], + ["凯伊姆", "「接下来」", "aiy310000360.ogg"], //男主36 + ["圣女", "「发生什么事了?看上去似乎很嘈杂」", "aiy030000030.ogg"], //圣女03 + [ + "随从", + "「似乎是某个人逃跑了······具体的我也不是很清楚」", + "aiy130000010.ogg", + ], //侍从01 + [ + "神官", + "「圣女大人,继续待在天台上可能会出事,请您先回到室内吧」", + "aiy440000070.ogg", + ], //神官07 + [ + "圣女", + "「不用在意我,比起那个,我更关心究竟发生了什么事」", + "aiy030000050.ogg", + ], //圣女05 + ["神官", "「对不起,我真的不知道」", "aiy440000080.ogg"], //神官08 + ["圣女", "「······是吗」", "aiy030000060.ogg"], //圣女06 + ["男", "「恕我僭越,请准许我说明情况」", "aiy320000010.ogg"], //男主他哥01 + ["男", "「在来觐见的人群中出现了《羽化病》的患者」", "aiy320000020.ogg"], //男主他哥02 + ["男", "「围观的人群因而产生了骚动」", "aiy320000030.ogg"], //男主他哥03 + [ + "男", + "「现在,《防疫局》已经派遣了部队。我想不久之后,他们就会安静下来了」", + "aiy320000040.ogg", + ], //男主他哥04 + ["圣女", "「羽化病······」", "aiy030000070.ogg"], //圣女07 + ["男", "「怎么了?」", "aiy320000050.ogg"], //男主他哥05 + ["圣女", "「没什么」", "aiy030000080.ogg"], //圣女08 + ["圣女", "「辛苦了,你的名字是?」", "aiy030000090.ogg"], //圣女09 + [ + "男", + "「属下是在防疫局任职的,鲁基乌斯· 迪斯·米利尤」", + "aiy320000060.ogg", + ], //男主他哥06 + [ + "神官", + "「噢噢,阁下就是鲁基乌斯卿吗,我听说过你的传闻」", + "aiy440000090.ogg", + ], //神官09 + ["神官", "「阁下是在工作上相当出色的人呢」", "aiy440000100.ogg"], //神官10 + ["鲁基乌斯", "「不敢当」", "aiy320000070.ogg"], //男主他哥07 + [ + "鲁基乌斯", + "「话说回来,这次是属下警备工作的失职。让圣女大人见到这不成体统的一面,请您见谅」", + "aiy320000080.ogg", + ], //男主他哥08 + [ + "圣女", + "「即使是目不见物的我,也能感受到聚集于此的民众数量之多。警备工作难以展开也在情理之中」", + "aiy030000100.ogg", + ], //圣女10 + ["鲁基乌斯", "「属下不胜惶恐」", "aiy320000090.ogg"], //男主他哥09 + [ + "鲁基乌斯", + "「接下来属下还要回到工作岗位上,在这里就先告退了」", + "aiy320000100.ogg", + ], //男主他哥10 + ["圣女", "「鲁基乌斯先生」", "aiy030000110.ogg"], //圣女11 + ["鲁基乌斯", "「属下在」", "aiy320000110.ogg"], //男主他哥11 + ["圣女", "「你是怎样看待羽狩的工作的呢?」", "aiy030000120.ogg"], //圣女12 + ["神官", "「圣,圣女大人」", "aiy440000110.ogg"], //神官11 + [ + "鲁基乌斯", + "「防疫局的工作是国王陛下赐予的重要职务。属下非常荣幸能够为这个都市的繁荣尽一份微薄之力」", + "aiy320000120.ogg", + ], //男主他哥12 + ["神官", "「不,不亏是鲁基乌斯卿,相当优秀的想法」", "aiy440000120.ogg"], //神官12 + ["圣女", "「是吗。辛苦你了」", "aiy030000130.ogg"], //圣女13 + ["随从", "「圣女大人······」", "aiy130000020.ogg"], //侍从02 + ["鲁基乌斯", "「······」", "aiy320000135.ogg"], //男主他哥13 + ["鲁基乌斯", "「那么,属下就回岗位去了」", "aiy320000140.ogg"], //男主他哥14 + ]; + this.chapter03 = [ + ["", "从羽化病的少年纷乱的足音中,可以听得出相当的疲劳。"], + ["", "显然,他并没有想到我会捷足先登吧。"], + ["", "少年惶恐地回头看了一眼后,微微露出安心的表情,双手拄在膝盖上。。"], + ["凯伊姆", "「辛苦你了」", "aiy310000370.ogg"], //男主37 + ["羽化病患少年", "「稀!?」", "aiy750000010.ogg"], + ["凯伊姆", "「逃到贫民区是个不错的想法」", "aiy310000380.ogg"], //男主38 + ["羽化病患少年", "「你,你是,羽狩吗?」", "aiy750000020.ogg"], + ["凯伊姆", "「不是」", "aiy310000390.ogg"], //男主39 + [ + "羽化病患少年", + "「什,什么啊······混蛋,不要吓我啊」", + "aiy750000030.ogg", + ], + ["凯伊姆", "「我对令你受惊这件事致以歉意」", "aiy310000400.ogg"], //男主40 + ["凯伊姆", "「作为回报,麻烦你把从店里偷的钱交出来吧」", "aiy310000410.ogg"], //男主41 + ["羽化病患少年", "「钱?你在说什么」", "aiy750000040.ogg"], + ["凯伊姆", "「你要找的腰上的东西,掉在你身后了」", "aiy310000420.ogg"], //男主42 + ["羽化病患少年", "「哎?」", "aiy750000050.ogg"], + ["羽化病患少年", "「呃呀」", "aiy750000060.ogg"], + ["羽化病患少年", "「你······你这混蛋」", "aiy750000070.ogg"], + ["凯伊姆", "「······」", "aiy310000430.ogg"], //男主43 + ["凯伊姆", "「把偷的钱交出来」", "aiy310000440.ogg"], //男主44 + ["羽化病患少年", "「我不知道你在······咕」", "aiy750000080.ogg"], + [ + "羽化病患少年", + "「你,你说是我偷的······有什么证据吗」", + "aiy750000090.ogg", + ], + ["凯伊姆", "「你还挺倔的啊」", "aiy310000450.ogg"], //男主45 + ["凯伊姆", "「不过,给我听好了」", "aiy310000460.ogg"], //男主46 + ["凯伊姆", "「你偷的那些钱,是要上缴给《不蚀金锁》的上纳金」", "aiy310000470.ogg"], //男主47 + ["凯伊姆", "「而且,钱的主人是从前和吉克颇有渊源的女人」", "aiy310000480.ogg"], //男主48 + ["羽化病患少年", "「吉克?」", "aiy750000100.ogg"], + ["凯伊姆", "「他是《不蚀金锁》的主人,这么说你就明白了吧」", "aiy310000490.ogg"], //男主49 + ["羽化病患少年", "「哎?哎?怎么会······」", "aiy750000110.ogg"], + ["凯伊姆", "「再问你一遍,钱在哪里?」", "aiy310000510.ogg"], //男主51 + ["羽化病患少年", "「是,是,是,在我的怀里」", "aiy750000120.ogg"], + ["凯伊姆", "「你没有擅自拿掉一部分吧」", "aiy310000520.ogg"], //男主52 + ["羽化病患少年", "「是,是的」", "aiy7500000130.ogg"], + [ + "羽化病患少年", + "「那,那个,您是《不蚀金锁》的人吗?」", + "aiy750000140.ogg", + ], + ["凯伊姆", "「算是吧」", "aiy310000530.ogg"], //男主53 + [ + "羽化病患少年", + "「我什么都可以做,请您一定要帮帮我」", + "aiy750000150.ogg", + ], + ["凯伊姆", "「抱歉,我并没有兴趣去帮助他人」", "aiy310000540.ogg"], //男主54 + [ + "羽化病患少年", + "「我什么······什么,都会做的······」", + "aiy750000160.ogg", + ], + ["羽化病患少年", "「我一直都是生活在下层的」", "aiy750000170.ogg"], + [ + "羽化病患少年", + "「可是,不知何时染上了羽化病······背后长出了翅膀······」", + "aiy750000180.ogg", + ], + [ + "羽化病患少年", + "「被寄宿工作的店赶了出来,只得流落到牢狱这里」", + "aiy750000190.ogg", + ], + [ + "羽化病患少年", + "「因为独自实在是饿的不行了,所以才会偷这些钱的」", + "aiy750000200.ogg", + ], + [ + "羽化病患少年", + "「我明明没有做任何坏事······为什么······会遇到这种事······」", + "aiy750000210.ogg", + ], + ["凯伊姆", "「谁知道」", "aiy310000550.ogg"], //男主55 + [ + "羽化病患少年", + "「呜······呜呜······接下来,要对我做什么?」", + "aiy750000220.ogg", + ], + ["凯伊姆", "「我要把你带到组织那里」", "aiy310000560.ogg"], //男主56 + ["羽化病患少年", "「怎,怎么这样」", "aiy750000230.ogg"], + ["凯伊姆", "「不过,那样做的前提是你不是羽化病人」", "aiy310000570.ogg"], //男主57 + ["凯伊姆", "「组织也没有笨到把羽化病人招待到家里的程度」", "aiy310000580.ogg"], //男主58 + ["羽化病患少年", "「那么,是要放我逃走吗?」", "aiy750000240.ogg"], + ["凯伊姆", "「我要让你学到教训」", "aiy310000590.ogg"], //男主59 + ["凯伊姆", "「如果换做是组织的制裁,至少要有断条胳膊的觉悟」", "aiy310000600.ogg"], //男主60 + ["凯伊姆", "「你的运气不错」", "aiy310000610.ogg"], //男主61 + ["羽化病患少年", "「唔······啊,是的······」", "aiy750000250.ogg"], + ["凯伊姆", "「滚」", "aiy310000620.ogg"], //男主62 + ["羽化病患少年", "「非常感谢」", "aiy750000260.ogg"], + ["羽化病患少年", "「唔啊!?」", "aiy750000270.ogg"], + ["男", "「到这里就结束了,羽化病人」", "aiy430000010.ogg"], //兰格01 + ["男", "「确认他的翅膀」", "aiy430000020.ogg"], //兰格02 + ["", "趁还没有被卷入麻烦的事情之前,赶快离开这里吧"], + ["羽狩的指挥者", "「那边的那个人」", "aiy430000030.ogg"], //兰格03 + ["凯伊姆", "「······有什么事?」", "aiy310000630.ogg"], //男主63 + ["羽狩的指挥者", "「可以稍微让我问几句话吗」", "aiy430000040.ogg"], //兰格04 + ["凯伊姆", "「······」", "aiy310000640.ogg"], //男主64 + ["凯伊姆", "「啊啊,无妨」", "aiy310000650.ogg"], //男主65 + ["羽狩的指挥者", "「感谢您的合作」", "aiy430000050.ogg"], //兰格05 + ["", "队长殷勤地致以谢礼。"], + ["", "而在他的眼前,少年的衣服已经被他的补下们扯破。"], + ["", "在瘦骨嶙峋的裸露后背上,长有纯白的羽翼。"], + ["红发的羽狩", "「副队长,确认翅膀的持有了」"], + ["羽狩的副队长", "「保护他」", "aiy430000060.ogg"], //兰格06 + ["羽化病患少年", "「不要······请原谅,我······」", "aiy750000280.ogg"], + [ + "羽狩的副队长", + "「我们只是要带你去治愈院治疗羽化病,不是什么应该感到害怕的事情」", + "aiy430000070.ogg", + ], //兰格07 + ["羽化病患少年", "「可是,可是」", "aiy750000290.ogg"], + ["羽狩的副队长", "「没关系的」", "aiy430000080.ogg"], //兰格08 + ["羽化病患少年", "「······哥,哥哥」", "aiy750000300.ogg"], + ["羽狩的副队长", "「你是羽化病人的亲属吗?」", "aiy430000090.ogg"], //兰格09 + ["凯伊姆", "「只是路人而已」", "aiy310000660.ogg"], //男主66 + ["凯伊姆", "「顺带一提,我也没有打算找你们的麻烦」", "aiy310000670.ogg"], //男主67 + [ + "羽狩的副队长", + "「前几天,有个和你说了同样的话的人,在我们背向他的瞬间对我们发动了袭击」", + "aiy430000100.ogg", + ], //兰格10 + ["羽狩的副队长", "「我的一个部下就此永久失去了半截胳膊」", "aiy430000110.ogg"], //兰格11 + ["凯伊姆", "「我表示同情」", "aiy310000680.ogg"], //男主68 + ["凯伊姆", "「我马上就会消失的,这样就没问题了吧?」", "aiy310000690.ogg"], //男主69 + ["羽狩的副队长", "「嘛,不要这么慌张」", "aiy430000120.ogg"], //兰格12 + ["", "副队长看着羽化的少年。"], + ["羽狩的副队长", "「你与这个人是什么关系?没有被他殴打吗?」", "aiy430000130.ogg"], //兰格13 + ["羽化病患少年", "「没,没有」", "aiy750000310.ogg"], + [ + "羽狩的副队长", + "「如何对我们保持合作,你就可以在治愈院得到优先的治疗」", + "aiy430000140.ogg", + ], //兰格14 + ["羽化病患少年", "「······」", "aiy750000320.ogg"], + [ + "羽化病患少年", + "「那个人,是《不蚀金锁》的组织成员······」", + "aiy750000330.ogg", + ], + [ + "羽化病患少年", + "「突然说让我拿出钱来,我刚一拒绝他就打我」", + "aiy750000340.ogg", + ], + ["羽狩的副队长", "「原来如此······」", "aiy430000150.ogg"], //兰格15 + [ + "羽狩的副队长", + "「那位少年说你是《不蚀金锁》的一员,不知此事是否属实?」", + "aiy430000160.ogg", + ], //兰格16 + ["凯伊姆", "「当然不是」", "aiy310000700.ogg"], //男主70 + ["凯伊姆", "「我只是从那里接受工作而已,并不是他们的成员」", "aiy310000710.ogg"], //男主71 + ["羽狩的副队长", "「你的意思是说,少年在说谎吗?」", "aiy430000170.ogg"], //兰格17 + ["凯伊姆", "「啊啊」", "aiy310000720.ogg"], //男主72 + [ + "凯伊姆", + "「如果你们和组织有关系的话,只要问问我是不是那里的成员就能明白事实了吧」", + "aiy310000730.ogg", + ], //男主73 + ["羽狩的副队长", "「就算我去询问,也无法从他们那里得到事实」", "aiy430000180.ogg"], //兰格18 + [ + "羽狩的副队长", + "「《不蚀金锁》的那些人一向都不对我们合作,我对此深感困扰」", + "aiy430000190.ogg", + ], //兰格19 + ["凯伊姆", "「真是辛苦啊」", "aiy310000740.ogg"], //男主74 + ["羽狩的副队长", "「说的是啊」", "aiy430000200.ogg"], //兰格20 + ["羽狩的副队长", "「其实,砍下我部下胳膊的似乎也是组织的成员呢」", "aiy430000210.ogg"], //兰格21 + [ + "羽狩的副队长", + "「无需如此警戒,我只是想在看守所向你咨询一些事情而已」", + "aiy430000220.ogg", + ], //兰格22 + [ + "羽狩的副队长", + "「如果能够知晓牢狱与组织的事情,我们也可以尽可能地对更多的羽化病人进行保护」", + "aiy430000230.ogg", + ], //兰格23 + ["羽狩的副队长", "「那和整条街道的和平也是紧密相关的吧?」", "aiy430000240.ogg"], //兰格24 + ["凯伊姆", "「我知道,你们有逮捕干扰狩猎羽化病人的权力」", "aiy310000750.ogg"], //男主75 + [ + "凯伊姆", + "「但是,我没有对你们做出任何干扰,为什么要对我如此纠缠不休呢」", + "aiy310000760.ogg", + ], //男主76 + ["羽狩的副队长", "「那些话,我们会在看守所对你详细说明的」", "aiy430000250.ogg"], //兰格25 + ["凯伊姆", "「······」", "aiy310000770.ogg"], //男主77 + ["", "在这里起争执的话,就会被羽狩加害。"], + ["", "就算能从这里脱身,今后只要碰面就会产生纠纷也是摆明的事情。"], + ["", "就算逃跑,也没有好的结果。"], + ["", "正当我想要打圆场的时候,刚才的气氛一瞬间产生了转变。"], + ["", "发生了什么事······"], + ["???", "「我认为,那位先生是正确的」", "aiy050000010.ogg"], //菲奥奈01 + ["", "羽狩们一起回头。"], + ["", "而在他们视线的焦点处,"], + ["", "伫立着一位女性。"], + ["", "在端正的容颜下,代表着强烈意志的双眉十分显眼。"], + ["", "身体的柔软与紧紧包裹在其身上的羽狩制服,两者显得十分的不搭配。"], + ["", "我还是第一次看到女性的羽狩。"], + ["羽狩的副队长", "「队长,这是获得《不蚀金锁》情报的好机会」", "aiy430000260.ogg"], //兰格26 + [ + "羽狩的队长", + "「兰格副队长,就算是为了获得情报,也不能做出恫吓的发言啊」", + "aiy050000020.ogg", + ], //菲奥奈02 + ["兰格副队长", "「我并没有打算去恫吓他······」", "aiy430000270.ogg"], //兰格27 + ["羽狩的队长", "「告诉我那个被砍掉胳膊的队员的名字」", "aiy050000030.ogg"], //菲奥奈03 + ["羽狩的队长", "「我会去探望他的」", "aiy050000040.ogg"], //菲奥奈04 + ["兰格副队长", "「那个是······」", "aiy430000280.ogg"], //兰格28 + ["羽狩的队长", "「我知道,你一直在为有所收获而努力工作」", "aiy050000050.ogg"], //菲奥奈05 + ["羽狩的队长", "「但是,正因为我们的工作是为民众提供帮助」", "aiy050000060.ogg"], //菲奥奈06 + ["羽狩的队长", "「所以就更不能损害人与人之间的信赖」", "aiy050000070.ogg"], //菲奥奈07 + ["兰格副队长", "「我会铭记在心」", "aiy430000290.ogg"], //兰格29 + ["羽狩的队长", "「这位先生,我的部下失礼了」", "aiy050000080.ogg"], //菲奥奈08 + ["凯伊姆", "「只要不对我再来一次就好」", "aiy310000780.ogg"], //男主78 + ["羽狩的队长", "「请稍等」", "aiy050000090.ogg"], //菲奥奈09 + ["凯伊姆", "「有什么事?」", "aiy310000790.ogg"], //男主79 + ["羽狩的队长", "「我想确认一件事」", "aiy050000100.ogg"], //菲奥奈10 + ["羽狩的队长", "「你真的不是《不蚀金锁》的成员吗?」", "aiy050000110.ogg"], //菲奥奈11 + ["凯伊姆", "「真的」", "aiy310000800.ogg"], //男主80 + ["凯伊姆", "「如果我说是的话,你有什么打算?」", "aiy310000810.ogg"], //男主81 + ["羽狩的队长", "「我听过传闻,说他们是用依靠暴力而得的钱在生活」", "aiy050000120.ogg"], //菲奥奈12 + ["凯伊姆", "「······这样啊」", "aiy310000820.ogg"], //男主82 + ["凯伊姆", "「如果能有收获就好了啊」", "aiy310000830.ogg"], //男主83 + ]; + this.chapter04 = [ + ["梅尔特", "「欢迎光临」", "aiy120000020.ogg"], //老板娘01,文件序号是以2开始,后续全部加1 + ["梅尔特", "「辛苦了」", "aiy120000030.ogg"], //老板娘02 + ["梅尔特", "「抱歉,又拜托给你了个这么麻烦的工作」", "aiy120000040.ogg"], //老板娘03 + ["凯伊姆", "「没什么,比想象中完成的更容易」", "aiy310000840.ogg"], //男主84 + ["梅尔特", "「那就好」", "aiy120000050.ogg"], //老板娘04 + ["梅尔特", "「这是我的一点谢意」", "aiy120000060.ogg"], //老板娘05 + ["凯伊姆", "「味道有些变化啊」", "aiy310000850.ogg"], //男主85 + ["梅尔特", "「啊,被发现了?」", "aiy120000070.ogg"], //老板娘06 + ["梅尔特", "「最近,没能到手什么好的原料呢」", "aiy120000080.ogg"], //老板娘07 + ["凯伊姆", "「去拜托吉克如何?」", "aiy310000860.ogg"], //男主86 + [ + "梅尔特", + "「话是这么说,但是总不能用店里采购的这种小事去麻烦他吧······」", + "aiy120000090.ogg" + ], //老板娘08 + ["凯伊姆", "「那希望你也不要来麻烦我」", "aiy310000870.ogg"], //男主87 + ["梅尔特", "「那 是 两 码 事」", "aiy120000100.ogg"], //老板娘09 + ["梅尔特", "「再说,凯伊姆是靠着工作来生活的吧」", "aiy120000110.ogg"], //老板娘10 + [ + "梅尔特", + "「而且,自己的钱被偷了这么害羞的事,向凯伊姆以外的其他人都说不出口」", + "aiy120000120.ogg" + ], //老板娘11 + ["凯伊姆", "「反正,也已经传到吉克的耳朵里了」", "aiy310000880.ogg"], //男主88 + ["梅尔特", "「这是面子问题啊,面子问题」", "aiy120000130.ogg"], //老板娘12 + ["凯伊姆", "「嘛,算了」", "aiy310000890.ogg"], //男主89 + ["凯伊姆", "「这样就好了吧?」", "aiy310000900.ogg"], //男主90 + ["梅尔特", "「这是钱包呢」", "aiy120000140.ogg"], //老板娘13 + ["梅尔特", "「嗯,东西没少」", "aiy120000150.ogg"], //老板娘14 + ["梅尔特", "「太好啦—这个月的上纳金,我可全部都放在里面了呢」", "aiy120000160.ogg"], //老板娘15 + ["梅尔特", "「如果没有找到的话,说不定就又会被送到娼馆里了呢」", "aiy120000170.ogg"], //老板娘16 + ["凯伊姆", "「在那边不是来钱更快吗?」", "aiy310000910.ogg"], //男主91 + ["梅尔特", "「阿拉,你是在说我还能有魅力吗?」", "aiy120000180.ogg"], //老板娘17 + ["凯伊姆", "「这是客套话而已」", "aiy310000920.ogg"], //男主92 + ["梅尔特", "「欺负人」", "aiy120000190.ogg"], //老板娘18 + ["梅尔特", "「总而言之,今天帮大忙了」", "aiy120000200.ogg"], //老板娘19 + ["梅尔特", "「谢礼嘛······」", "aiy120000210.ogg"], //老板娘20 + ["凯伊姆", "「就记在账单上吧」", "aiy310000930.ogg"], //男主93 + ["梅尔特", "「了解—盛谢惠顾了哦?」", "aiy120000220.ogg"], //老板娘21 + ["", "喀啷喀啷"], + ["", "门铃响起"], + ["", "喧哗瞬间安静下来。"], + ["", "进来的人是吉克。"], + ["", "是掌控着牢狱的组织之一,《不蚀金锁》的头目。"], + ["", "不仅组织的成员,就连店内一般的客人也对他以注目礼表示敬意。"], + ["吉克", "「各位继续吧」", "aiy340000010.ogg"], //吉克01 + ["", "仿佛停滞的时钟重新转动了一般,店内恢复了热闹的气氛。"], + ["吉克", "「抱歉,今天拜托你去做了无聊的工作」。", "aiy340000020.ogg"], //吉克02 + ["凯伊姆", "「不用介意」", "aiy310000940.ogg"], //男主94 + ["", "吉克轻轻点了点头,在我右边坐了下来"], + ["凯伊姆", "「逃跑的男人怎么样了?」", "aiy310000950.ogg"], //男主95 + ["吉克", "「嗯?已经不在这个世上了」。", "aiy340000030.ogg"], //吉克03 + ["吉克", "「有什么想要知道的事吗?」", "aiy340000040.ogg"], //吉克04 + ["凯伊姆", "「不,没什么」", "aiy310000960.ogg"], //男主96 + ["吉克", "「那个无聊的家伙,完全没有趣味呢」", "aiy340000050.ogg"], //吉克05 + ["吉克", "「真希望他也替我负责清扫的部下也考虑考虑」", "aiy340000060.ogg"], //吉克06 + ["凯伊姆", "「真是灾难啊」", "aiy310000970.ogg"], //男主97 + ["吉克", "「比起那个,我听说了哦。你去追羽化病人了啊」", "aiy340000070.ogg"], //吉克07 + ["凯伊姆", "「消息真灵通」", "aiy310000980.ogg"], //男主98 + ["吉克", "「梅尔特也注意点」", "aiy340000080.ogg"], //吉克08 + ["吉克", "「你丢钱已经不是一回两回了」", "aiy340000090.ogg"], //吉克09 + ["梅尔特", "「好的—我会注意的。」", "aiy120000230.ogg"], //老板娘22 + ["梅尔特", "「吉克还是平常的点单吧」", "aiy120000240.ogg"], //老板娘23 + ["梅尔特", "「凯伊姆要再来一杯吗?」", "aiy120000250.ogg"], //老板娘24 + ["", "我们用眼神点头示意后,梅尔特开始准备起酒来。"], + ["", "悠然地吐出眼圈后,吉克取出一个纸包放在柜台上。"], + ["吉克", "「这是抓捕逃跑男人的报酬」", "aiy340000100.ogg"], //吉克10 + ["凯伊姆", "「下次有什么事再告诉我」", "aiy310000990.ogg"], //男主99 + ["梅尔特", "「来,久等了」", "aiy120000260.ogg"], //老板娘25 + ["凯伊姆", "「话说回来梅尔特,为什么会被那种孩子偷到钱?」", "aiy310001000.ogg"], //男主100 + ["吉克", "「让我猜猜看」", "aiy340000110.ogg"], //吉克11 + ["吉克", "「是那个吧,看某个特立独行的男人入迷了,所以就有了空隙?」", "aiy340000120.ogg"], //吉克12 + ["梅尔特", "「可惜—」", "aiy120000270.ogg"], //老板娘26 + ["梅尔特", "「事实恰恰相反,是那家伙一直在纠缠我」", "aiy120000280.ogg"], //老板娘27 + ["凯伊姆", "「完全把你当成新进的女佣了么」", "aiy310001010.ogg"], //男主101 + ["梅尔特", "「我从前可是很有名的,不会被当成这种下人吧」", "aiy120000290.ogg"], //老板娘28 + ["梅尔特", "「······而且,我没法对对我这么钟情的人发火啊」", "aiy120000300.ogg"], //老板娘29 + ["凯伊姆&吉克", "「你傻啊」", "aiy310001027.ogg"], //男主102.7,吉克13.5 + ["梅尔特", "「异口同声呢,不亏是兄弟」", "aiy120000310.ogg"], //老板娘30 + ["凯伊姆", "「别用这种称呼,怪恶心的」", "aiy310001030.ogg"], //男主103 + ["吉克", "「说得没错」", "aiy340000140.ogg"], //吉克14 + ["吉克", "「······说起来······」", "aiy340000150.ogg"], //吉克15 + ["梅尔特", "「怎么了?」", "aiy120000320.ogg"], //老板娘31 + ["吉克", "「有件事我一直很在意,我和凯伊姆,哪个是哥哥啊?」", "aiy340000160.ogg"], //吉克16 + ["凯伊姆", "「你也说这么无聊的话题」", "aiy310001040.ogg"], //男主104 + ["吉克", "「不,这是很重要的事情」", "aiy340000170.ogg"], //吉克17 + ["吉克", "「梅尔特,事实是怎么样的?」", "aiy340000180.ogg"], //吉克18 + ["梅尔特", "「啊~是怎么样的呢~」", "aiy120000330.ogg"], //老板娘32 + ["梅尔特", "「我忘记了」", "aiy120000340.ogg"], //老板娘33 + ["吉克", "「骗人」", "aiy340000190.ogg"], //吉克19 + ["梅尔特", "「我说真的」", "aiy120000350.ogg"], //老板娘34 + ["梅尔特", "「嘛,如果想起来了的话,就算是卸载艺术上我也会公诸于众的」", "aiy120000360.ogg"], //老板娘35 + ["吉克", "「喔唷」", "aiy340000200.ogg"], //吉克20 + ["吉克", "「那么,我就不能比你先死了啊」", "aiy340000210.ogg"], //吉克21 + ["梅尔特", "「蒙你费心」", "aiy120000370.ogg"], //老板娘36 + ["梅尔特", "「顺带一提,有传言说吃过我们这里的料理后可以长生不老哦?」", "aiy120000380.ogg"], //老板娘37 + ["吉克", "「好,来两份炖菜,记得加腊肠」", "aiy340000220.ogg"], //吉克22 + ["梅尔特", "「多谢惠顾」", "aiy120000390.ogg"], //老板娘38 + ["", "微微一笑后,梅尔特去厨房传达点单。"], + ["凯伊姆", "「吉克······」", "aiy310001050.ogg"], //男主105 + ["吉克", "「啊,不好了」", "aiy340000230.ogg"], //吉克23 + ["凯伊姆", "「话题扯远了」", "aiy310001060.ogg"], //男主106 + ["梅尔特", "「什么话题来着?」", "aiy120000400.ogg"], //老板娘39 + ["凯伊姆", "「关于为什么你的钱会被偷这件事」", "aiy310001070.ogg"], //男主107 + ["凯伊姆", "「丢钱的时候以你来说,应该不会全无察觉吧?」", "aiy310001080.ogg"], //男主108 + ["梅尔特", "「算是吧,被偷的时候确实也想过要抓住他」", "aiy120000410.ogg"], //老板娘40 + ["梅尔特", "「但是,我注意到了那个孩子背后的鼓起呢」", "aiy120000420.ogg"], //老板娘41 + ["凯伊姆", "「所以就不由自主地放他逃跑了?」", "aiy310001090.ogg"], //男主109 + ["吉克", "「就算你想羽化病人施恩,也不会得到任何回报哦」", "aiy340000240.ogg"], //吉克24 + ["梅尔特", "「我知道」", "aiy120000430.ogg"], //老板娘42 + ["梅尔特", "「正因为知道,所以之后才会拜托凯伊姆去将钱取回的」", "aiy120000440.ogg"], //老板娘43 + ["梅尔特", "「可是,呢······」", "aiy120000450.ogg"], //老板娘44 + ["梅尔特", "「果然还是很矛盾呢」", "aiy120000460.ogg"], //老板娘45 + ["梅尔特", "「明明是自己放他逃跑的,之后又拜托别人去抓他」", "aiy120000470.ogg"], //老板娘46 + ["梅尔特", "「但是,在那一刹那······应该说是,突然露出了真心吧」", "aiy120000480.ogg"], //老板娘47 + ["梅尔特", "「真的,只是自我满足而已」", "aiy120000490.ogg"], //老板娘48 + ["凯伊姆", "「对于那个孩子来说不是很幸运么」", "aiy310001100.ogg"], //男主110 + ["凯伊姆", "「在被《不蚀金锁》抓到之前,就被羽狩保护了」", "aiy310001110.ogg"], //男主111 + ["凯伊姆", "「现在应该已经躺在治愈院的床上了」", "aiy310001120.ogg"], //男主112 + ["吉克", "「如果被我们抓到的话,嘛,至少也会断掉一根胳膊吧」", "aiy340000250.ogg"], //吉克25 + ["凯伊姆", "「比起失去胳膊,这不是个很好地结局吗」", "aiy310001130.ogg"], //男主113 + ["吉克", "「多亏梅尔特的一念之善,那个小子的胳膊被救下来了」", "aiy340000260.ogg"], //吉克26 + ["吉克", "「对我来说,不能去管教他稍微有点可惜就是了」", "aiy340000270.ogg"], //吉克27 + ["凯伊姆", "「我姑且是给了他两三拳」", "aiy310001140.ogg"], //男主114 + ["吉克", "「你这不是很善解人意么」", "aiy340000280.ogg"], //吉克28 + ["梅尔特", "「没有帮他的忙啊」", "aiy120000500.ogg"], //老板娘49 + ["凯伊姆", "「你给我用常识考虑考虑」", "aiy310001150.ogg"], //男主115 + ["梅尔特", "「本来,就算羽化病人不被羽狩带走而导致羽化病扩散,在牢狱里死亡的理由也要多少就有多少」", "aiy120000510.ogg"], //老板娘50 + ["梅尔特", "「没事到如今多一个病人,也不会有什么改变的吧」", "aiy120000520.ogg"], //老板娘51 + ["梅尔特", "「那么,那么些羽化病人为什么就不能和我们一起开心地生活呢」", "aiy120000530.ogg"], //老板娘52 + ["吉克", "「像梅尔特这样思考的人少之又少」", "aiy340000290.ogg"], //吉克29 + ["凯伊姆", "「就算早晚都会死去,为了今日的苟活而努力拼搏也是人之常情」", "aiy310001160.ogg"], //男主116 + ["梅尔特", "「我知道」", "aiy120000540.ogg"], //老板娘53 + ["梅尔特", "「别介意,我刚才只是顺口说说」", "aiy120000550.ogg"], //老板娘54 + ["", "喀啷喀啷"], + ["梅尔特", "「辛苦了,艾莉斯」", "aiy120000560.ogg"], //老板娘55 + ["艾莉斯", "「嗯」", "aiy020000190.ogg"], //医生19 + ["", "用不可爱的声音随口回应后,艾莉斯理所当然般地在我左边的座位坐下"], + ["", "梅尔特什么都没有问,就开始准备起茶来"], + ["梅尔特", "「多亏你去帮忙叫凯伊姆了呢」", "aiy120000570.ogg"], //老板娘56 + ["艾莉斯", "「不客气」", "aiy020000200.ogg"], //医生20 + ["艾莉斯", "「我从店里出去以后不久就看到他了,这是我们被命运之绳紧紧相连的证明呢」", "aiy020000210.ogg"], //医生21 + ["凯伊姆", "「那还真是糟糕」", "aiy310001170.ogg"], //男主117 + ["艾莉斯", "「用不着这么害羞的」", "aiy020000220.ogg"], //医生22 + ["凯伊姆", "「用茶堵上你的嘴吧」", "aiy310001180.ogg"], //男主118 + ["艾莉斯", "「好」", "aiy020000230.ogg"], //医生23 + ["梅尔特", "「司空见惯的风景呢」", "aiy120000580.ogg"], //老板娘57 + ["凯伊姆", "「你在那之后去做什么了?」", "aiy310001190.ogg"], //男主119 + ["艾莉斯", "「去莉莉乌姆照顾患病的女孩子了」", "aiy020000240.ogg"], //医生24 + ["艾莉斯", "「好像是毒品上瘾,费了很大劲才止住她的胡闹」", "aiy020000250.ogg"], //医生25 + ["艾莉斯", "「希望你能好好管理下自己店里的娼妇呢」", "aiy020000260.ogg"], //医生26 + ["吉克", "「抱歉啊」", "aiy340000300.ogg"], //吉克30 + ["吉克", "「为表歉意,就让我来给艾莉斯诊疗一下吧」", "aiy340000310.ogg"], //吉克31 + ["艾莉斯", "「去死吧」", "aiy020000270.ogg"], //医生27 + ["梅尔特", "「是什么药?」", "aiy120000590.ogg"], //老板娘58 + ["吉克", "「是最近上市的一种药」", "aiy340000320.ogg"], //吉克32 + ["吉克", "「虽然中毒的可能性很低,但只要中毒便会一发而不可收拾」", "aiy340000330.ogg"], //吉克33 + ["艾莉斯", "「知道了」", "aiy020000280.ogg"], //医生28 + ["吉克", "「虽然我也许没有时间去管教她,不过我还是会注意的」", "aiy340000340.ogg"], //吉克34 + ["艾莉斯", "「毒药的主人是吉克吗?」", "aiy020000290.ogg"], //医生29 + ["吉克", "「《不蚀金锁》不卖药,这是从先代定下的规矩」", "aiy340000350.ogg"], //吉克35 + ["艾莉斯", "「抱歉,开玩笑的」", "aiy020000300.ogg"], //医生30 + ["吉克", "「关于药的出处,这边也会调查的」", "aiy340000360.ogg"], //吉克36 + ["吉克", "「如果有什么传闻的话记得告诉我」", "aiy340000370.ogg"], //吉克37 + ["艾莉斯", "「知道了」", "aiy020000310.ogg"], //医生31 + ["艾莉斯", "「麻药中毒的人真麻烦呢,又不能完全治好」", "aiy020000320.ogg"], //医生32 + ["艾莉斯", "「既然要悄悄的打,那就也悄悄地去死不就好了」", "aiy020000330.ogg"], //医生33 + ["", "喀啷喀啷"], + ["奥兹", "「吉克大人,抱歉打扰你开心的时光」", "aiy350000240.ogg"], //金锁高官24 + ["吉克", "「怎么了」", "aiy340000380.ogg"], //吉克38 + ["奥兹", "「请将耳朵凑过来」", "aiy350000250.ogg"], //金锁高官25 + ["吉克", "「······知道了」", "aiy340000390.ogg"], //吉克39 + ["吉克", "「凯伊姆,一会到娼馆来一趟」", "aiy340000400.ogg"], //吉克40 + ["凯伊姆", "「啊啊」", "aiy310001200.ogg"], //男主120 + ["吉克", "「噢,我都给忘了」", "aiy340000410.ogg"], //吉克41 + ["吉克", "「让这里的大家都开心一下」", "aiy340000420.ogg"], //吉克42 + ["梅尔特", "「收到」", "aiy120000600.ogg"], //老板娘59 + ["吉克", "「我走了」", "aiy340000430.ogg"], //吉克43 + ["奥兹", "「好」", "aiy350000260.ogg"], //金锁高官26 + ["", "梆梆"], + ["梅尔特", "「大家静静,有个好消息」", "aiy120000610.ogg"], //老板娘60 + ["梅尔特", "「今天有个『大人物』要请客哦」", "aiy120000620.ogg"], //老板娘61 + ["艾莉斯", "「吉克还是一如既往的大方」", "aiy020000340.ogg"], //医生34 + ["梅尔特", "「果然,头目就应该像这样呢」", "aiy120000630.ogg"], //老板娘62 + ["凯伊姆", "「他的做法是继承先代的」", "aiy310001210.ogg"], //男主121 + ["梅尔特", "「又来了又来了」", "aiy120000640.ogg"], //老板娘63 + ["梅尔特", "「他想要赶上先代还早了十年呢」", "aiy120000650.ogg"], //老板娘64 + ["凯伊姆", "「有些太严厉了吧」", "aiy310001220.ogg"], //男主122 + ["艾莉斯", "「说起来,吉克有什么事」", "aiy020000350.ogg"], //医生35 + ["梅尔特", "「既然要叫上凯伊姆,再怎么说也不是什么小事吧?」", "aiy120000670.ogg"], //老板娘66 + ["凯伊姆", "「说的也是」", "aiy310001230.ogg"], //男主123 + ["艾莉斯", "「我期待看到你光荣负伤的样子」", "aiy020000360.ogg"], //医生36 + ["凯伊姆", "「不要为人的不幸祈求啊」", "aiy310001240.ogg"], //男主124 + ["梅尔特", "「来,喝完这杯就去加油工作吧」", "aiy120000680.ogg"], //老板娘67 + ["凯伊姆", "「啊啊」", "aiy310001250.ogg"], //男主125 + ["凯伊姆", "「我走了」", "aiy310001260.ogg"], //男主126 + ["艾莉斯", "「加油(受伤)吧」", "aiy020000370.ogg"], //医生37 + ["梅尔特", "「一路走好」", "aiy120000690.ogg"], //老板娘68 + ]; + this.chapter05 = [ + ["", "今晚的娼馆街比平常来得更加热闹"], + ["", "视线中可以看到很多生客。"], + ["莉莎", "「呀——!」", "aiy150000010.ogg"], //三小只C01 + ["莉莎", "「呐,凯伊姆凯伊姆凯伊姆」", "aiy150000020.ogg"], //三小只C02 + ["莉莎", "「我难道没有魅力吗?」", "aiy150000030.ogg"], //三小只C03 + ["凯伊姆", "「突然之间怎么了」", "aiy310001270.ogg"], //男主127 + ["莉莎", "「因为因为因为,明明这么热闹,却只有我没有接到客人」", "aiy150000040.ogg"], //三小只C04 + ["莉莎", "「亏我还对他们说,我会用超绝的技巧让他们舒服得如同化作夜明的流星般呢」", "aiy150000050.ogg"], //三小只C05 + ["凯伊姆", "「那个台词太糟糕了」", "aiy310001280.ogg"], //男主128 + ["莉莎", "「哎—什么啊,这可是我昨天花了一晚上考虑出来的呢」", "aiy150000060.ogg"], //三小只C06 + ["凯伊姆", "「去睡觉,不要用你那空空如也的脑袋去考虑这种无聊事」", "aiy310001290.ogg"], //男主129 + ["莉莎", "「好过分!?」", "aiy150000070.ogg"], //三小只C07 + ["凯伊姆", "「你看看周围,今天有很多新客人吧?」", "aiy310001300.ogg"], //男主130 + ["莉莎", "「嗯~~」", "aiy150000080.ogg"], //三小只C08 + ["莉莎", "「啊,你这么一说还真是」", "aiy150000090.ogg"], //三小只C09 + ["凯伊姆", "「他们心里都很紧张,不可能会被你这种强拉的手法钓上钩吧」", "aiy310001310.ogg"], //男主131 + ["莉莎", "「这样啊,是不想欲仙欲死吗?」", "aiy150000100.ogg"], //三小只C10 + ["凯伊姆", "「不,没有男人不会希望那样的」", "aiy310001320.ogg"], //男主132 + ["凯伊姆", "「不过,强来是不行的。去让他们被温柔地包容着化作流星吧」", "aiy310001330.ogg"], //男主133 + ["莉莎", "「原—来如此」", "aiy150000110.ogg"], //三小只C11 + ["莉莎", "「凯伊姆肯定很有娼妇的才能哦」", "aiy150000120.ogg"], //三小只C12 + ["凯伊姆", "「没有」", "aiy310001340.ogg"], //男主134 + ["凯伊姆", "「好了,你赶紧去赚钱吧」", "aiy310001350.ogg"], //男主135 + ["莉莎", "「收到—」", "aiy150000130.ogg"], //三小只C13 + ["", "莉莎精神满满地回答后,就啪嗒啪嗒地跑开了。"], + ["莉莎", "「呐—那边的大哥哥,和我一起化作星光吧—」", "aiy150000140.ogg"], //三小只C14 + ["", "这家伙"], + ["", "非要用这么麻烦的说法么。"], + ["", "咚"], + ["莉莎", "「呀」", "aiy150000150.ogg"], //三小只C15 + ["大胡子醉汉", "「好疼」", "aiy800000010.ogg"], + ["", "突然,莉莎与一个男人相撞。"], + ["", "虽然男人可以摆出派头,但从那虚浮的脚步可以看出他相当的醉意。"], + ["莉莎", "「好疼疼,对不起」", "aiy150000160.ogg"], //三小只C16 + ["大胡子醉汉", "「这不是道歉就能了事的事吧,大姐—」", "aiy800000020.ogg"], + ["大胡子醉汉", "「哟,穿得相当清凉啊,喂」", "aiy800000030.ogg"], + ["大肚子的醉汉", "「喂—怎么了?」", "aiy810000010.ogg"], + ["大胡子醉汉", "「这位小姐特意往我身上撞呢」", "aiy800000040.ogg"], + ["大肚子的醉汉", "「喂喂喂喂,你是要做什么」", "aiy810000020.ogg"], + ["莉莎", "「呜哎—所以我都说对不起了啊」", "aiy150000170.ogg"], //三小只C17 + ["莉莎", "「对,对了。作为冲撞的补偿,我会给您提供很好的服务的,怎么样?」", "aiy150000180.ogg"], //三小只C18 + ["大胡子醉汉", "「是免费的吧?」", "aiy800000050.ogg"], + ["莉莎", "「那个······这,这姑且也是工作······免费就太」", "aiy150000190.ogg"], //三小只C19 + ["大肚子的醉汉", "「真是的,娼妇就是这种人。钱,钱,钱,完全没有做人的诚意」", "aiy810000030.ogg"], + ["大胡子醉汉", "「好—你这家伙。我给你钱,你现在就在这里给我服务」", "aiy800000060.ogg"], + ["莉莎", "「这,这该怎么说呢,稍微有些过了吧,在这里做很害羞的」", "aiy150000200.ogg"], //三小只C20 + ["大胡子醉汉", "「你除了晃腰以外还有用得着脑子的地方吗?别说这种像个人说的话啊」", "aiy800000070.ogg"], + ["大肚子的醉汉", "「啊啊?这些钱不够吗?」", "aiy810000040.ogg"], + ["大胡子醉汉", "「来,赶快把脚张开让我O,你们最喜欢这种事了吧?」", "aiy800000080.ogg"], + ["莉莎", "「是,是认真的吗······这些人」", "aiy150000210.ogg"], //三小只C21 + ["大肚子的醉汉", "「赶快做」", "aiy810000050.ogg"], + ["莉莎", "「呃······」", "aiy150000220.ogg"], //三小只C22 + ["凯伊姆", "「喂」", "aiy310001360.ogg"], //男主136 + ["大肚子的醉汉", "「啊?」", "aiy810000060.ogg"], + ["凯伊姆", "「即便是娼妇,也有不能出售的东西」", "aiy310001370.ogg"], //男主137 + ["", "喀"], + ["", "我一拳击中男人被酒精染红的脸,"], + ["大胡子醉汉", "「咦」", "aiy800000090.ogg"], + ["", "嘎"], + ["", "再一拳击中另一个人的腹部。"], + ["大肚子的醉汉", "「咕······」", "aiy810000070.ogg"], + ["大胡子醉汉", "「唔······」", "aiy800000100.ogg"], + ["", "两人像两只毛虫般躺在地上蠕动着挣扎"], + ["", "一时半会应该起不来了吧"], + ["莉莎", "「凯伊姆先生,太迟了太迟了太迟了」", "aiy150000230.ogg"], //三小只C23 + ["凯伊姆", "「都是你闯出的祸吧」", "aiy310001380.ogg"], //男主138 + ["莉莎", "「话是,那么说,可是」", "aiy150000240.ogg"], //三小只C24 + ["凯伊姆", "「赶快回莉莉乌姆去」", "aiy310001390.ogg"], //男主139 + ["莉莎", "「唔,嗯。谢了,凯伊姆。再见」", "aiy150000250.ogg"], //三小只C25 + ["", "久留无用"], + ]; + this.chapter06 = [ + ["", "漂浮的紫烟与甜美香醇的空气。"], + + + ]; +}, + "动画及周期装备映射": function () { + // 在此增加新插件 + this.equip = { + //所有回合中的装备及速度 + sword1: { id: "sword1", speed: 10 }, + }; + this.heroanimate = { + //勇士武器对应的动画(key为主手武器ID,value为帧动画名) + sword1: "sword", + }; + this.enemyanimate = { + //怪物对应的动画(key为怪物ID,value为帧动画名) + bat: "sword", + }; + this.equipanimate = { + //勇士周期性装备对应的动画(key为装备Id,value为帧动画名) + shield0: "sword", + }; +}, + "勇士法抗乘算叠加": 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"); - - main.dom.gameDraw.appendChild(animateAttack); - - this.drawAttackAnimate = function ( - heroInfo, - oneTurn, - enemyInfo, - equipInfo, - farme, - damageInfo + items.prototype.compareEquipment = function ( + compareEquipId, + beComparedEquipId ) { - 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" - ); + var result = { value: {}, percentage: {} }; + var first = core.material.items[compareEquipId], + second = core.material.items[beComparedEquipId]; + for (var one in result) { + for (var name in core.status.hero) { + if (name === "mdef" && one === "percentage") { + var ans = 1; + if (first?.equip?.[one]?.[name]) + ans *= 1 - (first.equip[one][name] || 0) / 100; - 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 - ); + if (second?.equip?.[one]?.[name]) + ans /= 1 - (second.equip[one][name] || 0) / 100; - 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.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.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 (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(); - 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; - }); + if (ans != 1) result[one][name] = ans; + } else if (name === "mdef" && one === "value") { + var ans = 0; + if (first) ans -= ((first.equip || {})[one] || {})[name] || 0; + if (second) ans += ((second.equip || {})[one] || {})[name] || 0; + if (ans != 0) result[one][name] = ans; + } else { + if (typeof core.status.hero[name] == "number") { + var ans = 0; + if (first) ans += ((first.equip || {})[one] || {})[name] || 0; + if (second) ans -= ((second.equip || {})[one] || {})[name] || 0; + if (ans != 0) result[one][name] = ans; + } + } } - }); + } + return result; }; + let a = 1; + items.prototype._loadEquipEffect = function (equipId, unloadEquipId) { + // 比较能力值 + var result = core.compareEquipment(equipId, unloadEquipId); - 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; + for (var name in result.percentage) { + if (name === "mdef") { + a *= result.percentage[name]; + core.setBuff(name, 1 - a); + } else { + core.addBuff(name, result.percentage[name] / 100); } } - 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++; - } - }); + for (var name in result.value) + core.status.hero[name] += result.value[name]; }; }, - "剧情内容": function () { - // 在此增加新插件 - // 每项为一个数组,第一项是名字,第二项是对话内容 - // 回放只会在同一个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 = [ - ["梅尔特", "「欢迎光临」"], - ["梅尔特", "「辛苦了」"], - ["梅尔特", "「抱歉,又拜托给你了个这么麻烦的工作」"], - ["凯伊姆", "「没什么,比想象中完成的更容易」"], - ["梅尔特", "「那就好」"], - ["梅尔特", "「这是我的一点谢意」"], - ["凯伊姆", "「味道有些变化啊」"], - ["梅尔特", "「啊,被发现了?」"], - ["梅尔特", "「最近,没能到手什么好的原料呢」"], - ["凯伊姆", "「去拜托吉克如何?」"], - [ - "梅尔特", - "「话是这么说,但是总不能用店里采购的这种小事去麻烦他吧······」", - ], - ["凯伊姆", "「那希望你也不要来麻烦我」"], - ["梅尔特", "「那 是 两 码 事」"], - ["梅尔特", "「再说,凯伊姆是靠着工作来生活的吧」"], - [ - "梅尔特", - "「而且,自己的钱被偷了这么害羞的事,向凯伊姆意外的其他人都说不出口」", - ], - ["凯伊姆", "「反正,也已经传到吉克的耳朵里了」"], - ["梅尔特", "「这是面子问题啊,面子问题」"], - ["凯伊姆", "「嘛,算了」"], - ["凯伊姆", "「这样就好了吧?」"], - ["梅尔特", "「这是钱包呢」"], - ["梅尔特", "「嗯,东西没少」"], - ["梅尔特", "「太好啦—这个月的上纳金,我可全部都放在里面了呢」"], - ["梅尔特", "「如果没有找到的话,说不定就又会被送到娼馆里了呢」"], - ["凯伊姆", "「在那边不是来钱更快吗?」"], - ["梅尔特", "「阿拉,你是在说我还能有魅力吗?」"], - ["凯伊姆", "「这是客套话而已」"], - ["梅尔特", "「欺负人」"], - ["梅尔特", "「总而言之,今天帮大忙了」"], - ["梅尔特", "「谢礼嘛······」"], - ["凯伊姆", "「就记在账单上吧」"], - ["梅尔特", "「了解—盛谢惠顾了哦?」"], - ["", "喀啷喀啷"], - ["", "门铃响起"], - ["", "喧哗瞬间安静下来。"], - ["", "进来的人是吉克。"], - ["", "是掌控着牢狱的组织之一,《不蚀金锁》的头目。"], - ["", "不仅组织的成员,就连店内一般的客人也对他以注目礼表示敬意。"], - ["吉克", "「各位继续吧」"], - ["", "仿佛停滞的时钟重新转动了一般,店内恢复了热闹的气氛。"], - ["吉克", "「抱歉,今天拜托你去做了无聊的工作」。"], - ["凯伊姆", "「不用介意」"], - ["", "吉克轻轻点了点头,在我右边坐了下来"], - ["凯伊姆", "「逃跑的男人怎么样了?」"], - ["吉克", "「嗯?已经不在这个世上了」。"], - ["吉克", "「有什么想要知道的事吗?」"], - ["凯伊姆", "「不,没什么」"], - ["吉克", "「那个无聊的家伙,完全没有趣味呢」"], - ["吉克", "「真希望他也替我负责清扫的部下也考虑考虑」"], - ["凯伊姆", "「真是灾难啊」"], - ["吉克", "「比起那个,我听说了哦。你去追羽化病人了啊」"], - ["凯伊姆", "「消息真灵通」"], - ["吉克", "「梅尔特也注意点」"], - ["吉克", "「你丢钱已经不是一回两回了」"], - ["梅尔特", "「好的—我会注意的。」"], - ["梅尔特", "「吉克还是平常的点单吧」"], - ["梅尔特", "「凯伊姆要再来一杯吗?」"], - ["", "我们用眼神点头示意后,梅尔特开始准备起酒来。"], - ["", "悠然地吐出眼圈后,吉克取出一个纸包放在柜台上。"], - ["吉克", "「这是抓捕逃跑男人的报酬」"], - ["凯伊姆", "「下次有什么事再告诉我」"], - ["梅尔特", "「来,久等了」"], - ["凯伊姆", "「话说回来梅尔特,为什么会被那种孩子偷到钱?」"], - ["吉克", "「让我猜猜看」"], - ["吉克", "「是那个吧,看某个特立独行的男人入迷了,所以就有了空隙?」"], - ["梅尔特", "「可惜—」"], - ["梅尔特", "「事实恰恰相反,是那家伙一直在纠缠我」"], - ["凯伊姆", "「完全把你当成新进的女佣了么」"], - ["梅尔特", "「我从前可是很有名的,不会被当成这种下人吧」"], - ["梅尔特", "「······而且,我没法对对我这么钟情的人发火啊」"], - ["凯伊姆&吉克", "「你傻啊」"], - ["梅尔特", "「异口同声呢,不亏是兄弟」"], - ["凯伊姆", "「别用这种称呼,怪恶心的」"], - ["吉克", "「说得没错」"], - ["吉克", "「······说起来······」"], - ["梅尔特", "「怎么了?」"], - ["吉克", "「有件事我一直很在意,我和凯伊姆,哪个是哥哥啊?」"], - ["凯伊姆", "「你也说这么无聊的话题」"], - ["吉克", "「不,这是很重要的事情」"], - ["吉克", "「梅尔特,事实是怎么样的?」"], - ["梅尔特", "「啊~是怎么样的呢~」"], - ["梅尔特", "「我忘记了」"], - ["吉克", "「骗人」"], - ]; - } + "攻速临界": function () { + // 在此增加新插件 + //临界表 + core.ui._drawBookDetail_turnAndCriticals = function (enemy, floorId, texts) { + // 临界表 + var criticals = core.enemys.nextCriticals(enemy.id, 8, enemy.x, enemy.y, floorId).map(function (v) { + return core.formatBigNumber(v[0]) + ":" + core.formatBigNumber(v[1]); + }); + while (criticals[0] == '0:0') criticals.shift(); + texts.push("\r[#FF6A6A]\\d攻击临界表:\\d\r[]" + JSON.stringify(criticals)); + var criticals_spell = core.nextCriticals_spell(enemy.id, 8, enemy.x, enemy.y, floorId).map(function (v) { + return core.formatBigNumber(v[0]) + ":" + core.formatBigNumber(v[1]); + }); + while (criticals_spell[0] == '0:0') criticals_spell.shift(); + texts.push("\r[#FF6A6A]\\d法强临界表:\\d\r[]" + JSON.stringify(criticals_spell)); + var criticals_speed = core.nextCriticals_speed(enemy.id, 8, enemy.x, enemy.y, floorId).map(function (v) { + return core.formatBigNumber(v[0]) + ":" + core.formatBigNumber(v[1]); + }); + while (criticals_speed[0] == '0:0') criticals_speed.shift(); + texts.push("\r[#FF6A6A]\\d速度临界表:\\d\r[]" + JSON.stringify(criticals_speed)); + + } + //攻速临界计算 + core.nextCriticals_speed = function (enemy, number, x, y, floorId) { + if (typeof enemy == 'string') enemy = core.material.enemys[enemy]; + number = number || 1; + + var info = core.getDamageInfo(enemy, null, x, y, floorId); + if (info == null) { // 如果未破防... + return [ + ['?', '?'] + ]; + } + + if (typeof info == 'number') { + return [ + [0, 0] + ]; + } + return core.enemys._nextSpeedCriticals_useBinarySearch(enemy, info, number, x, y, floorId); + } + enemys.prototype._nextSpeedCriticals_useBinarySearch = function (enemy, info, number, x, y, floorId) { + var mon_hp = info.mon_hp, + hero_speed = core.status.hero.speed, + mon_def = info.mon_def, + pre = info.damage; + var list = []; + var start_speed = hero_speed; + + var calNext = function (currSpeed, maxSpeed) { + var start = Math.floor(currSpeed), + end = Math.floor(maxSpeed); + 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, { "speed": 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, { "speed": start }, x, y, floorId); + return nextInfo == null || (typeof nextInfo == 'number') || nextInfo.damage >= pre ? null : [start, nextInfo.damage]; + } + var currSpeed = start_speed; + while (true) { + var next = calNext(currSpeed + 1, Number.MAX_SAFE_INTEGER, pre); + if (next == null) break; + currSpeed = next[0]; + pre = next[1]; + list.push([currSpeed - hero_speed, 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.nextCriticals_spell = function (enemy, number, x, y, floorId) { + if (typeof enemy == 'string') enemy = core.material.enemys[enemy]; + number = number || 1; + + var info = core.getDamageInfo(enemy, null, x, y, floorId); + if (info == null) { // 如果未破防... + return [ + ['?', '?'] + ]; + } + + if (typeof info == 'number') { + return [ + [0, 0] + ]; + } + return core.enemys._nextSpellCriticals_useBinarySearch(enemy, info, number, x, y, floorId); + } + enemys.prototype._nextSpellCriticals_useBinarySearch = function (enemy, info, number, x, y, floorId) { + var mon_hp = info.mon_hp, + hero_spell = core.status.hero.spell, + mon_def = info.mon_def, + turn = info.mon_turn, + pre = info.damage; + var list = []; + var start_spell = hero_spell; + + var calNext = function (currSpell, maxSpell) { + var start = Math.floor(currSpell), + end = Math.floor(maxSpell); + 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, { "spell": mid }, x, y, floorId); + if (nextInfo == null || (typeof nextInfo == 'number')) return null; + if (turn > nextInfo.mon_turn) end = mid; + else start = mid + 1; + } + var nextInfo = core.enemys.getDamageInfo(enemy, { "spell": start }, x, y, floorId); + return nextInfo == null || (typeof nextInfo == 'number') || nextInfo.mon_turn >= turn ? null : [start, nextInfo.damage]; + } + var currSpell = start_spell; + while (true) { + var next = calNext(currSpell + 1, Number.MAX_SAFE_INTEGER, pre, turn); + if (next == null) break; + currSpell = next[0]; + pre = next[1]; + list.push([currSpell - hero_spell, 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; + } +}, + "手册(临时)": function () { + // 在此增加新插件 + ui.prototype._drawBook_drawContent = function (index, enemy, top, left) { + var width = core._PX_ - left; // 9 : 8 : 8 划分三列 + this._drawBook_drawRow1(index, enemy, top, left, width, top + 20); + this._drawBook_drawRow4(index, enemy, top, left, width, top + 38); + this._drawBook_drawRow2(index, enemy, top, left, width, top + 56); + this._drawBook_drawRow3(index, enemy, top, left, width, top + 74); + this._drawBook_drawRow5(index, enemy, top, left, width, top + 90); + } + + ui.prototype._drawBook_drawRow4 = function (index, enemy, top, left, width, position) { + // 绘制第一行 + core.setTextAlign('ui', 'left'); + var b13 = this._buildFont(13, true), + f13 = this._buildFont(13, false); + var col1 = left, + col2 = left + width * 9 / 25, + col3 = left + width * 17 / 25; + core.fillText('ui', core.getStatusLabel('speed'), col1, position, '#DDDDDD', f13); + core.fillText('ui', core.formatBigNumber(enemy.speed || 0), col1 + 30, position, null, b13); + core.fillText('ui', core.getStatusLabel('spell'), col2, position, null, f13); + core.fillText('ui', core.formatBigNumber(enemy.spell || 0), col2 + 30, position, null, b13); + core.fillText('ui', core.getStatusLabel('mdef'), col3, position, null, f13); + core.fillText('ui', core.formatBigNumber(enemy.mdef || 0) + "%", col3 + 30, position, null, b13); + } + ui.prototype._drawBook_drawRow5 = function (index, enemy, top, left, width, position) { + // 绘制第一行 + core.setTextAlign('ui', 'left'); + var b13 = this._buildFont(13, true), + f13 = this._buildFont(13, false); + var col1 = left, + col2 = left + width * 13 / 25; + core.fillText('ui', '速度临界', col1 - 120, position, '#DDDDDD', f13); + core.fillText('ui', `[${core.formatBigNumber(enemy.criticalSpeed?.[0] || 0)},${core.formatBigNumber(enemy.criticalSpeed?.[1] || 0)}]`, col1 - 60, position, null, b13); + + core.fillText('ui', "勇士出手次数", col1, position, '#DDDDDD', f13); + core.fillText('ui', core.getDamageInfo(enemy, null) ? core.getDamageInfo(enemy, null).hero_turn : '???', col1 + 80, position, null, b13); + core.fillText('ui', "怪物出手次数", col2, position, null, f13); + core.fillText('ui', core.getDamageInfo(enemy, null) ? core.getDamageInfo(enemy, null).mon_turn : '???', col2 + 80, position, null, b13); + + } + ui.prototype._drawBook_pageinfo = function () { + var per_page = 4; + var padding_top = 12; // 距离顶端像素 + var per_height = (core._PY_ - 32 - padding_top) / per_page; + return { per_page: per_page, padding_top: padding_top, per_height: per_height }; + } +}, + "新怪物手册": function () { + // 在此增加新插件 + const book = document.createElement("canvas"); //创建怪物手册画布 + book.style.position = "absolute"; + book.style.zIndex = 400; + book.style.display = "none"; + book.id = "book"; + main.dom.gameGroup.insertAdjacentElement("afterend", book); + book.style.top = "50%"; + book.style.left = "50%"; + book.style.transform = "translate(-50%,-50%)"; + const ctx = book.getContext("2d"); + main.dom.book = book + + book.onclick = function (e) { //画布点击监听 + try { + e.preventDefault(); + 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); + + let x, y; + if (core.domStyle.isVertical) { //对竖屏进行坐标转换 + x = py * 3; + y = 1248 - px * 3; + } else { + x = px * 3; + y = py * 3; + } + bookclick(x, y) + } catch (ee) { + main.log(ee); + } + } + + function bookclick(x, y) { //点击画布(x,y)触发的效果 + const makeBox = ([x, y], [w, h]) => { //创建点击检测区域 + return [ + [x, y], + [x + w, y + h], + ]; + }; + const pos = [x, y]; //创建点击坐标pos + const inRect = ([x, y], [ //检测点击坐标是否在检测区域中 + [sx, sy], + [dx, dy] + ]) => { + return sx <= x && x <= dx && sy <= y && y <= dy; + }; + /** + * 使用范例 + *const backbox = makeBox([15, 35], [210, 90]); + *if(inRect(pos,backbox)){} + */ + } + this.drawBook = function (floorId = core.status.floorId) { + 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; + } + //在这里写绘制内容,只写横屏就行 + + ctx.restore(); //恢复变换前的坐标,否则将连续转置 + } +} } \ No newline at end of file diff --git a/project/sounds/aiy020000190.ogg b/project/sounds/aiy020000190.ogg new file mode 100644 index 0000000..8212ba6 Binary files /dev/null and b/project/sounds/aiy020000190.ogg differ diff --git a/project/sounds/aiy020000200.ogg b/project/sounds/aiy020000200.ogg new file mode 100644 index 0000000..8f710f0 Binary files /dev/null and b/project/sounds/aiy020000200.ogg differ diff --git a/project/sounds/aiy020000210.ogg b/project/sounds/aiy020000210.ogg new file mode 100644 index 0000000..e4f719f Binary files /dev/null and b/project/sounds/aiy020000210.ogg differ diff --git a/project/sounds/aiy020000220.ogg b/project/sounds/aiy020000220.ogg new file mode 100644 index 0000000..cf59706 Binary files /dev/null and b/project/sounds/aiy020000220.ogg differ diff --git a/project/sounds/aiy020000230.ogg b/project/sounds/aiy020000230.ogg new file mode 100644 index 0000000..c7469e0 Binary files /dev/null and b/project/sounds/aiy020000230.ogg differ diff --git a/project/sounds/aiy020000240.ogg b/project/sounds/aiy020000240.ogg new file mode 100644 index 0000000..dc062c2 Binary files /dev/null and b/project/sounds/aiy020000240.ogg differ diff --git a/project/sounds/aiy020000250.ogg b/project/sounds/aiy020000250.ogg new file mode 100644 index 0000000..19608c4 Binary files /dev/null and b/project/sounds/aiy020000250.ogg differ diff --git a/project/sounds/aiy020000260.ogg b/project/sounds/aiy020000260.ogg new file mode 100644 index 0000000..fc86122 Binary files /dev/null and b/project/sounds/aiy020000260.ogg differ diff --git a/project/sounds/aiy020000270.ogg b/project/sounds/aiy020000270.ogg new file mode 100644 index 0000000..8a9e875 Binary files /dev/null and b/project/sounds/aiy020000270.ogg differ diff --git a/project/sounds/aiy020000280.ogg b/project/sounds/aiy020000280.ogg new file mode 100644 index 0000000..804c47b Binary files /dev/null and b/project/sounds/aiy020000280.ogg differ diff --git a/project/sounds/aiy020000290.ogg b/project/sounds/aiy020000290.ogg new file mode 100644 index 0000000..46e1502 Binary files /dev/null and b/project/sounds/aiy020000290.ogg differ diff --git a/project/sounds/aiy020000300.ogg b/project/sounds/aiy020000300.ogg new file mode 100644 index 0000000..d5445c7 Binary files /dev/null and b/project/sounds/aiy020000300.ogg differ diff --git a/project/sounds/aiy020000310.ogg b/project/sounds/aiy020000310.ogg new file mode 100644 index 0000000..e197805 Binary files /dev/null and b/project/sounds/aiy020000310.ogg differ diff --git a/project/sounds/aiy020000320.ogg b/project/sounds/aiy020000320.ogg new file mode 100644 index 0000000..eadca46 Binary files /dev/null and b/project/sounds/aiy020000320.ogg differ diff --git a/project/sounds/aiy020000330.ogg b/project/sounds/aiy020000330.ogg new file mode 100644 index 0000000..24af673 Binary files /dev/null and b/project/sounds/aiy020000330.ogg differ diff --git a/project/sounds/aiy020000340.ogg b/project/sounds/aiy020000340.ogg new file mode 100644 index 0000000..34d7e41 Binary files /dev/null and b/project/sounds/aiy020000340.ogg differ diff --git a/project/sounds/aiy020000350.ogg b/project/sounds/aiy020000350.ogg new file mode 100644 index 0000000..25d0572 Binary files /dev/null and b/project/sounds/aiy020000350.ogg differ diff --git a/project/sounds/aiy020000360.ogg b/project/sounds/aiy020000360.ogg new file mode 100644 index 0000000..e46bc3e Binary files /dev/null and b/project/sounds/aiy020000360.ogg differ diff --git a/project/sounds/aiy020000370.ogg b/project/sounds/aiy020000370.ogg new file mode 100644 index 0000000..f929ecb Binary files /dev/null and b/project/sounds/aiy020000370.ogg differ diff --git a/project/sounds/aiy030000010.ogg b/project/sounds/aiy030000010.ogg new file mode 100644 index 0000000..9b9d46d Binary files /dev/null and b/project/sounds/aiy030000010.ogg differ diff --git a/project/sounds/aiy030000020.ogg b/project/sounds/aiy030000020.ogg new file mode 100644 index 0000000..a0f4ebb Binary files /dev/null and b/project/sounds/aiy030000020.ogg differ diff --git a/project/sounds/aiy030000030.ogg b/project/sounds/aiy030000030.ogg new file mode 100644 index 0000000..14a2ca8 Binary files /dev/null and b/project/sounds/aiy030000030.ogg differ diff --git a/project/sounds/aiy030000050.ogg b/project/sounds/aiy030000050.ogg new file mode 100644 index 0000000..9bc3077 Binary files /dev/null and b/project/sounds/aiy030000050.ogg differ diff --git a/project/sounds/aiy030000060.ogg b/project/sounds/aiy030000060.ogg new file mode 100644 index 0000000..ff055c2 Binary files /dev/null and b/project/sounds/aiy030000060.ogg differ diff --git a/project/sounds/aiy030000070.ogg b/project/sounds/aiy030000070.ogg new file mode 100644 index 0000000..2e7dcba Binary files /dev/null and b/project/sounds/aiy030000070.ogg differ diff --git a/project/sounds/aiy030000080.ogg b/project/sounds/aiy030000080.ogg new file mode 100644 index 0000000..efc3d38 Binary files /dev/null and b/project/sounds/aiy030000080.ogg differ diff --git a/project/sounds/aiy030000090.ogg b/project/sounds/aiy030000090.ogg new file mode 100644 index 0000000..8f9fb91 Binary files /dev/null and b/project/sounds/aiy030000090.ogg differ diff --git a/project/sounds/aiy030000100.ogg b/project/sounds/aiy030000100.ogg new file mode 100644 index 0000000..0dbf5bc Binary files /dev/null and b/project/sounds/aiy030000100.ogg differ diff --git a/project/sounds/aiy030000110.ogg b/project/sounds/aiy030000110.ogg new file mode 100644 index 0000000..f722e49 Binary files /dev/null and b/project/sounds/aiy030000110.ogg differ diff --git a/project/sounds/aiy030000120.ogg b/project/sounds/aiy030000120.ogg new file mode 100644 index 0000000..53ac3bf Binary files /dev/null and b/project/sounds/aiy030000120.ogg differ diff --git a/project/sounds/aiy030000130.ogg b/project/sounds/aiy030000130.ogg new file mode 100644 index 0000000..aa157af Binary files /dev/null and b/project/sounds/aiy030000130.ogg differ diff --git a/project/sounds/aiy050000010.ogg b/project/sounds/aiy050000010.ogg new file mode 100644 index 0000000..6a9a4a2 Binary files /dev/null and b/project/sounds/aiy050000010.ogg differ diff --git a/project/sounds/aiy050000020.ogg b/project/sounds/aiy050000020.ogg new file mode 100644 index 0000000..9b9cdf8 Binary files /dev/null and b/project/sounds/aiy050000020.ogg differ diff --git a/project/sounds/aiy050000030.ogg b/project/sounds/aiy050000030.ogg new file mode 100644 index 0000000..d328ca8 Binary files /dev/null and b/project/sounds/aiy050000030.ogg differ diff --git a/project/sounds/aiy050000040.ogg b/project/sounds/aiy050000040.ogg new file mode 100644 index 0000000..cc11d60 Binary files /dev/null and b/project/sounds/aiy050000040.ogg differ diff --git a/project/sounds/aiy050000050.ogg b/project/sounds/aiy050000050.ogg new file mode 100644 index 0000000..590349f Binary files /dev/null and b/project/sounds/aiy050000050.ogg differ diff --git a/project/sounds/aiy050000060.ogg b/project/sounds/aiy050000060.ogg new file mode 100644 index 0000000..a77d3ba Binary files /dev/null and b/project/sounds/aiy050000060.ogg differ diff --git a/project/sounds/aiy050000070.ogg b/project/sounds/aiy050000070.ogg new file mode 100644 index 0000000..9213193 Binary files /dev/null and b/project/sounds/aiy050000070.ogg differ diff --git a/project/sounds/aiy050000080.ogg b/project/sounds/aiy050000080.ogg new file mode 100644 index 0000000..29a2c70 Binary files /dev/null and b/project/sounds/aiy050000080.ogg differ diff --git a/project/sounds/aiy050000090.ogg b/project/sounds/aiy050000090.ogg new file mode 100644 index 0000000..b0e5931 Binary files /dev/null and b/project/sounds/aiy050000090.ogg differ diff --git a/project/sounds/aiy050000100.ogg b/project/sounds/aiy050000100.ogg new file mode 100644 index 0000000..59e7ebc Binary files /dev/null and b/project/sounds/aiy050000100.ogg differ diff --git a/project/sounds/aiy050000110.ogg b/project/sounds/aiy050000110.ogg new file mode 100644 index 0000000..e198a48 Binary files /dev/null and b/project/sounds/aiy050000110.ogg differ diff --git a/project/sounds/aiy050000120.ogg b/project/sounds/aiy050000120.ogg new file mode 100644 index 0000000..ac4bf72 Binary files /dev/null and b/project/sounds/aiy050000120.ogg differ diff --git a/project/sounds/aiy120000020.ogg b/project/sounds/aiy120000020.ogg new file mode 100644 index 0000000..10d2ae0 Binary files /dev/null and b/project/sounds/aiy120000020.ogg differ diff --git a/project/sounds/aiy120000030.ogg b/project/sounds/aiy120000030.ogg new file mode 100644 index 0000000..2a0dc02 Binary files /dev/null and b/project/sounds/aiy120000030.ogg differ diff --git a/project/sounds/aiy120000040.ogg b/project/sounds/aiy120000040.ogg new file mode 100644 index 0000000..f9f0f66 Binary files /dev/null and b/project/sounds/aiy120000040.ogg differ diff --git a/project/sounds/aiy120000050.ogg b/project/sounds/aiy120000050.ogg new file mode 100644 index 0000000..0cb03e6 Binary files /dev/null and b/project/sounds/aiy120000050.ogg differ diff --git a/project/sounds/aiy120000060.ogg b/project/sounds/aiy120000060.ogg new file mode 100644 index 0000000..bdf482e Binary files /dev/null and b/project/sounds/aiy120000060.ogg differ diff --git a/project/sounds/aiy120000070.ogg b/project/sounds/aiy120000070.ogg new file mode 100644 index 0000000..c8822ac Binary files /dev/null and b/project/sounds/aiy120000070.ogg differ diff --git a/project/sounds/aiy120000080.ogg b/project/sounds/aiy120000080.ogg new file mode 100644 index 0000000..3cd1ff4 Binary files /dev/null and b/project/sounds/aiy120000080.ogg differ diff --git a/project/sounds/aiy120000090.ogg b/project/sounds/aiy120000090.ogg new file mode 100644 index 0000000..306c3d4 Binary files /dev/null and b/project/sounds/aiy120000090.ogg differ diff --git a/project/sounds/aiy120000100.ogg b/project/sounds/aiy120000100.ogg new file mode 100644 index 0000000..d6597f6 Binary files /dev/null and b/project/sounds/aiy120000100.ogg differ diff --git a/project/sounds/aiy120000110.ogg b/project/sounds/aiy120000110.ogg new file mode 100644 index 0000000..a322097 Binary files /dev/null and b/project/sounds/aiy120000110.ogg differ diff --git a/project/sounds/aiy120000120.ogg b/project/sounds/aiy120000120.ogg new file mode 100644 index 0000000..acb82fb Binary files /dev/null and b/project/sounds/aiy120000120.ogg differ diff --git a/project/sounds/aiy120000130.ogg b/project/sounds/aiy120000130.ogg new file mode 100644 index 0000000..8f231aa Binary files /dev/null and b/project/sounds/aiy120000130.ogg differ diff --git a/project/sounds/aiy120000140.ogg b/project/sounds/aiy120000140.ogg new file mode 100644 index 0000000..d3bbbb2 Binary files /dev/null and b/project/sounds/aiy120000140.ogg differ diff --git a/project/sounds/aiy120000150.ogg b/project/sounds/aiy120000150.ogg new file mode 100644 index 0000000..47f6a04 Binary files /dev/null and b/project/sounds/aiy120000150.ogg differ diff --git a/project/sounds/aiy120000160.ogg b/project/sounds/aiy120000160.ogg new file mode 100644 index 0000000..214c63b Binary files /dev/null and b/project/sounds/aiy120000160.ogg differ diff --git a/project/sounds/aiy120000170.ogg b/project/sounds/aiy120000170.ogg new file mode 100644 index 0000000..35d2f1b Binary files /dev/null and b/project/sounds/aiy120000170.ogg differ diff --git a/project/sounds/aiy120000180.ogg b/project/sounds/aiy120000180.ogg new file mode 100644 index 0000000..3417af8 Binary files /dev/null and b/project/sounds/aiy120000180.ogg differ diff --git a/project/sounds/aiy120000190.ogg b/project/sounds/aiy120000190.ogg new file mode 100644 index 0000000..37a6a52 Binary files /dev/null and b/project/sounds/aiy120000190.ogg differ diff --git a/project/sounds/aiy120000200.ogg b/project/sounds/aiy120000200.ogg new file mode 100644 index 0000000..18eefb3 Binary files /dev/null and b/project/sounds/aiy120000200.ogg differ diff --git a/project/sounds/aiy120000210.ogg b/project/sounds/aiy120000210.ogg new file mode 100644 index 0000000..67784d0 Binary files /dev/null and b/project/sounds/aiy120000210.ogg differ diff --git a/project/sounds/aiy120000220.ogg b/project/sounds/aiy120000220.ogg new file mode 100644 index 0000000..1e9d440 Binary files /dev/null and b/project/sounds/aiy120000220.ogg differ diff --git a/project/sounds/aiy120000230.ogg b/project/sounds/aiy120000230.ogg new file mode 100644 index 0000000..dc4d494 Binary files /dev/null and b/project/sounds/aiy120000230.ogg differ diff --git a/project/sounds/aiy120000240.ogg b/project/sounds/aiy120000240.ogg new file mode 100644 index 0000000..88a9404 Binary files /dev/null and b/project/sounds/aiy120000240.ogg differ diff --git a/project/sounds/aiy120000250.ogg b/project/sounds/aiy120000250.ogg new file mode 100644 index 0000000..44e9970 Binary files /dev/null and b/project/sounds/aiy120000250.ogg differ diff --git a/project/sounds/aiy120000260.ogg b/project/sounds/aiy120000260.ogg new file mode 100644 index 0000000..c93d37b Binary files /dev/null and b/project/sounds/aiy120000260.ogg differ diff --git a/project/sounds/aiy120000270.ogg b/project/sounds/aiy120000270.ogg new file mode 100644 index 0000000..97235e0 Binary files /dev/null and b/project/sounds/aiy120000270.ogg differ diff --git a/project/sounds/aiy120000280.ogg b/project/sounds/aiy120000280.ogg new file mode 100644 index 0000000..7153660 Binary files /dev/null and b/project/sounds/aiy120000280.ogg differ diff --git a/project/sounds/aiy120000290.ogg b/project/sounds/aiy120000290.ogg new file mode 100644 index 0000000..8c4db5b Binary files /dev/null and b/project/sounds/aiy120000290.ogg differ diff --git a/project/sounds/aiy120000300.ogg b/project/sounds/aiy120000300.ogg new file mode 100644 index 0000000..875d1f7 Binary files /dev/null and b/project/sounds/aiy120000300.ogg differ diff --git a/project/sounds/aiy120000310.ogg b/project/sounds/aiy120000310.ogg new file mode 100644 index 0000000..8720a02 Binary files /dev/null and b/project/sounds/aiy120000310.ogg differ diff --git a/project/sounds/aiy120000320.ogg b/project/sounds/aiy120000320.ogg new file mode 100644 index 0000000..c86806b Binary files /dev/null and b/project/sounds/aiy120000320.ogg differ diff --git a/project/sounds/aiy120000330.ogg b/project/sounds/aiy120000330.ogg new file mode 100644 index 0000000..0f21adc Binary files /dev/null and b/project/sounds/aiy120000330.ogg differ diff --git a/project/sounds/aiy120000340.ogg b/project/sounds/aiy120000340.ogg new file mode 100644 index 0000000..a055a78 Binary files /dev/null and b/project/sounds/aiy120000340.ogg differ diff --git a/project/sounds/aiy120000350.ogg b/project/sounds/aiy120000350.ogg new file mode 100644 index 0000000..0711a4f Binary files /dev/null and b/project/sounds/aiy120000350.ogg differ diff --git a/project/sounds/aiy120000360.ogg b/project/sounds/aiy120000360.ogg new file mode 100644 index 0000000..358c450 Binary files /dev/null and b/project/sounds/aiy120000360.ogg differ diff --git a/project/sounds/aiy120000370.ogg b/project/sounds/aiy120000370.ogg new file mode 100644 index 0000000..6381050 Binary files /dev/null and b/project/sounds/aiy120000370.ogg differ diff --git a/project/sounds/aiy120000380.ogg b/project/sounds/aiy120000380.ogg new file mode 100644 index 0000000..b80c4f0 Binary files /dev/null and b/project/sounds/aiy120000380.ogg differ diff --git a/project/sounds/aiy120000390.ogg b/project/sounds/aiy120000390.ogg new file mode 100644 index 0000000..c608bba Binary files /dev/null and b/project/sounds/aiy120000390.ogg differ diff --git a/project/sounds/aiy120000400.ogg b/project/sounds/aiy120000400.ogg new file mode 100644 index 0000000..656ae27 Binary files /dev/null and b/project/sounds/aiy120000400.ogg differ diff --git a/project/sounds/aiy120000410.ogg b/project/sounds/aiy120000410.ogg new file mode 100644 index 0000000..5f04e20 Binary files /dev/null and b/project/sounds/aiy120000410.ogg differ diff --git a/project/sounds/aiy120000420.ogg b/project/sounds/aiy120000420.ogg new file mode 100644 index 0000000..86e91fa Binary files /dev/null and b/project/sounds/aiy120000420.ogg differ diff --git a/project/sounds/aiy120000430.ogg b/project/sounds/aiy120000430.ogg new file mode 100644 index 0000000..957e986 Binary files /dev/null and b/project/sounds/aiy120000430.ogg differ diff --git a/project/sounds/aiy120000440.ogg b/project/sounds/aiy120000440.ogg new file mode 100644 index 0000000..45231db Binary files /dev/null and b/project/sounds/aiy120000440.ogg differ diff --git a/project/sounds/aiy120000450.ogg b/project/sounds/aiy120000450.ogg new file mode 100644 index 0000000..ad04858 Binary files /dev/null and b/project/sounds/aiy120000450.ogg differ diff --git a/project/sounds/aiy120000460.ogg b/project/sounds/aiy120000460.ogg new file mode 100644 index 0000000..d35ded8 Binary files /dev/null and b/project/sounds/aiy120000460.ogg differ diff --git a/project/sounds/aiy120000470.ogg b/project/sounds/aiy120000470.ogg new file mode 100644 index 0000000..546a039 Binary files /dev/null and b/project/sounds/aiy120000470.ogg differ diff --git a/project/sounds/aiy120000480.ogg b/project/sounds/aiy120000480.ogg new file mode 100644 index 0000000..65f673a Binary files /dev/null and b/project/sounds/aiy120000480.ogg differ diff --git a/project/sounds/aiy120000490.ogg b/project/sounds/aiy120000490.ogg new file mode 100644 index 0000000..36a5df2 Binary files /dev/null and b/project/sounds/aiy120000490.ogg differ diff --git a/project/sounds/aiy120000500.ogg b/project/sounds/aiy120000500.ogg new file mode 100644 index 0000000..db40172 Binary files /dev/null and b/project/sounds/aiy120000500.ogg differ diff --git a/project/sounds/aiy120000510.ogg b/project/sounds/aiy120000510.ogg new file mode 100644 index 0000000..0da2bbd Binary files /dev/null and b/project/sounds/aiy120000510.ogg differ diff --git a/project/sounds/aiy120000520.ogg b/project/sounds/aiy120000520.ogg new file mode 100644 index 0000000..30618ea Binary files /dev/null and b/project/sounds/aiy120000520.ogg differ diff --git a/project/sounds/aiy120000530.ogg b/project/sounds/aiy120000530.ogg new file mode 100644 index 0000000..63424e5 Binary files /dev/null and b/project/sounds/aiy120000530.ogg differ diff --git a/project/sounds/aiy120000540.ogg b/project/sounds/aiy120000540.ogg new file mode 100644 index 0000000..a491c40 Binary files /dev/null and b/project/sounds/aiy120000540.ogg differ diff --git a/project/sounds/aiy120000550.ogg b/project/sounds/aiy120000550.ogg new file mode 100644 index 0000000..1adb571 Binary files /dev/null and b/project/sounds/aiy120000550.ogg differ diff --git a/project/sounds/aiy120000560.ogg b/project/sounds/aiy120000560.ogg new file mode 100644 index 0000000..eafe149 Binary files /dev/null and b/project/sounds/aiy120000560.ogg differ diff --git a/project/sounds/aiy120000570.ogg b/project/sounds/aiy120000570.ogg new file mode 100644 index 0000000..f25d9d2 Binary files /dev/null and b/project/sounds/aiy120000570.ogg differ diff --git a/project/sounds/aiy120000580.ogg b/project/sounds/aiy120000580.ogg new file mode 100644 index 0000000..503d4e0 Binary files /dev/null and b/project/sounds/aiy120000580.ogg differ diff --git a/project/sounds/aiy120000590.ogg b/project/sounds/aiy120000590.ogg new file mode 100644 index 0000000..0fa071e Binary files /dev/null and b/project/sounds/aiy120000590.ogg differ diff --git a/project/sounds/aiy120000600.ogg b/project/sounds/aiy120000600.ogg new file mode 100644 index 0000000..6d22156 Binary files /dev/null and b/project/sounds/aiy120000600.ogg differ diff --git a/project/sounds/aiy120000610.ogg b/project/sounds/aiy120000610.ogg new file mode 100644 index 0000000..95b2a7d Binary files /dev/null and b/project/sounds/aiy120000610.ogg differ diff --git a/project/sounds/aiy120000620.ogg b/project/sounds/aiy120000620.ogg new file mode 100644 index 0000000..f03cf8f Binary files /dev/null and b/project/sounds/aiy120000620.ogg differ diff --git a/project/sounds/aiy120000630.ogg b/project/sounds/aiy120000630.ogg new file mode 100644 index 0000000..5420074 Binary files /dev/null and b/project/sounds/aiy120000630.ogg differ diff --git a/project/sounds/aiy120000640.ogg b/project/sounds/aiy120000640.ogg new file mode 100644 index 0000000..a204879 Binary files /dev/null and b/project/sounds/aiy120000640.ogg differ diff --git a/project/sounds/aiy120000650.ogg b/project/sounds/aiy120000650.ogg new file mode 100644 index 0000000..257b817 Binary files /dev/null and b/project/sounds/aiy120000650.ogg differ diff --git a/project/sounds/aiy120000670.ogg b/project/sounds/aiy120000670.ogg new file mode 100644 index 0000000..b603efe Binary files /dev/null and b/project/sounds/aiy120000670.ogg differ diff --git a/project/sounds/aiy120000680.ogg b/project/sounds/aiy120000680.ogg new file mode 100644 index 0000000..32f2bdd Binary files /dev/null and b/project/sounds/aiy120000680.ogg differ diff --git a/project/sounds/aiy120000690.ogg b/project/sounds/aiy120000690.ogg new file mode 100644 index 0000000..89a831c Binary files /dev/null and b/project/sounds/aiy120000690.ogg differ diff --git a/project/sounds/aiy130000010.ogg b/project/sounds/aiy130000010.ogg new file mode 100644 index 0000000..fe0e4e2 Binary files /dev/null and b/project/sounds/aiy130000010.ogg differ diff --git a/project/sounds/aiy130000020.ogg b/project/sounds/aiy130000020.ogg new file mode 100644 index 0000000..6e13850 Binary files /dev/null and b/project/sounds/aiy130000020.ogg differ diff --git a/project/sounds/aiy150000010.ogg b/project/sounds/aiy150000010.ogg new file mode 100644 index 0000000..0659452 Binary files /dev/null and b/project/sounds/aiy150000010.ogg differ diff --git a/project/sounds/aiy150000020.ogg b/project/sounds/aiy150000020.ogg new file mode 100644 index 0000000..798a9fc Binary files /dev/null and b/project/sounds/aiy150000020.ogg differ diff --git a/project/sounds/aiy150000030.ogg b/project/sounds/aiy150000030.ogg new file mode 100644 index 0000000..9022052 Binary files /dev/null and b/project/sounds/aiy150000030.ogg differ diff --git a/project/sounds/aiy150000040.ogg b/project/sounds/aiy150000040.ogg new file mode 100644 index 0000000..c6e6233 Binary files /dev/null and b/project/sounds/aiy150000040.ogg differ diff --git a/project/sounds/aiy150000050.ogg b/project/sounds/aiy150000050.ogg new file mode 100644 index 0000000..8764aee Binary files /dev/null and b/project/sounds/aiy150000050.ogg differ diff --git a/project/sounds/aiy150000060.ogg b/project/sounds/aiy150000060.ogg new file mode 100644 index 0000000..e305004 Binary files /dev/null and b/project/sounds/aiy150000060.ogg differ diff --git a/project/sounds/aiy150000070.ogg b/project/sounds/aiy150000070.ogg new file mode 100644 index 0000000..e2d173a Binary files /dev/null and b/project/sounds/aiy150000070.ogg differ diff --git a/project/sounds/aiy150000080.ogg b/project/sounds/aiy150000080.ogg new file mode 100644 index 0000000..8bed0cf Binary files /dev/null and b/project/sounds/aiy150000080.ogg differ diff --git a/project/sounds/aiy150000090.ogg b/project/sounds/aiy150000090.ogg new file mode 100644 index 0000000..8c35672 Binary files /dev/null and b/project/sounds/aiy150000090.ogg differ diff --git a/project/sounds/aiy150000100.ogg b/project/sounds/aiy150000100.ogg new file mode 100644 index 0000000..0fda997 Binary files /dev/null and b/project/sounds/aiy150000100.ogg differ diff --git a/project/sounds/aiy150000110.ogg b/project/sounds/aiy150000110.ogg new file mode 100644 index 0000000..2e7da86 Binary files /dev/null and b/project/sounds/aiy150000110.ogg differ diff --git a/project/sounds/aiy150000120.ogg b/project/sounds/aiy150000120.ogg new file mode 100644 index 0000000..1e6adc7 Binary files /dev/null and b/project/sounds/aiy150000120.ogg differ diff --git a/project/sounds/aiy150000130.ogg b/project/sounds/aiy150000130.ogg new file mode 100644 index 0000000..bdbefb9 Binary files /dev/null and b/project/sounds/aiy150000130.ogg differ diff --git a/project/sounds/aiy150000140.ogg b/project/sounds/aiy150000140.ogg new file mode 100644 index 0000000..5ec6eda Binary files /dev/null and b/project/sounds/aiy150000140.ogg differ diff --git a/project/sounds/aiy150000150.ogg b/project/sounds/aiy150000150.ogg new file mode 100644 index 0000000..28fad01 Binary files /dev/null and b/project/sounds/aiy150000150.ogg differ diff --git a/project/sounds/aiy150000160.ogg b/project/sounds/aiy150000160.ogg new file mode 100644 index 0000000..54bb342 Binary files /dev/null and b/project/sounds/aiy150000160.ogg differ diff --git a/project/sounds/aiy150000170.ogg b/project/sounds/aiy150000170.ogg new file mode 100644 index 0000000..44543c4 Binary files /dev/null and b/project/sounds/aiy150000170.ogg differ diff --git a/project/sounds/aiy150000180.ogg b/project/sounds/aiy150000180.ogg new file mode 100644 index 0000000..16682cc Binary files /dev/null and b/project/sounds/aiy150000180.ogg differ diff --git a/project/sounds/aiy150000190.ogg b/project/sounds/aiy150000190.ogg new file mode 100644 index 0000000..74b719a Binary files /dev/null and b/project/sounds/aiy150000190.ogg differ diff --git a/project/sounds/aiy150000200.ogg b/project/sounds/aiy150000200.ogg new file mode 100644 index 0000000..c6c73df Binary files /dev/null and b/project/sounds/aiy150000200.ogg differ diff --git a/project/sounds/aiy150000210.ogg b/project/sounds/aiy150000210.ogg new file mode 100644 index 0000000..bb1182b Binary files /dev/null and b/project/sounds/aiy150000210.ogg differ diff --git a/project/sounds/aiy150000220.ogg b/project/sounds/aiy150000220.ogg new file mode 100644 index 0000000..3babde5 Binary files /dev/null and b/project/sounds/aiy150000220.ogg differ diff --git a/project/sounds/aiy150000230.ogg b/project/sounds/aiy150000230.ogg new file mode 100644 index 0000000..a51169e Binary files /dev/null and b/project/sounds/aiy150000230.ogg differ diff --git a/project/sounds/aiy150000240.ogg b/project/sounds/aiy150000240.ogg new file mode 100644 index 0000000..6ff7544 Binary files /dev/null and b/project/sounds/aiy150000240.ogg differ diff --git a/project/sounds/aiy150000250.ogg b/project/sounds/aiy150000250.ogg new file mode 100644 index 0000000..1b3acf8 Binary files /dev/null and b/project/sounds/aiy150000250.ogg differ diff --git a/project/sounds/aiy310000310.ogg b/project/sounds/aiy310000310.ogg new file mode 100644 index 0000000..7d1eda9 Binary files /dev/null and b/project/sounds/aiy310000310.ogg differ diff --git a/project/sounds/aiy310000320.ogg b/project/sounds/aiy310000320.ogg new file mode 100644 index 0000000..2793e41 Binary files /dev/null and b/project/sounds/aiy310000320.ogg differ diff --git a/project/sounds/aiy310000330.ogg b/project/sounds/aiy310000330.ogg new file mode 100644 index 0000000..f3806c3 Binary files /dev/null and b/project/sounds/aiy310000330.ogg differ diff --git a/project/sounds/aiy310000340.ogg b/project/sounds/aiy310000340.ogg new file mode 100644 index 0000000..a640644 Binary files /dev/null and b/project/sounds/aiy310000340.ogg differ diff --git a/project/sounds/aiy310000350.ogg b/project/sounds/aiy310000350.ogg new file mode 100644 index 0000000..ea5352e Binary files /dev/null and b/project/sounds/aiy310000350.ogg differ diff --git a/project/sounds/aiy310000360.ogg b/project/sounds/aiy310000360.ogg new file mode 100644 index 0000000..5eefa11 Binary files /dev/null and b/project/sounds/aiy310000360.ogg differ diff --git a/project/sounds/aiy310000370.ogg b/project/sounds/aiy310000370.ogg new file mode 100644 index 0000000..91a7a46 Binary files /dev/null and b/project/sounds/aiy310000370.ogg differ diff --git a/project/sounds/aiy310000380.ogg b/project/sounds/aiy310000380.ogg new file mode 100644 index 0000000..7ba0311 Binary files /dev/null and b/project/sounds/aiy310000380.ogg differ diff --git a/project/sounds/aiy310000390.ogg b/project/sounds/aiy310000390.ogg new file mode 100644 index 0000000..3c877e9 Binary files /dev/null and b/project/sounds/aiy310000390.ogg differ diff --git a/project/sounds/aiy310000400.ogg b/project/sounds/aiy310000400.ogg new file mode 100644 index 0000000..df3e50c Binary files /dev/null and b/project/sounds/aiy310000400.ogg differ diff --git a/project/sounds/aiy310000410.ogg b/project/sounds/aiy310000410.ogg new file mode 100644 index 0000000..69ad557 Binary files /dev/null and b/project/sounds/aiy310000410.ogg differ diff --git a/project/sounds/aiy310000420.ogg b/project/sounds/aiy310000420.ogg new file mode 100644 index 0000000..1a50529 Binary files /dev/null and b/project/sounds/aiy310000420.ogg differ diff --git a/project/sounds/aiy310000430.ogg b/project/sounds/aiy310000430.ogg new file mode 100644 index 0000000..980b7af Binary files /dev/null and b/project/sounds/aiy310000430.ogg differ diff --git a/project/sounds/aiy310000440.ogg b/project/sounds/aiy310000440.ogg new file mode 100644 index 0000000..68e063a Binary files /dev/null and b/project/sounds/aiy310000440.ogg differ diff --git a/project/sounds/aiy310000450.ogg b/project/sounds/aiy310000450.ogg new file mode 100644 index 0000000..991e23c Binary files /dev/null and b/project/sounds/aiy310000450.ogg differ diff --git a/project/sounds/aiy310000460.ogg b/project/sounds/aiy310000460.ogg new file mode 100644 index 0000000..7208098 Binary files /dev/null and b/project/sounds/aiy310000460.ogg differ diff --git a/project/sounds/aiy310000470.ogg b/project/sounds/aiy310000470.ogg new file mode 100644 index 0000000..fe71d8f Binary files /dev/null and b/project/sounds/aiy310000470.ogg differ diff --git a/project/sounds/aiy310000480.ogg b/project/sounds/aiy310000480.ogg new file mode 100644 index 0000000..11bc4fe Binary files /dev/null and b/project/sounds/aiy310000480.ogg differ diff --git a/project/sounds/aiy310000490.ogg b/project/sounds/aiy310000490.ogg new file mode 100644 index 0000000..4a8c1a5 Binary files /dev/null and b/project/sounds/aiy310000490.ogg differ diff --git a/project/sounds/aiy310000510.ogg b/project/sounds/aiy310000510.ogg new file mode 100644 index 0000000..5f98abb Binary files /dev/null and b/project/sounds/aiy310000510.ogg differ diff --git a/project/sounds/aiy310000520.ogg b/project/sounds/aiy310000520.ogg new file mode 100644 index 0000000..5dbe058 Binary files /dev/null and b/project/sounds/aiy310000520.ogg differ diff --git a/project/sounds/aiy310000530.ogg b/project/sounds/aiy310000530.ogg new file mode 100644 index 0000000..317a75e Binary files /dev/null and b/project/sounds/aiy310000530.ogg differ diff --git a/project/sounds/aiy310000540.ogg b/project/sounds/aiy310000540.ogg new file mode 100644 index 0000000..ebdceab Binary files /dev/null and b/project/sounds/aiy310000540.ogg differ diff --git a/project/sounds/aiy310000550.ogg b/project/sounds/aiy310000550.ogg new file mode 100644 index 0000000..735881c Binary files /dev/null and b/project/sounds/aiy310000550.ogg differ diff --git a/project/sounds/aiy310000560.ogg b/project/sounds/aiy310000560.ogg new file mode 100644 index 0000000..a631836 Binary files /dev/null and b/project/sounds/aiy310000560.ogg differ diff --git a/project/sounds/aiy310000570.ogg b/project/sounds/aiy310000570.ogg new file mode 100644 index 0000000..cd365e2 Binary files /dev/null and b/project/sounds/aiy310000570.ogg differ diff --git a/project/sounds/aiy310000580.ogg b/project/sounds/aiy310000580.ogg new file mode 100644 index 0000000..1ff4d98 Binary files /dev/null and b/project/sounds/aiy310000580.ogg differ diff --git a/project/sounds/aiy310000590.ogg b/project/sounds/aiy310000590.ogg new file mode 100644 index 0000000..d6d161a Binary files /dev/null and b/project/sounds/aiy310000590.ogg differ diff --git a/project/sounds/aiy310000600.ogg b/project/sounds/aiy310000600.ogg new file mode 100644 index 0000000..3afd47d Binary files /dev/null and b/project/sounds/aiy310000600.ogg differ diff --git a/project/sounds/aiy310000610.ogg b/project/sounds/aiy310000610.ogg new file mode 100644 index 0000000..fdcb28b Binary files /dev/null and b/project/sounds/aiy310000610.ogg differ diff --git a/project/sounds/aiy310000620.ogg b/project/sounds/aiy310000620.ogg new file mode 100644 index 0000000..b9d5791 Binary files /dev/null and b/project/sounds/aiy310000620.ogg differ diff --git a/project/sounds/aiy310000630.ogg b/project/sounds/aiy310000630.ogg new file mode 100644 index 0000000..b564e34 Binary files /dev/null and b/project/sounds/aiy310000630.ogg differ diff --git a/project/sounds/aiy310000640.ogg b/project/sounds/aiy310000640.ogg new file mode 100644 index 0000000..d976e60 Binary files /dev/null and b/project/sounds/aiy310000640.ogg differ diff --git a/project/sounds/aiy310000650.ogg b/project/sounds/aiy310000650.ogg new file mode 100644 index 0000000..ea7b117 Binary files /dev/null and b/project/sounds/aiy310000650.ogg differ diff --git a/project/sounds/aiy310000660.ogg b/project/sounds/aiy310000660.ogg new file mode 100644 index 0000000..95f02d0 Binary files /dev/null and b/project/sounds/aiy310000660.ogg differ diff --git a/project/sounds/aiy310000670.ogg b/project/sounds/aiy310000670.ogg new file mode 100644 index 0000000..17df42a Binary files /dev/null and b/project/sounds/aiy310000670.ogg differ diff --git a/project/sounds/aiy310000680.ogg b/project/sounds/aiy310000680.ogg new file mode 100644 index 0000000..032a9b8 Binary files /dev/null and b/project/sounds/aiy310000680.ogg differ diff --git a/project/sounds/aiy310000690.ogg b/project/sounds/aiy310000690.ogg new file mode 100644 index 0000000..9d99453 Binary files /dev/null and b/project/sounds/aiy310000690.ogg differ diff --git a/project/sounds/aiy310000700.ogg b/project/sounds/aiy310000700.ogg new file mode 100644 index 0000000..7cefbff Binary files /dev/null and b/project/sounds/aiy310000700.ogg differ diff --git a/project/sounds/aiy310000710.ogg b/project/sounds/aiy310000710.ogg new file mode 100644 index 0000000..dc5eb5a Binary files /dev/null and b/project/sounds/aiy310000710.ogg differ diff --git a/project/sounds/aiy310000720.ogg b/project/sounds/aiy310000720.ogg new file mode 100644 index 0000000..fd37fd3 Binary files /dev/null and b/project/sounds/aiy310000720.ogg differ diff --git a/project/sounds/aiy310000730.ogg b/project/sounds/aiy310000730.ogg new file mode 100644 index 0000000..94a4631 Binary files /dev/null and b/project/sounds/aiy310000730.ogg differ diff --git a/project/sounds/aiy310000740.ogg b/project/sounds/aiy310000740.ogg new file mode 100644 index 0000000..db5f537 Binary files /dev/null and b/project/sounds/aiy310000740.ogg differ diff --git a/project/sounds/aiy310000750.ogg b/project/sounds/aiy310000750.ogg new file mode 100644 index 0000000..90573c8 Binary files /dev/null and b/project/sounds/aiy310000750.ogg differ diff --git a/project/sounds/aiy310000760.ogg b/project/sounds/aiy310000760.ogg new file mode 100644 index 0000000..43f2522 Binary files /dev/null and b/project/sounds/aiy310000760.ogg differ diff --git a/project/sounds/aiy310000770.ogg b/project/sounds/aiy310000770.ogg new file mode 100644 index 0000000..fccf1f1 Binary files /dev/null and b/project/sounds/aiy310000770.ogg differ diff --git a/project/sounds/aiy310000780.ogg b/project/sounds/aiy310000780.ogg new file mode 100644 index 0000000..d1d04ee Binary files /dev/null and b/project/sounds/aiy310000780.ogg differ diff --git a/project/sounds/aiy310000790.ogg b/project/sounds/aiy310000790.ogg new file mode 100644 index 0000000..2cfa70b Binary files /dev/null and b/project/sounds/aiy310000790.ogg differ diff --git a/project/sounds/aiy310000800.ogg b/project/sounds/aiy310000800.ogg new file mode 100644 index 0000000..4400a66 Binary files /dev/null and b/project/sounds/aiy310000800.ogg differ diff --git a/project/sounds/aiy310000810.ogg b/project/sounds/aiy310000810.ogg new file mode 100644 index 0000000..4066404 Binary files /dev/null and b/project/sounds/aiy310000810.ogg differ diff --git a/project/sounds/aiy310000820.ogg b/project/sounds/aiy310000820.ogg new file mode 100644 index 0000000..29c5807 Binary files /dev/null and b/project/sounds/aiy310000820.ogg differ diff --git a/project/sounds/aiy310000830.ogg b/project/sounds/aiy310000830.ogg new file mode 100644 index 0000000..84770ef Binary files /dev/null and b/project/sounds/aiy310000830.ogg differ diff --git a/project/sounds/aiy310000840.ogg b/project/sounds/aiy310000840.ogg new file mode 100644 index 0000000..5b44741 Binary files /dev/null and b/project/sounds/aiy310000840.ogg differ diff --git a/project/sounds/aiy310000850.ogg b/project/sounds/aiy310000850.ogg new file mode 100644 index 0000000..0900773 Binary files /dev/null and b/project/sounds/aiy310000850.ogg differ diff --git a/project/sounds/aiy310000860.ogg b/project/sounds/aiy310000860.ogg new file mode 100644 index 0000000..e31d562 Binary files /dev/null and b/project/sounds/aiy310000860.ogg differ diff --git a/project/sounds/aiy310000870.ogg b/project/sounds/aiy310000870.ogg new file mode 100644 index 0000000..5c9f936 Binary files /dev/null and b/project/sounds/aiy310000870.ogg differ diff --git a/project/sounds/aiy310000880.ogg b/project/sounds/aiy310000880.ogg new file mode 100644 index 0000000..0938bb7 Binary files /dev/null and b/project/sounds/aiy310000880.ogg differ diff --git a/project/sounds/aiy310000890.ogg b/project/sounds/aiy310000890.ogg new file mode 100644 index 0000000..89e43c5 Binary files /dev/null and b/project/sounds/aiy310000890.ogg differ diff --git a/project/sounds/aiy310000900.ogg b/project/sounds/aiy310000900.ogg new file mode 100644 index 0000000..e809e52 Binary files /dev/null and b/project/sounds/aiy310000900.ogg differ diff --git a/project/sounds/aiy310000910.ogg b/project/sounds/aiy310000910.ogg new file mode 100644 index 0000000..ffb6b5b Binary files /dev/null and b/project/sounds/aiy310000910.ogg differ diff --git a/project/sounds/aiy310000920.ogg b/project/sounds/aiy310000920.ogg new file mode 100644 index 0000000..f470e54 Binary files /dev/null and b/project/sounds/aiy310000920.ogg differ diff --git a/project/sounds/aiy310000930.ogg b/project/sounds/aiy310000930.ogg new file mode 100644 index 0000000..494d15f Binary files /dev/null and b/project/sounds/aiy310000930.ogg differ diff --git a/project/sounds/aiy310000940.ogg b/project/sounds/aiy310000940.ogg new file mode 100644 index 0000000..de36a9d Binary files /dev/null and b/project/sounds/aiy310000940.ogg differ diff --git a/project/sounds/aiy310000950.ogg b/project/sounds/aiy310000950.ogg new file mode 100644 index 0000000..9abfea9 Binary files /dev/null and b/project/sounds/aiy310000950.ogg differ diff --git a/project/sounds/aiy310000960.ogg b/project/sounds/aiy310000960.ogg new file mode 100644 index 0000000..394ddcb Binary files /dev/null and b/project/sounds/aiy310000960.ogg differ diff --git a/project/sounds/aiy310000970.ogg b/project/sounds/aiy310000970.ogg new file mode 100644 index 0000000..aefe802 Binary files /dev/null and b/project/sounds/aiy310000970.ogg differ diff --git a/project/sounds/aiy310000980.ogg b/project/sounds/aiy310000980.ogg new file mode 100644 index 0000000..9c7ea85 Binary files /dev/null and b/project/sounds/aiy310000980.ogg differ diff --git a/project/sounds/aiy310000990.ogg b/project/sounds/aiy310000990.ogg new file mode 100644 index 0000000..5808076 Binary files /dev/null and b/project/sounds/aiy310000990.ogg differ diff --git a/project/sounds/aiy310001000.ogg b/project/sounds/aiy310001000.ogg new file mode 100644 index 0000000..2dba8fb Binary files /dev/null and b/project/sounds/aiy310001000.ogg differ diff --git a/project/sounds/aiy310001010.ogg b/project/sounds/aiy310001010.ogg new file mode 100644 index 0000000..a647a12 Binary files /dev/null and b/project/sounds/aiy310001010.ogg differ diff --git a/project/sounds/aiy310001027.ogg b/project/sounds/aiy310001027.ogg new file mode 100644 index 0000000..9d31c17 Binary files /dev/null and b/project/sounds/aiy310001027.ogg differ diff --git a/project/sounds/aiy310001030.ogg b/project/sounds/aiy310001030.ogg new file mode 100644 index 0000000..c0f363e Binary files /dev/null and b/project/sounds/aiy310001030.ogg differ diff --git a/project/sounds/aiy310001040.ogg b/project/sounds/aiy310001040.ogg new file mode 100644 index 0000000..2d36a51 Binary files /dev/null and b/project/sounds/aiy310001040.ogg differ diff --git a/project/sounds/aiy310001050.ogg b/project/sounds/aiy310001050.ogg new file mode 100644 index 0000000..7b3d406 Binary files /dev/null and b/project/sounds/aiy310001050.ogg differ diff --git a/project/sounds/aiy310001060.ogg b/project/sounds/aiy310001060.ogg new file mode 100644 index 0000000..5a7c2c1 Binary files /dev/null and b/project/sounds/aiy310001060.ogg differ diff --git a/project/sounds/aiy310001070.ogg b/project/sounds/aiy310001070.ogg new file mode 100644 index 0000000..4ecc17a Binary files /dev/null and b/project/sounds/aiy310001070.ogg differ diff --git a/project/sounds/aiy310001080.ogg b/project/sounds/aiy310001080.ogg new file mode 100644 index 0000000..d97e943 Binary files /dev/null and b/project/sounds/aiy310001080.ogg differ diff --git a/project/sounds/aiy310001090.ogg b/project/sounds/aiy310001090.ogg new file mode 100644 index 0000000..dc60205 Binary files /dev/null and b/project/sounds/aiy310001090.ogg differ diff --git a/project/sounds/aiy310001100.ogg b/project/sounds/aiy310001100.ogg new file mode 100644 index 0000000..13d7d7d Binary files /dev/null and b/project/sounds/aiy310001100.ogg differ diff --git a/project/sounds/aiy310001110.ogg b/project/sounds/aiy310001110.ogg new file mode 100644 index 0000000..040c120 Binary files /dev/null and b/project/sounds/aiy310001110.ogg differ diff --git a/project/sounds/aiy310001120.ogg b/project/sounds/aiy310001120.ogg new file mode 100644 index 0000000..458e4f7 Binary files /dev/null and b/project/sounds/aiy310001120.ogg differ diff --git a/project/sounds/aiy310001130.ogg b/project/sounds/aiy310001130.ogg new file mode 100644 index 0000000..7daea21 Binary files /dev/null and b/project/sounds/aiy310001130.ogg differ diff --git a/project/sounds/aiy310001140.ogg b/project/sounds/aiy310001140.ogg new file mode 100644 index 0000000..7d54e19 Binary files /dev/null and b/project/sounds/aiy310001140.ogg differ diff --git a/project/sounds/aiy310001150.ogg b/project/sounds/aiy310001150.ogg new file mode 100644 index 0000000..b06bdc9 Binary files /dev/null and b/project/sounds/aiy310001150.ogg differ diff --git a/project/sounds/aiy310001160.ogg b/project/sounds/aiy310001160.ogg new file mode 100644 index 0000000..3ec510b Binary files /dev/null and b/project/sounds/aiy310001160.ogg differ diff --git a/project/sounds/aiy310001170.ogg b/project/sounds/aiy310001170.ogg new file mode 100644 index 0000000..d96b1e2 Binary files /dev/null and b/project/sounds/aiy310001170.ogg differ diff --git a/project/sounds/aiy310001180.ogg b/project/sounds/aiy310001180.ogg new file mode 100644 index 0000000..88cffb2 Binary files /dev/null and b/project/sounds/aiy310001180.ogg differ diff --git a/project/sounds/aiy310001190.ogg b/project/sounds/aiy310001190.ogg new file mode 100644 index 0000000..e35c481 Binary files /dev/null and b/project/sounds/aiy310001190.ogg differ diff --git a/project/sounds/aiy310001200.ogg b/project/sounds/aiy310001200.ogg new file mode 100644 index 0000000..9c30d38 Binary files /dev/null and b/project/sounds/aiy310001200.ogg differ diff --git a/project/sounds/aiy310001210.ogg b/project/sounds/aiy310001210.ogg new file mode 100644 index 0000000..cfe51c7 Binary files /dev/null and b/project/sounds/aiy310001210.ogg differ diff --git a/project/sounds/aiy310001220.ogg b/project/sounds/aiy310001220.ogg new file mode 100644 index 0000000..e7d5e61 Binary files /dev/null and b/project/sounds/aiy310001220.ogg differ diff --git a/project/sounds/aiy310001230.ogg b/project/sounds/aiy310001230.ogg new file mode 100644 index 0000000..4aa7064 Binary files /dev/null and b/project/sounds/aiy310001230.ogg differ diff --git a/project/sounds/aiy310001240.ogg b/project/sounds/aiy310001240.ogg new file mode 100644 index 0000000..9342811 Binary files /dev/null and b/project/sounds/aiy310001240.ogg differ diff --git a/project/sounds/aiy310001250.ogg b/project/sounds/aiy310001250.ogg new file mode 100644 index 0000000..15a6960 Binary files /dev/null and b/project/sounds/aiy310001250.ogg differ diff --git a/project/sounds/aiy310001260.ogg b/project/sounds/aiy310001260.ogg new file mode 100644 index 0000000..dab5516 Binary files /dev/null and b/project/sounds/aiy310001260.ogg differ diff --git a/project/sounds/aiy310001270.ogg b/project/sounds/aiy310001270.ogg new file mode 100644 index 0000000..d531b49 Binary files /dev/null and b/project/sounds/aiy310001270.ogg differ diff --git a/project/sounds/aiy310001280.ogg b/project/sounds/aiy310001280.ogg new file mode 100644 index 0000000..2e749a4 Binary files /dev/null and b/project/sounds/aiy310001280.ogg differ diff --git a/project/sounds/aiy310001290.ogg b/project/sounds/aiy310001290.ogg new file mode 100644 index 0000000..c2e81a6 Binary files /dev/null and b/project/sounds/aiy310001290.ogg differ diff --git a/project/sounds/aiy310001300.ogg b/project/sounds/aiy310001300.ogg new file mode 100644 index 0000000..904940f Binary files /dev/null and b/project/sounds/aiy310001300.ogg differ diff --git a/project/sounds/aiy310001310.ogg b/project/sounds/aiy310001310.ogg new file mode 100644 index 0000000..a7f25b0 Binary files /dev/null and b/project/sounds/aiy310001310.ogg differ diff --git a/project/sounds/aiy310001320.ogg b/project/sounds/aiy310001320.ogg new file mode 100644 index 0000000..1b06256 Binary files /dev/null and b/project/sounds/aiy310001320.ogg differ diff --git a/project/sounds/aiy310001330.ogg b/project/sounds/aiy310001330.ogg new file mode 100644 index 0000000..8525810 Binary files /dev/null and b/project/sounds/aiy310001330.ogg differ diff --git a/project/sounds/aiy310001340.ogg b/project/sounds/aiy310001340.ogg new file mode 100644 index 0000000..44b81fe Binary files /dev/null and b/project/sounds/aiy310001340.ogg differ diff --git a/project/sounds/aiy310001350.ogg b/project/sounds/aiy310001350.ogg new file mode 100644 index 0000000..2291f96 Binary files /dev/null and b/project/sounds/aiy310001350.ogg differ diff --git a/project/sounds/aiy310001360.ogg b/project/sounds/aiy310001360.ogg new file mode 100644 index 0000000..2114e7b Binary files /dev/null and b/project/sounds/aiy310001360.ogg differ diff --git a/project/sounds/aiy310001370.ogg b/project/sounds/aiy310001370.ogg new file mode 100644 index 0000000..d7df9be Binary files /dev/null and b/project/sounds/aiy310001370.ogg differ diff --git a/project/sounds/aiy310001380.ogg b/project/sounds/aiy310001380.ogg new file mode 100644 index 0000000..fac86f0 Binary files /dev/null and b/project/sounds/aiy310001380.ogg differ diff --git a/project/sounds/aiy310001390.ogg b/project/sounds/aiy310001390.ogg new file mode 100644 index 0000000..e543b6f Binary files /dev/null and b/project/sounds/aiy310001390.ogg differ diff --git a/project/sounds/aiy320000010.ogg b/project/sounds/aiy320000010.ogg new file mode 100644 index 0000000..54d6db5 Binary files /dev/null and b/project/sounds/aiy320000010.ogg differ diff --git a/project/sounds/aiy320000020.ogg b/project/sounds/aiy320000020.ogg new file mode 100644 index 0000000..d98d94e Binary files /dev/null and b/project/sounds/aiy320000020.ogg differ diff --git a/project/sounds/aiy320000030.ogg b/project/sounds/aiy320000030.ogg new file mode 100644 index 0000000..574f903 Binary files /dev/null and b/project/sounds/aiy320000030.ogg differ diff --git a/project/sounds/aiy320000040.ogg b/project/sounds/aiy320000040.ogg new file mode 100644 index 0000000..613c27f Binary files /dev/null and b/project/sounds/aiy320000040.ogg differ diff --git a/project/sounds/aiy320000050.ogg b/project/sounds/aiy320000050.ogg new file mode 100644 index 0000000..b35ca98 Binary files /dev/null and b/project/sounds/aiy320000050.ogg differ diff --git a/project/sounds/aiy320000060.ogg b/project/sounds/aiy320000060.ogg new file mode 100644 index 0000000..0365def Binary files /dev/null and b/project/sounds/aiy320000060.ogg differ diff --git a/project/sounds/aiy320000070.ogg b/project/sounds/aiy320000070.ogg new file mode 100644 index 0000000..52e3d11 Binary files /dev/null and b/project/sounds/aiy320000070.ogg differ diff --git a/project/sounds/aiy320000080.ogg b/project/sounds/aiy320000080.ogg new file mode 100644 index 0000000..9a2afef Binary files /dev/null and b/project/sounds/aiy320000080.ogg differ diff --git a/project/sounds/aiy320000090.ogg b/project/sounds/aiy320000090.ogg new file mode 100644 index 0000000..608f2e1 Binary files /dev/null and b/project/sounds/aiy320000090.ogg differ diff --git a/project/sounds/aiy320000100.ogg b/project/sounds/aiy320000100.ogg new file mode 100644 index 0000000..b97a61c Binary files /dev/null and b/project/sounds/aiy320000100.ogg differ diff --git a/project/sounds/aiy320000110.ogg b/project/sounds/aiy320000110.ogg new file mode 100644 index 0000000..f15348f Binary files /dev/null and b/project/sounds/aiy320000110.ogg differ diff --git a/project/sounds/aiy320000120.ogg b/project/sounds/aiy320000120.ogg new file mode 100644 index 0000000..3adda1d Binary files /dev/null and b/project/sounds/aiy320000120.ogg differ diff --git a/project/sounds/aiy320000135.ogg b/project/sounds/aiy320000135.ogg new file mode 100644 index 0000000..79ed386 Binary files /dev/null and b/project/sounds/aiy320000135.ogg differ diff --git a/project/sounds/aiy320000140.ogg b/project/sounds/aiy320000140.ogg new file mode 100644 index 0000000..0b7add2 Binary files /dev/null and b/project/sounds/aiy320000140.ogg differ diff --git a/project/sounds/aiy340000010.ogg b/project/sounds/aiy340000010.ogg new file mode 100644 index 0000000..1687505 Binary files /dev/null and b/project/sounds/aiy340000010.ogg differ diff --git a/project/sounds/aiy340000020.ogg b/project/sounds/aiy340000020.ogg new file mode 100644 index 0000000..f05a1e8 Binary files /dev/null and b/project/sounds/aiy340000020.ogg differ diff --git a/project/sounds/aiy340000030.ogg b/project/sounds/aiy340000030.ogg new file mode 100644 index 0000000..915b664 Binary files /dev/null and b/project/sounds/aiy340000030.ogg differ diff --git a/project/sounds/aiy340000040.ogg b/project/sounds/aiy340000040.ogg new file mode 100644 index 0000000..72259c5 Binary files /dev/null and b/project/sounds/aiy340000040.ogg differ diff --git a/project/sounds/aiy340000050.ogg b/project/sounds/aiy340000050.ogg new file mode 100644 index 0000000..ca136d2 Binary files /dev/null and b/project/sounds/aiy340000050.ogg differ diff --git a/project/sounds/aiy340000060.ogg b/project/sounds/aiy340000060.ogg new file mode 100644 index 0000000..8bcb94b Binary files /dev/null and b/project/sounds/aiy340000060.ogg differ diff --git a/project/sounds/aiy340000070.ogg b/project/sounds/aiy340000070.ogg new file mode 100644 index 0000000..364be3b Binary files /dev/null and b/project/sounds/aiy340000070.ogg differ diff --git a/project/sounds/aiy340000080.ogg b/project/sounds/aiy340000080.ogg new file mode 100644 index 0000000..6e6f1da Binary files /dev/null and b/project/sounds/aiy340000080.ogg differ diff --git a/project/sounds/aiy340000090.ogg b/project/sounds/aiy340000090.ogg new file mode 100644 index 0000000..1da2a78 Binary files /dev/null and b/project/sounds/aiy340000090.ogg differ diff --git a/project/sounds/aiy340000100.ogg b/project/sounds/aiy340000100.ogg new file mode 100644 index 0000000..718db86 Binary files /dev/null and b/project/sounds/aiy340000100.ogg differ diff --git a/project/sounds/aiy340000110.ogg b/project/sounds/aiy340000110.ogg new file mode 100644 index 0000000..46d5be6 Binary files /dev/null and b/project/sounds/aiy340000110.ogg differ diff --git a/project/sounds/aiy340000120.ogg b/project/sounds/aiy340000120.ogg new file mode 100644 index 0000000..f1003c3 Binary files /dev/null and b/project/sounds/aiy340000120.ogg differ diff --git a/project/sounds/aiy340000140.ogg b/project/sounds/aiy340000140.ogg new file mode 100644 index 0000000..7a475e9 Binary files /dev/null and b/project/sounds/aiy340000140.ogg differ diff --git a/project/sounds/aiy340000150.ogg b/project/sounds/aiy340000150.ogg new file mode 100644 index 0000000..01b5107 Binary files /dev/null and b/project/sounds/aiy340000150.ogg differ diff --git a/project/sounds/aiy340000160.ogg b/project/sounds/aiy340000160.ogg new file mode 100644 index 0000000..710abca Binary files /dev/null and b/project/sounds/aiy340000160.ogg differ diff --git a/project/sounds/aiy340000170.ogg b/project/sounds/aiy340000170.ogg new file mode 100644 index 0000000..7fc073b Binary files /dev/null and b/project/sounds/aiy340000170.ogg differ diff --git a/project/sounds/aiy340000180.ogg b/project/sounds/aiy340000180.ogg new file mode 100644 index 0000000..575d8b4 Binary files /dev/null and b/project/sounds/aiy340000180.ogg differ diff --git a/project/sounds/aiy340000190.ogg b/project/sounds/aiy340000190.ogg new file mode 100644 index 0000000..155b411 Binary files /dev/null and b/project/sounds/aiy340000190.ogg differ diff --git a/project/sounds/aiy340000200.ogg b/project/sounds/aiy340000200.ogg new file mode 100644 index 0000000..bf6dc4a Binary files /dev/null and b/project/sounds/aiy340000200.ogg differ diff --git a/project/sounds/aiy340000210.ogg b/project/sounds/aiy340000210.ogg new file mode 100644 index 0000000..3b4e1b1 Binary files /dev/null and b/project/sounds/aiy340000210.ogg differ diff --git a/project/sounds/aiy340000220.ogg b/project/sounds/aiy340000220.ogg new file mode 100644 index 0000000..1b46e59 Binary files /dev/null and b/project/sounds/aiy340000220.ogg differ diff --git a/project/sounds/aiy340000230.ogg b/project/sounds/aiy340000230.ogg new file mode 100644 index 0000000..a2462c7 Binary files /dev/null and b/project/sounds/aiy340000230.ogg differ diff --git a/project/sounds/aiy340000240.ogg b/project/sounds/aiy340000240.ogg new file mode 100644 index 0000000..91690e5 Binary files /dev/null and b/project/sounds/aiy340000240.ogg differ diff --git a/project/sounds/aiy340000250.ogg b/project/sounds/aiy340000250.ogg new file mode 100644 index 0000000..321f997 Binary files /dev/null and b/project/sounds/aiy340000250.ogg differ diff --git a/project/sounds/aiy340000260.ogg b/project/sounds/aiy340000260.ogg new file mode 100644 index 0000000..137c284 Binary files /dev/null and b/project/sounds/aiy340000260.ogg differ diff --git a/project/sounds/aiy340000270.ogg b/project/sounds/aiy340000270.ogg new file mode 100644 index 0000000..b94bbb4 Binary files /dev/null and b/project/sounds/aiy340000270.ogg differ diff --git a/project/sounds/aiy340000280.ogg b/project/sounds/aiy340000280.ogg new file mode 100644 index 0000000..e685598 Binary files /dev/null and b/project/sounds/aiy340000280.ogg differ diff --git a/project/sounds/aiy340000290.ogg b/project/sounds/aiy340000290.ogg new file mode 100644 index 0000000..6965511 Binary files /dev/null and b/project/sounds/aiy340000290.ogg differ diff --git a/project/sounds/aiy340000300.ogg b/project/sounds/aiy340000300.ogg new file mode 100644 index 0000000..f0c9ccd Binary files /dev/null and b/project/sounds/aiy340000300.ogg differ diff --git a/project/sounds/aiy340000310.ogg b/project/sounds/aiy340000310.ogg new file mode 100644 index 0000000..886e7ba Binary files /dev/null and b/project/sounds/aiy340000310.ogg differ diff --git a/project/sounds/aiy340000320.ogg b/project/sounds/aiy340000320.ogg new file mode 100644 index 0000000..c7b1ab1 Binary files /dev/null and b/project/sounds/aiy340000320.ogg differ diff --git a/project/sounds/aiy340000330.ogg b/project/sounds/aiy340000330.ogg new file mode 100644 index 0000000..b07b430 Binary files /dev/null and b/project/sounds/aiy340000330.ogg differ diff --git a/project/sounds/aiy340000340.ogg b/project/sounds/aiy340000340.ogg new file mode 100644 index 0000000..07fab33 Binary files /dev/null and b/project/sounds/aiy340000340.ogg differ diff --git a/project/sounds/aiy340000350.ogg b/project/sounds/aiy340000350.ogg new file mode 100644 index 0000000..4fff4de Binary files /dev/null and b/project/sounds/aiy340000350.ogg differ diff --git a/project/sounds/aiy340000360.ogg b/project/sounds/aiy340000360.ogg new file mode 100644 index 0000000..1d9fa8f Binary files /dev/null and b/project/sounds/aiy340000360.ogg differ diff --git a/project/sounds/aiy340000370.ogg b/project/sounds/aiy340000370.ogg new file mode 100644 index 0000000..a0e6e1e Binary files /dev/null and b/project/sounds/aiy340000370.ogg differ diff --git a/project/sounds/aiy340000380.ogg b/project/sounds/aiy340000380.ogg new file mode 100644 index 0000000..0f4b917 Binary files /dev/null and b/project/sounds/aiy340000380.ogg differ diff --git a/project/sounds/aiy340000390.ogg b/project/sounds/aiy340000390.ogg new file mode 100644 index 0000000..021d193 Binary files /dev/null and b/project/sounds/aiy340000390.ogg differ diff --git a/project/sounds/aiy340000400.ogg b/project/sounds/aiy340000400.ogg new file mode 100644 index 0000000..3f217a7 Binary files /dev/null and b/project/sounds/aiy340000400.ogg differ diff --git a/project/sounds/aiy340000410.ogg b/project/sounds/aiy340000410.ogg new file mode 100644 index 0000000..95f46c9 Binary files /dev/null and b/project/sounds/aiy340000410.ogg differ diff --git a/project/sounds/aiy340000420.ogg b/project/sounds/aiy340000420.ogg new file mode 100644 index 0000000..7ed6067 Binary files /dev/null and b/project/sounds/aiy340000420.ogg differ diff --git a/project/sounds/aiy340000430.ogg b/project/sounds/aiy340000430.ogg new file mode 100644 index 0000000..cfc1202 Binary files /dev/null and b/project/sounds/aiy340000430.ogg differ diff --git a/project/sounds/aiy350000240.ogg b/project/sounds/aiy350000240.ogg new file mode 100644 index 0000000..e549bdd Binary files /dev/null and b/project/sounds/aiy350000240.ogg differ diff --git a/project/sounds/aiy350000250.ogg b/project/sounds/aiy350000250.ogg new file mode 100644 index 0000000..3994c71 Binary files /dev/null and b/project/sounds/aiy350000250.ogg differ diff --git a/project/sounds/aiy350000260.ogg b/project/sounds/aiy350000260.ogg new file mode 100644 index 0000000..f8e3492 Binary files /dev/null and b/project/sounds/aiy350000260.ogg differ diff --git a/project/sounds/aiy430000010.ogg b/project/sounds/aiy430000010.ogg new file mode 100644 index 0000000..356ddcd Binary files /dev/null and b/project/sounds/aiy430000010.ogg differ diff --git a/project/sounds/aiy430000020.ogg b/project/sounds/aiy430000020.ogg new file mode 100644 index 0000000..9efe052 Binary files /dev/null and b/project/sounds/aiy430000020.ogg differ diff --git a/project/sounds/aiy430000030.ogg b/project/sounds/aiy430000030.ogg new file mode 100644 index 0000000..c67ff9b Binary files /dev/null and b/project/sounds/aiy430000030.ogg differ diff --git a/project/sounds/aiy430000040.ogg b/project/sounds/aiy430000040.ogg new file mode 100644 index 0000000..b05463e Binary files /dev/null and b/project/sounds/aiy430000040.ogg differ diff --git a/project/sounds/aiy430000050.ogg b/project/sounds/aiy430000050.ogg new file mode 100644 index 0000000..5374b90 Binary files /dev/null and b/project/sounds/aiy430000050.ogg differ diff --git a/project/sounds/aiy430000060.ogg b/project/sounds/aiy430000060.ogg new file mode 100644 index 0000000..6b44c40 Binary files /dev/null and b/project/sounds/aiy430000060.ogg differ diff --git a/project/sounds/aiy430000070.ogg b/project/sounds/aiy430000070.ogg new file mode 100644 index 0000000..68fbcc8 Binary files /dev/null and b/project/sounds/aiy430000070.ogg differ diff --git a/project/sounds/aiy430000080.ogg b/project/sounds/aiy430000080.ogg new file mode 100644 index 0000000..f3ab8e1 Binary files /dev/null and b/project/sounds/aiy430000080.ogg differ diff --git a/project/sounds/aiy430000090.ogg b/project/sounds/aiy430000090.ogg new file mode 100644 index 0000000..a0487d9 Binary files /dev/null and b/project/sounds/aiy430000090.ogg differ diff --git a/project/sounds/aiy430000100.ogg b/project/sounds/aiy430000100.ogg new file mode 100644 index 0000000..3b111ed Binary files /dev/null and b/project/sounds/aiy430000100.ogg differ diff --git a/project/sounds/aiy430000110.ogg b/project/sounds/aiy430000110.ogg new file mode 100644 index 0000000..472e8ea Binary files /dev/null and b/project/sounds/aiy430000110.ogg differ diff --git a/project/sounds/aiy430000120.ogg b/project/sounds/aiy430000120.ogg new file mode 100644 index 0000000..16e11b0 Binary files /dev/null and b/project/sounds/aiy430000120.ogg differ diff --git a/project/sounds/aiy430000130.ogg b/project/sounds/aiy430000130.ogg new file mode 100644 index 0000000..87aaa6e Binary files /dev/null and b/project/sounds/aiy430000130.ogg differ diff --git a/project/sounds/aiy430000140.ogg b/project/sounds/aiy430000140.ogg new file mode 100644 index 0000000..460a7de Binary files /dev/null and b/project/sounds/aiy430000140.ogg differ diff --git a/project/sounds/aiy430000150.ogg b/project/sounds/aiy430000150.ogg new file mode 100644 index 0000000..a33a5bd Binary files /dev/null and b/project/sounds/aiy430000150.ogg differ diff --git a/project/sounds/aiy430000160.ogg b/project/sounds/aiy430000160.ogg new file mode 100644 index 0000000..24971e2 Binary files /dev/null and b/project/sounds/aiy430000160.ogg differ diff --git a/project/sounds/aiy430000170.ogg b/project/sounds/aiy430000170.ogg new file mode 100644 index 0000000..a76c57b Binary files /dev/null and b/project/sounds/aiy430000170.ogg differ diff --git a/project/sounds/aiy430000180.ogg b/project/sounds/aiy430000180.ogg new file mode 100644 index 0000000..aaf40ca Binary files /dev/null and b/project/sounds/aiy430000180.ogg differ diff --git a/project/sounds/aiy430000190.ogg b/project/sounds/aiy430000190.ogg new file mode 100644 index 0000000..81ef542 Binary files /dev/null and b/project/sounds/aiy430000190.ogg differ diff --git a/project/sounds/aiy430000200.ogg b/project/sounds/aiy430000200.ogg new file mode 100644 index 0000000..57f8c8d Binary files /dev/null and b/project/sounds/aiy430000200.ogg differ diff --git a/project/sounds/aiy430000210.ogg b/project/sounds/aiy430000210.ogg new file mode 100644 index 0000000..6a02c00 Binary files /dev/null and b/project/sounds/aiy430000210.ogg differ diff --git a/project/sounds/aiy430000220.ogg b/project/sounds/aiy430000220.ogg new file mode 100644 index 0000000..cc0e4be Binary files /dev/null and b/project/sounds/aiy430000220.ogg differ diff --git a/project/sounds/aiy430000230.ogg b/project/sounds/aiy430000230.ogg new file mode 100644 index 0000000..a8ef1f3 Binary files /dev/null and b/project/sounds/aiy430000230.ogg differ diff --git a/project/sounds/aiy430000240.ogg b/project/sounds/aiy430000240.ogg new file mode 100644 index 0000000..6236846 Binary files /dev/null and b/project/sounds/aiy430000240.ogg differ diff --git a/project/sounds/aiy430000250.ogg b/project/sounds/aiy430000250.ogg new file mode 100644 index 0000000..806ecfb Binary files /dev/null and b/project/sounds/aiy430000250.ogg differ diff --git a/project/sounds/aiy430000260.ogg b/project/sounds/aiy430000260.ogg new file mode 100644 index 0000000..8872913 Binary files /dev/null and b/project/sounds/aiy430000260.ogg differ diff --git a/project/sounds/aiy430000270.ogg b/project/sounds/aiy430000270.ogg new file mode 100644 index 0000000..2d61e3e Binary files /dev/null and b/project/sounds/aiy430000270.ogg differ diff --git a/project/sounds/aiy430000280.ogg b/project/sounds/aiy430000280.ogg new file mode 100644 index 0000000..142bcbe Binary files /dev/null and b/project/sounds/aiy430000280.ogg differ diff --git a/project/sounds/aiy430000290.ogg b/project/sounds/aiy430000290.ogg new file mode 100644 index 0000000..808500c Binary files /dev/null and b/project/sounds/aiy430000290.ogg differ diff --git a/project/sounds/aiy440000010.ogg b/project/sounds/aiy440000010.ogg new file mode 100644 index 0000000..a8dad86 Binary files /dev/null and b/project/sounds/aiy440000010.ogg differ diff --git a/project/sounds/aiy440000020.ogg b/project/sounds/aiy440000020.ogg new file mode 100644 index 0000000..c9a14fd Binary files /dev/null and b/project/sounds/aiy440000020.ogg differ diff --git a/project/sounds/aiy440000030.ogg b/project/sounds/aiy440000030.ogg new file mode 100644 index 0000000..fe311cc Binary files /dev/null and b/project/sounds/aiy440000030.ogg differ diff --git a/project/sounds/aiy440000040.ogg b/project/sounds/aiy440000040.ogg new file mode 100644 index 0000000..2b98283 Binary files /dev/null and b/project/sounds/aiy440000040.ogg differ diff --git a/project/sounds/aiy440000050.ogg b/project/sounds/aiy440000050.ogg new file mode 100644 index 0000000..65e8f38 Binary files /dev/null and b/project/sounds/aiy440000050.ogg differ diff --git a/project/sounds/aiy440000060.ogg b/project/sounds/aiy440000060.ogg new file mode 100644 index 0000000..7911ca1 Binary files /dev/null and b/project/sounds/aiy440000060.ogg differ diff --git a/project/sounds/aiy440000070.ogg b/project/sounds/aiy440000070.ogg new file mode 100644 index 0000000..79ceecd Binary files /dev/null and b/project/sounds/aiy440000070.ogg differ diff --git a/project/sounds/aiy440000080.ogg b/project/sounds/aiy440000080.ogg new file mode 100644 index 0000000..d165741 Binary files /dev/null and b/project/sounds/aiy440000080.ogg differ diff --git a/project/sounds/aiy440000090.ogg b/project/sounds/aiy440000090.ogg new file mode 100644 index 0000000..816a91f Binary files /dev/null and b/project/sounds/aiy440000090.ogg differ diff --git a/project/sounds/aiy440000100.ogg b/project/sounds/aiy440000100.ogg new file mode 100644 index 0000000..e0cbe17 Binary files /dev/null and b/project/sounds/aiy440000100.ogg differ diff --git a/project/sounds/aiy440000110.ogg b/project/sounds/aiy440000110.ogg new file mode 100644 index 0000000..475cf95 Binary files /dev/null and b/project/sounds/aiy440000110.ogg differ diff --git a/project/sounds/aiy440000120.ogg b/project/sounds/aiy440000120.ogg new file mode 100644 index 0000000..ebdc162 Binary files /dev/null and b/project/sounds/aiy440000120.ogg differ diff --git a/project/sounds/aiy510000010.ogg b/project/sounds/aiy510000010.ogg new file mode 100644 index 0000000..5ab3fc0 Binary files /dev/null and b/project/sounds/aiy510000010.ogg differ diff --git a/project/sounds/aiy510000020.ogg b/project/sounds/aiy510000020.ogg new file mode 100644 index 0000000..57f77d7 Binary files /dev/null and b/project/sounds/aiy510000020.ogg differ diff --git a/project/sounds/aiy720000010.ogg b/project/sounds/aiy720000010.ogg new file mode 100644 index 0000000..5ae9b67 Binary files /dev/null and b/project/sounds/aiy720000010.ogg differ diff --git a/project/sounds/aiy730000010.ogg b/project/sounds/aiy730000010.ogg new file mode 100644 index 0000000..ab0d410 Binary files /dev/null and b/project/sounds/aiy730000010.ogg differ diff --git a/project/sounds/aiy740000010.ogg b/project/sounds/aiy740000010.ogg new file mode 100644 index 0000000..b5b010f Binary files /dev/null and b/project/sounds/aiy740000010.ogg differ diff --git a/project/sounds/aiy750000010.ogg b/project/sounds/aiy750000010.ogg new file mode 100644 index 0000000..0b8ceb4 Binary files /dev/null and b/project/sounds/aiy750000010.ogg differ diff --git a/project/sounds/aiy750000020.ogg b/project/sounds/aiy750000020.ogg new file mode 100644 index 0000000..f260c12 Binary files /dev/null and b/project/sounds/aiy750000020.ogg differ diff --git a/project/sounds/aiy750000030.ogg b/project/sounds/aiy750000030.ogg new file mode 100644 index 0000000..93faa55 Binary files /dev/null and b/project/sounds/aiy750000030.ogg differ diff --git a/project/sounds/aiy750000040.ogg b/project/sounds/aiy750000040.ogg new file mode 100644 index 0000000..7592d4b Binary files /dev/null and b/project/sounds/aiy750000040.ogg differ diff --git a/project/sounds/aiy750000050.ogg b/project/sounds/aiy750000050.ogg new file mode 100644 index 0000000..bf95779 Binary files /dev/null and b/project/sounds/aiy750000050.ogg differ diff --git a/project/sounds/aiy750000060.ogg b/project/sounds/aiy750000060.ogg new file mode 100644 index 0000000..b0f81b8 Binary files /dev/null and b/project/sounds/aiy750000060.ogg differ diff --git a/project/sounds/aiy750000070.ogg b/project/sounds/aiy750000070.ogg new file mode 100644 index 0000000..d2edb4d Binary files /dev/null and b/project/sounds/aiy750000070.ogg differ diff --git a/project/sounds/aiy750000080.ogg b/project/sounds/aiy750000080.ogg new file mode 100644 index 0000000..a0ffff8 Binary files /dev/null and b/project/sounds/aiy750000080.ogg differ diff --git a/project/sounds/aiy750000090.ogg b/project/sounds/aiy750000090.ogg new file mode 100644 index 0000000..aefcdb3 Binary files /dev/null and b/project/sounds/aiy750000090.ogg differ diff --git a/project/sounds/aiy750000100.ogg b/project/sounds/aiy750000100.ogg new file mode 100644 index 0000000..4057d0c Binary files /dev/null and b/project/sounds/aiy750000100.ogg differ diff --git a/project/sounds/aiy750000110.ogg b/project/sounds/aiy750000110.ogg new file mode 100644 index 0000000..e76d3be Binary files /dev/null and b/project/sounds/aiy750000110.ogg differ diff --git a/project/sounds/aiy750000120.ogg b/project/sounds/aiy750000120.ogg new file mode 100644 index 0000000..41d7788 Binary files /dev/null and b/project/sounds/aiy750000120.ogg differ diff --git a/project/sounds/aiy750000130.ogg b/project/sounds/aiy750000130.ogg new file mode 100644 index 0000000..161f900 Binary files /dev/null and b/project/sounds/aiy750000130.ogg differ diff --git a/project/sounds/aiy750000140.ogg b/project/sounds/aiy750000140.ogg new file mode 100644 index 0000000..fda459c Binary files /dev/null and b/project/sounds/aiy750000140.ogg differ diff --git a/project/sounds/aiy750000150.ogg b/project/sounds/aiy750000150.ogg new file mode 100644 index 0000000..8422fce Binary files /dev/null and b/project/sounds/aiy750000150.ogg differ diff --git a/project/sounds/aiy750000160.ogg b/project/sounds/aiy750000160.ogg new file mode 100644 index 0000000..62f8163 Binary files /dev/null and b/project/sounds/aiy750000160.ogg differ diff --git a/project/sounds/aiy750000170.ogg b/project/sounds/aiy750000170.ogg new file mode 100644 index 0000000..b9fe06e Binary files /dev/null and b/project/sounds/aiy750000170.ogg differ diff --git a/project/sounds/aiy750000180.ogg b/project/sounds/aiy750000180.ogg new file mode 100644 index 0000000..b7fb85f Binary files /dev/null and b/project/sounds/aiy750000180.ogg differ diff --git a/project/sounds/aiy750000190.ogg b/project/sounds/aiy750000190.ogg new file mode 100644 index 0000000..1d7b4a8 Binary files /dev/null and b/project/sounds/aiy750000190.ogg differ diff --git a/project/sounds/aiy750000200.ogg b/project/sounds/aiy750000200.ogg new file mode 100644 index 0000000..68d41da Binary files /dev/null and b/project/sounds/aiy750000200.ogg differ diff --git a/project/sounds/aiy750000210.ogg b/project/sounds/aiy750000210.ogg new file mode 100644 index 0000000..faf634b Binary files /dev/null and b/project/sounds/aiy750000210.ogg differ diff --git a/project/sounds/aiy750000220.ogg b/project/sounds/aiy750000220.ogg new file mode 100644 index 0000000..1b931cf Binary files /dev/null and b/project/sounds/aiy750000220.ogg differ diff --git a/project/sounds/aiy750000230.ogg b/project/sounds/aiy750000230.ogg new file mode 100644 index 0000000..3c31602 Binary files /dev/null and b/project/sounds/aiy750000230.ogg differ diff --git a/project/sounds/aiy750000240.ogg b/project/sounds/aiy750000240.ogg new file mode 100644 index 0000000..ad8501c Binary files /dev/null and b/project/sounds/aiy750000240.ogg differ diff --git a/project/sounds/aiy750000250.ogg b/project/sounds/aiy750000250.ogg new file mode 100644 index 0000000..3ebaffe Binary files /dev/null and b/project/sounds/aiy750000250.ogg differ diff --git a/project/sounds/aiy750000260.ogg b/project/sounds/aiy750000260.ogg new file mode 100644 index 0000000..c45ca4d Binary files /dev/null and b/project/sounds/aiy750000260.ogg differ diff --git a/project/sounds/aiy750000270.ogg b/project/sounds/aiy750000270.ogg new file mode 100644 index 0000000..ad0c25d Binary files /dev/null and b/project/sounds/aiy750000270.ogg differ diff --git a/project/sounds/aiy750000280.ogg b/project/sounds/aiy750000280.ogg new file mode 100644 index 0000000..2b1a3bc Binary files /dev/null and b/project/sounds/aiy750000280.ogg differ diff --git a/project/sounds/aiy750000290.ogg b/project/sounds/aiy750000290.ogg new file mode 100644 index 0000000..11d69ae Binary files /dev/null and b/project/sounds/aiy750000290.ogg differ diff --git a/project/sounds/aiy750000300.ogg b/project/sounds/aiy750000300.ogg new file mode 100644 index 0000000..145e3b3 Binary files /dev/null and b/project/sounds/aiy750000300.ogg differ diff --git a/project/sounds/aiy750000310.ogg b/project/sounds/aiy750000310.ogg new file mode 100644 index 0000000..aac984e Binary files /dev/null and b/project/sounds/aiy750000310.ogg differ diff --git a/project/sounds/aiy750000320.ogg b/project/sounds/aiy750000320.ogg new file mode 100644 index 0000000..175ab60 Binary files /dev/null and b/project/sounds/aiy750000320.ogg differ diff --git a/project/sounds/aiy750000330.ogg b/project/sounds/aiy750000330.ogg new file mode 100644 index 0000000..dd13862 Binary files /dev/null and b/project/sounds/aiy750000330.ogg differ diff --git a/project/sounds/aiy750000340.ogg b/project/sounds/aiy750000340.ogg new file mode 100644 index 0000000..46c6c87 Binary files /dev/null and b/project/sounds/aiy750000340.ogg differ diff --git a/project/sounds/aiy800000010.ogg b/project/sounds/aiy800000010.ogg new file mode 100644 index 0000000..f7c1058 Binary files /dev/null and b/project/sounds/aiy800000010.ogg differ diff --git a/project/sounds/aiy800000020.ogg b/project/sounds/aiy800000020.ogg new file mode 100644 index 0000000..e5233c7 Binary files /dev/null and b/project/sounds/aiy800000020.ogg differ diff --git a/project/sounds/aiy800000030.ogg b/project/sounds/aiy800000030.ogg new file mode 100644 index 0000000..4b9d26c Binary files /dev/null and b/project/sounds/aiy800000030.ogg differ diff --git a/project/sounds/aiy800000040.ogg b/project/sounds/aiy800000040.ogg new file mode 100644 index 0000000..64cca36 Binary files /dev/null and b/project/sounds/aiy800000040.ogg differ diff --git a/project/sounds/aiy800000050.ogg b/project/sounds/aiy800000050.ogg new file mode 100644 index 0000000..20c4b22 Binary files /dev/null and b/project/sounds/aiy800000050.ogg differ diff --git a/project/sounds/aiy800000060.ogg b/project/sounds/aiy800000060.ogg new file mode 100644 index 0000000..baf6f0a Binary files /dev/null and b/project/sounds/aiy800000060.ogg differ diff --git a/project/sounds/aiy800000070.ogg b/project/sounds/aiy800000070.ogg new file mode 100644 index 0000000..09b6793 Binary files /dev/null and b/project/sounds/aiy800000070.ogg differ diff --git a/project/sounds/aiy800000080.ogg b/project/sounds/aiy800000080.ogg new file mode 100644 index 0000000..42f1925 Binary files /dev/null and b/project/sounds/aiy800000080.ogg differ diff --git a/project/sounds/aiy800000090.ogg b/project/sounds/aiy800000090.ogg new file mode 100644 index 0000000..0d1df0d Binary files /dev/null and b/project/sounds/aiy800000090.ogg differ diff --git a/project/sounds/aiy800000100.ogg b/project/sounds/aiy800000100.ogg new file mode 100644 index 0000000..6f1ecbc Binary files /dev/null and b/project/sounds/aiy800000100.ogg differ diff --git a/project/sounds/aiy810000010.ogg b/project/sounds/aiy810000010.ogg new file mode 100644 index 0000000..141c976 Binary files /dev/null and b/project/sounds/aiy810000010.ogg differ diff --git a/project/sounds/aiy810000020.ogg b/project/sounds/aiy810000020.ogg new file mode 100644 index 0000000..f755114 Binary files /dev/null and b/project/sounds/aiy810000020.ogg differ diff --git a/project/sounds/aiy810000030.ogg b/project/sounds/aiy810000030.ogg new file mode 100644 index 0000000..ece7da3 Binary files /dev/null and b/project/sounds/aiy810000030.ogg differ diff --git a/project/sounds/aiy810000040.ogg b/project/sounds/aiy810000040.ogg new file mode 100644 index 0000000..d600ea7 Binary files /dev/null and b/project/sounds/aiy810000040.ogg differ diff --git a/project/sounds/aiy810000050.ogg b/project/sounds/aiy810000050.ogg new file mode 100644 index 0000000..b3975f8 Binary files /dev/null and b/project/sounds/aiy810000050.ogg differ diff --git a/project/sounds/aiy810000060.ogg b/project/sounds/aiy810000060.ogg new file mode 100644 index 0000000..f6cf315 Binary files /dev/null and b/project/sounds/aiy810000060.ogg differ diff --git a/project/sounds/aiy810000070.ogg b/project/sounds/aiy810000070.ogg new file mode 100644 index 0000000..0944056 Binary files /dev/null and b/project/sounds/aiy810000070.ogg differ diff --git a/project/sounds/aiy860000010.ogg b/project/sounds/aiy860000010.ogg new file mode 100644 index 0000000..d6ffe53 Binary files /dev/null and b/project/sounds/aiy860000010.ogg differ diff --git a/project/sounds/aiy860000020.ogg b/project/sounds/aiy860000020.ogg new file mode 100644 index 0000000..8157a6f Binary files /dev/null and b/project/sounds/aiy860000020.ogg differ diff --git a/project/sounds/aiy860000030.ogg b/project/sounds/aiy860000030.ogg new file mode 100644 index 0000000..f428615 Binary files /dev/null and b/project/sounds/aiy860000030.ogg differ diff --git a/project/sounds/aiy860000040.ogg b/project/sounds/aiy860000040.ogg new file mode 100644 index 0000000..cd1a1eb Binary files /dev/null and b/project/sounds/aiy860000040.ogg differ diff --git a/project/sounds/aiy860000050.ogg b/project/sounds/aiy860000050.ogg new file mode 100644 index 0000000..e0cf702 Binary files /dev/null and b/project/sounds/aiy860000050.ogg differ diff --git a/project/sounds/aiy860000060.ogg b/project/sounds/aiy860000060.ogg new file mode 100644 index 0000000..c540697 Binary files /dev/null and b/project/sounds/aiy860000060.ogg differ diff --git a/styles.css b/styles.css index e300825..139471b 100644 --- a/styles.css +++ b/styles.css @@ -583,3 +583,36 @@ p#name { transition: transform 1.5s ease-out; -webkit-transition: transform 1.5s ease-out; } +/* ====== 新增加载界面样式 ====== */ +@media screen and (max-width: 600px) { + .loading-slide { + width: 100% + } +} +#startTopGallery { + position: absolute; + width: 85%; + height: 85%; + top: 10%; + left:7.5%; + perspective: 1000px; +} + +.loading-slide { + position: absolute; + width: 100%; + height: 100%; + background-size: cover; + background-position: center; + opacity: 0; + object-fit: contain; + transform: translateX(100%) rotateY(30deg); + transition: all 1s cubic-bezier(0.4, 0, 0.2, 1); + border-radius: 10px; + box-shadow: 0 8px 20px rgba(0,0,0,0.4); +} + +.loading-slide.active { + opacity: 1; + transform: translateX(0) rotateY(0); +}