From 84f44ae08a58b3053123c01f221f6523f595e8e4 Mon Sep 17 00:00:00 2001 From: oc Date: Wed, 27 Dec 2017 13:55:28 +0800 Subject: [PATCH 01/25] Update Map Generator --- docs/event.md | 4 ++-- libs/enemys.js | 2 +- 常用工具/便捷PS工具.exe | Bin 18432 -> 18432 bytes 常用工具/地图生成器.exe | Bin 17920 -> 20480 bytes 4 files changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/event.md b/docs/event.md index 3fa2df43..f9cab896 100644 --- a/docs/event.md +++ b/docs/event.md @@ -4,7 +4,7 @@ ## 事件的机制 -本塔所有的事件都是依靠触发`trigger`完成的。例如,勇士碰到一个门可以触发一个事件`openDoor`,勇士碰到怪物可以触发一个事件`battle`,勇士碰到一个(上面定义的)楼层传送点可以触发一个事件`changeFloor`,勇士穿过路障可以触发一个事件`passNet`,包括勇士到达一个指定的`checkBlock`也可以触发一个检查领域、夹击的事件。上面说的这些事件都是系统本身自带的,即类似于RMXP中的公共事件。 +本塔所有的事件都是依靠触发`trigger`完成的。例如,勇士碰到一个门可以触发一个事件`openDoor`,勇士碰到怪物可以触发一个事件`battle`,勇士碰到一个(上面定义的)楼层传送点可以触发一个事件`changeFloor`,勇士穿过路障可以触发一个事件`passNet`,等等。上面说的这些事件都是系统本身自带的,即类似于RMXP中的公共事件。 上述这些默认的事件已经存在处理机制,不需要我们操心。我们真正所需要关心的,其实只是一个自定义的事件。 @@ -829,7 +829,7 @@ core.insertAction(list) //往当前事件列表中插入一系列事件。使用 请注意,快捷商店默认是不可被使用的。直到至少调用一次自定义事件中的 `{"type": "openShop"}` 打开商店后,才能真正在快捷栏中被使用。 -``` java +``` js "1,0": [ // 金币商店 // 打开商店前,你也可以添加自己的剧情 // 例如,通过if来事件来判断是不是第一次访问商店,是的则显示一段文字(类似宿命的华音那样) diff --git a/libs/enemys.js b/libs/enemys.js index a5e8b71f..3b28b06e 100644 --- a/libs/enemys.js +++ b/libs/enemys.js @@ -76,7 +76,7 @@ enemys.prototype.getEnemys = function (enemyId) { } enemys.prototype.hasSpecial = function (special, test) { - return special!=0 && (special%100 == test || this.hasSpecial(parseInt(special/100), test)); + return (special instanceof Array)?special.indexOf(test)>=0:(special!=0&&(special%100==test||this.hasSpecial(parseInt(special/100), test))); } enemys.prototype.getSpecialText = function (enemyId) { diff --git a/常用工具/便捷PS工具.exe b/常用工具/便捷PS工具.exe index 7ec2fc9842888654c5a12dc54dfcb0a3bf320087..c27e7010697dfd6e7338f859751e43de674b6a2e 100644 GIT binary patch delta 4477 zcmaJ_TWlQF89px(trOc#2*lnbZh%}&jERE{DM?f3Qrb*1 z>w?hQo){t;$uBWeXe&?!$^(@2qGHj)18Su<>h-}7p%OTu(Kdz1Y)Ls59!C8;Ph(m#<#fPHIVh7UbYYlC93Ml9M5G!C^ow*gB#IgCMBO?TSh*jq46B+{YR<9}7_&%NHP82wo7lbT^@l2!|7 zSy*#yj83or2W?#0?AwW)(&vvS4#R#Sk?Ze65P!`By7(TJtqIYj+9~e&c0{n=e7>+1 zRz}Y{{r>xj!S$blrxsg;NT@{}qtoXPCI?#s*pM*h14f?ieA-`34rRITg|v*tCjK&+ z!#ZvyH(*Uk{p4mYwJ?Aoqf4!7Q)&^1kT47fdP9nwe?|XN2j#5DP~#a*sh!Gp|3GT* z?SsgR3s=$&feE*W(+hzi|3|4GZWsn^S`RHWaHWYkOjn%G_)n%s%aO)df`RDL@Z0o7W~ zo?{d?qnnmmrMyk-0H4y-ksgw+e-2a=SDo zhdigk7^~q0MuIf)nwLx~GSQ7C6vt6Ap&L$`%XU7CGQk_;?3bp;b%!w59l|6HOgosu z*;(gqIfu553o7H>TlSp;(xf2H!7^&@G`ANHG4pU4bFZVCA${F_lXdP#!W?cQ#hEOp8b&22lihzrob)3~uac9YR_B4JkaM)c zo+{hwfAo4ZQ{fm8=RpZm#*#j?EA^2Q2l_~f1AT~Ewuc^zYed|wQOX+0y#FZ?BiT?Q z7Os?tzV2pOrdlF~$`W~U^@QB}B2M~|MwJpVQj$m(3MC5csd6<)glixs5#I&tBb>GQ zV01p7S|skCiOA`j2hD6HEwR>ct1|y_=1)sH`dMeDY=b&cMa_3lQd`f1KVnyl9z*U@ z#7@7Oo!G{ZUFNSu?DR|Qw85UPV(04~u>ZM=eWO7CyU$1LOs!@owkc$%?Ou=A>6h4P zgT1zjofnMt7T&H(+0`Op_jSc9_Zfj|YGQ36wVY5PJN*(hZBXM9j-5C!G)esl*%@(f zU>{z16A-9oC)OUa%Lx^-(=V~p2765vJMYkdy;^og+_$CbLH`q|W+&DWvdak-vePfI z(*`?!(8c!78&r4yN|NdqkRj_LPQ>~q&Og?U47nX@`B3Pa7CxXAHzTpm@U^3DIKgYj zuS3>(NWKTOt@Aweh01Ox><&leJK29`uUS`FpGjs-xN|vUA7@OnJB(GI9yt)gPY-KLfMOJ?2@)te%0HiS%`oHWWw zvIoHYlRSp}p2EWr(LPQkv-aosuzEDK!^dQ0$J&n&w1aOS%LKm-LV#O{0hBKW@aP;* zelNp0?2}ju8#D&+m52d+L1O^#ix|M`D+cf?Edw5ZGVy9JBLw)>i2?i?#{m9J3V^JA zf;t%XNj}^!LrPmVRo4EzM4l*%i<@K}Z<15M?JqD`^jOGnW~C#Go|YzmtvF|-N$ygH zTt|?>k8+qHRguYtEi2hf>6@|7;bGWc#8|+o>Gq?9J5}4^vw1)jgMDZZeA1d0Z$r5j z`vL-6E%#Y0c@5v$;0LmEkp*1;Wn=en0cJ*@Lrm%0w20qkiN2`<6xHpoATo!KgnCJ$ zV0jD(>x{TJ$L>LD#FKZeuM7nJ~}C0!HMCQzUaRD z=)GfjzTxMrQRT7KS!-JJet|X;Vo6LZ10o^*9(sCk?r`srou3An!sgJ0Jc;oS_qYuaVeF8(dO=h8Q{7vOCi=Deq6(RQH? zud2DTN^+Yru4Y!xZAq!hHUFYLox7$zt3D-8X}uU9)tWIDFkS=lEsV7D>OTLLeRK6j z@5_yihqu&Ue(n6k*mqBl{AJz6XWZ5KT{pFU{O`yN*;M?sqwD5zkIatJfo)3H$wc$Um0yv*N*$IjUHNU$bXzvKiIw6wEvc} HGLZT&l_;XH delta 4374 zcmaJ_YitzP8ND;JJG)-n)Gub&V0&jVhB1%SU{f3(_7W%wA-rNtu*r+k1g8&%%o?SU z<&2%6zWm45grt?Ls!>`ALZnLFHff}!P_?N1sG_I}N`H_PDNR)=KT=dhZBbkGoIA5S zGfUf*eCPYl{qA?>p8MT2rimqY8kF=e&#M{ibf3zreh-#z$KMN(YdF2va`Ar$y6Lg+cKpgy7$ zyjk_Qa>@Hp?RA$q8-zIRjG!^{O;%or%qpYt{TU2MrtD6*DH{ngB@@k|6K+e+#l^)TuTh66%zW z*6#I&ll?g#HYA*qFyeIk4)5E^0pz`uTndhB$(}4HJ6$K^qS0QnetZRAtMpkk8C{A} zpHiowbHXs}KAJU``17T?#gr+ zOi~&|W8aBJx3K)8!Ky(c8ry5X>_wOQKu71?r z#y-u$p2(nJL~EZW-p>eu3TS=@lTfW8^pu9tWYkg-kLgyzfLke8l$!yqj2#_ZBWW_`=Rm?(Yt_V%+IV=%h+unsV ze(l?zm!`}24q(1_0F%@=Eq@3{XYJi`3~lRfm^O|Sq?4KVNRxut_g2yTV18q1FC*`( zV$MZWt-UYsU6C-)Lw9oyHBj2m&;!*_!#*f&X7yLqC#0`CZ!pgx1Wc}CUEf~~HH;`H zgPofpC;gDpjdHRpXOD!5?86azv}&vW)*G=~N=Ja$IESGDWvu8!JF1VA*w;r&?CV3+ zv|Lq)xJJaCI;E(udnyvi zM1e%UJzC8MiI&tz#JymCinY!k4cEt2r-(ZzLvs50z4>gEmRK&Bs*Hb%@kb>c{j5D! zwLzVzq2}I`)aD}iLw0q_WtTG>veU0+C)OUY%lL(moqmO#HrUfO?A-1?`;8j*c7ghL z7DIN1*0K{@7O>NHE{5#%E9|tvUSGq`1IBy{yDKWYIz`y|nc`OKj6f|lvE>1^91xM6 zeubJgsBsI#HU$qfNqw8_>~XGO9&T_F5U6D*))BDF0TJ2hSJ-KT9anOUooA@eUMo9$ zoNH2bzy1l-vJ>kJ*yVtT?DQ+_w84(AuNXT|P~G{6B()omUFMTm5%arP|5!P)%js0B zi$Xtd=FR9{Al4OZJKBcrZ#&)&S$kaW1KQ>(F8Xw|+6gP!KI4TqK-l>q#Hvfu}Huv%Hj-2!CarTBh^z%F7G!o0W0goIp7V?-89@;+7i5edE zIFE%qGO~x$j?IX0zCK`*V@ee!oIiyK6>Xo2pKZ}8vB$X>QprdKL2)X=`G$Z>j(MX( zrB3lqu82n)Oy2d@v>Q>5u=8<9Bg1Z=5#fAeKqJTeBc$PdU!kGxPv{lAYji^FaW-gJ zS=YaeW#}iOc1DErO9Co6Xqba!Ie__c5lwMN=@`nxdXP1ewI1TbT&Y4Ux~eWtmCx{0`2uk31Uu!Y zmSKOfYTJ)VlOHbj)ttV8fD`3KnD5j9U|U7}gVLOISAD`V!$T z)jH+P7}*XR-a6AchxdC27p(tfY@cTIlU~`_t~lOJqdhwbU=lZhI)l%$1c#qtnsQI} zz4V>)IHbFu5#pbCUdNHyJu>M$aq46VRVRLrcl<4Crh9Zm{1D5~1g!h+(LKBH{HeFe z99GVh&zNJH`zC5bh*>eF^ofMH5qP$;StP|_6cYQU;ibgYz?)MtqE4Je*|F~h={2nM zy_XPKCw>rkKZaK?R`&RPZz)5fQT#pdeuKUyvE0SHnC2SX7Euhm58<_m=L7Fkc!v0M z;I*muh@9Bp%W=OJ`_&P#Oq`b9tT>`(#BwnjS$P>ZRwjr{Vr0=zLLo2Hw@cds#axI>cY3_d@!L_C0uwn>g<4GHHkS+d#RcXF@5@ ztkP9w(ffuq*0ZRcQ=b#Zv|h9)v{tlVM*A|5@1vz%RJVG`-gnFI^!wm~-Gv4opw|PaSsl23kE2-YtUT)s~iL%g_ F`VVjApT7VA diff --git a/常用工具/地图生成器.exe b/常用工具/地图生成器.exe index 541b3626aaaf5d6672027f89acb03cc47d9608fa..5ec618aa414d5658fa98651a23ec6b9bf0690a3a 100644 GIT binary patch literal 20480 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 HrU(8HY7`Ky delta 7030 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 gM90`q?%A|<= Date: Wed, 27 Dec 2017 16:10:47 +0800 Subject: [PATCH 02/25] Multiple Autotiles --- images/autotile1.png | Bin 0 -> 2896 bytes images/autotile2.png | Bin 0 -> 7481 bytes images/autotile3.png | Bin 0 -> 3829 bytes libs/core.js | 85 ++++++++++++++++++++++++----------------- libs/floors/sample1.js | 24 ++++++------ libs/floors/sample2.js | 2 +- libs/icons.js | 6 +++ libs/maps.js | 27 +++++++++++-- libs/ui.js | 2 +- main.js | 10 +++-- 10 files changed, 101 insertions(+), 55 deletions(-) create mode 100644 images/autotile1.png create mode 100644 images/autotile2.png create mode 100644 images/autotile3.png diff --git a/images/autotile1.png b/images/autotile1.png new file mode 100644 index 0000000000000000000000000000000000000000..2dacd883d751939559351f12edec3c7d264fbd5a GIT binary patch literal 2896 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 NVPtUm0$blP@;|E8VTb?# literal 0 HcmV?d00001 diff --git a/libs/core.js b/libs/core.js index f0a0a18c..f1c3f1ae 100644 --- a/libs/core.js +++ b/libs/core.js @@ -210,31 +210,24 @@ core.prototype.loader = function (callback) { for (var i = 0; i < core.images.length; i++) { core.loadImage(core.images[i], function (imgName, image) { core.setStartLoadTipText('正在加载图片 ' + imgName + "..."); - imgName = imgName.split('-'); - imgName = imgName[0]; core.material.images[imgName] = image; loadedImageNum++; core.setStartLoadTipText(imgName + ' 加载完毕...'); core.setStartProgressVal(loadedImageNum * (100 / allImageNum)); if (loadedImageNum == allImageNum) { - // 加载音频 - for (var key in core.sounds) { - for (var i = 0; i < core.sounds[key].length; i++) { - var soundName=core.sounds[key][i]; - soundName = soundName.split('-'); - var sound = new Audio(); - sound.preload = 'none'; - sound.src = 'sounds/' + soundName[0] + '.' + key; - if (soundName[1] == 'loop') { - sound.loop = 'loop'; + + // 加载Autotile + core.material.images.autotile={}; + var autotileIds = Object.keys(core.material.icons.autotile); + for (var x=0;x12 || y<0 || y>12) return 0; - return autotileMaps[13*x+y]?1:0; + return autotileMaps[13*x+y]==autotileId?1:0; } for (var xx=0;xx<13;xx++) { for (var yy=0;yy<13;yy++) { if (isAutotile(xx, yy)) { // 绘制autotile var id=isAutotile(xx, yy - 1) + 2 * isAutotile(xx - 1, yy) + 4 * isAutotile(xx, yy + 1) + 8 * isAutotile(xx + 1, yy); - core.drawAutotileBlock(floorId, canvas, left + xx * size, top + yy * size, size, core.material.images.autotile, id); + core.drawAutotileBlock(floorId, canvas, left + xx * size, top + yy * size, size, core.material.images.autotile[autotileId], id); } } } @@ -1810,16 +1827,16 @@ core.prototype.drawAutotile = function (floorId, canvas, autotileMaps, left, top for (var yy=0;yy<13;yy++) { if (isAutotile(xx, yy) + isAutotile(xx + 1, yy) + isAutotile(xx + 1, yy + 1) + isAutotile(xx, yy + 1) != 3) continue; if (!isAutotile(xx, yy)) { - core.drawAutotileBlock(floorId, canvas, left + xx * size + size, top + yy * size + size, size, core.material.images.autotile, 16); + core.drawAutotileBlock(floorId, canvas, left + xx * size + size, top + yy * size + size, size, core.material.images.autotile[autotileId], 16); } if (!isAutotile(xx + 1, yy)) { - core.drawAutotileBlock(floorId, canvas, left + xx * size + size / 2, top + yy * size + size, size, core.material.images.autotile, 17); + core.drawAutotileBlock(floorId, canvas, left + xx * size + size / 2, top + yy * size + size, size, core.material.images.autotile[autotileId], 17); } if (!isAutotile(xx + 1, yy + 1)) { - core.drawAutotileBlock(floorId, canvas, left + xx * size + size / 2, top + yy * size + size / 2, size, core.material.images.autotile, 18); + core.drawAutotileBlock(floorId, canvas, left + xx * size + size / 2, top + yy * size + size / 2, size, core.material.images.autotile[autotileId], 18); } if (!isAutotile(xx, yy + 1)) { - core.drawAutotileBlock(floorId, canvas, left + xx * size + size, top + yy * size + size / 2, size, core.material.images.autotile, 19); + core.drawAutotileBlock(floorId, canvas, left + xx * size + size, top + yy * size + size / 2, size, core.material.images.autotile[autotileId], 19); } } } diff --git a/libs/floors/sample1.js b/libs/floors/sample1.js index 4aaa4a92..b9197f2f 100644 --- a/libs/floors/sample1.js +++ b/libs/floors/sample1.js @@ -9,19 +9,19 @@ main.floors.sample1 = { "canUseQuickShop": true, // 该层是否允许使用快捷商店 "defaultGround": "grass", // 默认地面的图块ID(terrains中) "map": [ // 地图数据,需要是13x13,建议使用地图生成器来生成 - [7, 131, 8, 2, 9, 130, 10, 2, 166, 165, 132, 165, 166], - [0, 0, 0, 0, 0, 0, 0, 2, 165, 164, 0, 162, 165], - [2, 2, 2, 2, 121, 2, 2, 2, 0, 0, 229, 0, 0], - [43, 33, 44, 1, 0, 0, 0, 2, 165, 161, 0, 163, 165], - [21, 22, 21, 1, 0, 0, 0, 2, 166, 165, 0, 165, 166], - [1, 245, 1, 1, 0, 87, 0, 2, 2, 2, 85, 2, 2], - [0, 246, 0, 1, 0, 0, 0, 2, 2, 221, 0, 221, 2], - [246, 0, 246, 1, 0, 0, 0, 121, 85, 0, 0, 0, 2], - [1, 246, 1, 1, 0, 2, 2, 2, 2, 2, 2, 2, 2], + [7, 131, 8, 152, 9, 130, 10, 152, 166, 165, 132, 165, 166], + [0, 0, 0, 0, 0, 0, 0, 152, 165, 164, 0, 162, 165], + [152, 152, 152, 152, 121, 152, 152, 152, 0, 0, 229, 0, 0], + [43, 33, 44, 151, 0, 0, 0, 152, 165, 161, 0, 163, 165], + [21, 22, 21, 151, 0, 0, 0, 152, 166, 165, 0, 165, 166], + [151, 245, 151, 151, 0, 87, 0, 152, 152, 152, 85, 153, 153], + [0, 246, 0, 151, 0, 0, 0, 152, 152, 221, 0, 221, 153], + [246, 0, 246, 151, 0, 0, 0, 121, 85, 0, 0, 0, 153], + [151, 246, 151, 151, 0, 153, 153, 153, 153, 153, 153, 153, 153], [0, 0, 0, 0, 0, 0, 0, 164, 0, 0, 163, 0, 0], - [1, 1, 1, 1, 0, 3, 0, 0, 0, 162, 0, 161, 0], - [1, 0, 123, 1, 0, 3, 124, 0, 121, 0, 122, 0, 126], - [1, 0, 0, 1, 88, 3, 86, 0, 0, 0, 0, 0, 0], + [1, 1, 1, 1, 0, 20, 0, 0, 0, 162, 0, 161, 0], + [1, 0, 123, 1, 0, 20, 124, 0, 121, 0, 122, 0, 126], + [1, 0, 0, 1, 88, 20, 86, 0, 0, 0, 0, 0, 0], ], "firstArrive": [ // 第一次到该楼层触发的事件 diff --git a/libs/floors/sample2.js b/libs/floors/sample2.js index 10be1230..fb7af2b4 100644 --- a/libs/floors/sample2.js +++ b/libs/floors/sample2.js @@ -7,7 +7,7 @@ main.floors.sample2 = { "name": 40, // 显示在状态栏中的层数 "canFlyTo": false, // 该楼能否被楼传器飞到(不能的话在该楼也不允许使用楼传器) "canUseQuickShop": true, // 该层是否允许使用快捷商店 - "defaultGround": "soil", // 默认地面的图块ID(terrains中) + "defaultGround": "snowGround", // 默认地面的图块ID(terrains中) "map": [ // 地图数据,需要是13x13,建议使用地图生成器来生成 [5, 5, 5, 5, 5, 5, 87, 5, 5, 5, 5, 5, 5], [5, 4, 4, 4, 4, 1, 0, 1, 4, 4, 4, 4, 5], diff --git a/libs/icons.js b/libs/icons.js index 2cd08b4a..4aced479 100644 --- a/libs/icons.js +++ b/libs/icons.js @@ -209,6 +209,12 @@ icons.prototype.init = function () { 'moneyPocket': 46, 'shoes': 47, 'hammer': 48 + }, + 'autotile': { // 所有的Autotile列表;后面的index简单取0即可 + 'autotile': 0, + 'autotile1': 0, + 'autotile2': 0, + 'autotile3': 0, } } } diff --git a/libs/maps.js b/libs/maps.js index aedd7101..0557f07a 100644 --- a/libs/maps.js +++ b/libs/maps.js @@ -61,6 +61,8 @@ maps.prototype.getBlock = function (x, y, id) { var tmp = {'x': x, 'y': y, 'id': id}; if (enable!=null) tmp.enable = enable; + ////////////////////////// 地形部分 ////////////////////////// + // 0-20 地形 if (id == 1) tmp.event = {'cls': 'terrains', 'id': 'yellowWall'}; // 黄墙 if (id == 2) tmp.event = {'cls': 'terrains', 'id': 'whiteWall'}; // 白墙 @@ -77,13 +79,19 @@ maps.prototype.getBlock = function (x, y, id) { if (id == 13) tmp.event = {'cls': 'animates', 'id': 'weakNet', 'noPass': false, 'trigger': 'passNet'}; // 衰网 if (id == 14) tmp.event = {'cls': 'animates', 'id': 'curseNet', 'noPass': false, 'trigger': 'passNet'}; // 咒网 if (id == 15) tmp.event = {'cls': 'animates', 'id': 'water', 'noPass': true}; // 水 + // 在这里添加更多地形 + // 如果空地不足,可以从180以后开始继续放,只要不和现有的数字冲突即可 - - // autotile: 20 + // Autotile if (id == 20) tmp.event = {'cls': 'autotile', 'id': 'autotile', 'noPass': true}; // autotile - // 更多的autotile从350继续放 + // 更多的autotile从151到160,只要不和现有的数字冲突即可 + if (id == 151) tmp.event = {'cls': 'autotile', 'id': 'autotile1', 'noPass': true}; + if (id == 152) tmp.event = {'cls': 'autotile', 'id': 'autotile2', 'noPass': true}; + if (id == 153) tmp.event = {'cls': 'autotile', 'id': 'autotile3', 'noPass': true}; + ////////////////////////// 物品部分 ////////////////////////// + // 21-80 物品 if (id == 21) tmp.event = {'cls': 'items', 'id': 'yellowKey'}; // 黄钥匙 if (id == 22) tmp.event = {'cls': 'items', 'id': 'blueKey'}; // 蓝钥匙 @@ -131,6 +139,9 @@ maps.prototype.getBlock = function (x, y, id) { if (id == 64) tmp.event = {'cls': 'items', 'id': 'shoes'} // 绿鞋 if (id == 65) tmp.event = {'cls': 'items', 'id': 'hammer'} // 圣锤 + + ////////////////////////// 门、楼梯、传送点部分 ////////////////////////// + // 81-100 门 if (id == 81) tmp.event = {'cls': 'terrains', 'id': 'yellowDoor', 'trigger': 'openDoor'}; // 黄门 if (id == 82) tmp.event = {'cls': 'terrains', 'id': 'blueDoor', 'trigger': 'openDoor'}; // 蓝门 @@ -148,6 +159,8 @@ maps.prototype.getBlock = function (x, y, id) { if (id == 94) tmp.event = {'cls': 'animates', 'id': 'rightPortal', 'noPass': false}; // 右箭头 + ////////////////////////// NPC部分 ////////////////////////// + // 121-150 NPC if (id == 121) tmp.event = {'cls': 'npcs', 'id': 'man'}; if (id == 122) tmp.event = {'cls': 'npcs', 'id': 'woman'}; @@ -162,6 +175,8 @@ maps.prototype.getBlock = function (x, y, id) { if (id == 131) tmp.event = {'cls': 'npcs', 'id': 'blueShop'}; if (id == 132) tmp.event = {'cls': 'npcs', 'id': 'princess'}; + ////////////////////////// 其他部分 ////////////////////////// + // 161-200 其他(单向箭头、灯、箱子等等) if (id == 161) tmp.event = {'cls': 'terrains', 'id': 'arrowUp', 'noPass': false}; // 单向上箭头 if (id == 162) tmp.event = {'cls': 'terrains', 'id': 'arrowDown', 'noPass': false}; // 单向下箭头 @@ -170,6 +185,9 @@ maps.prototype.getBlock = function (x, y, id) { if (id == 165) tmp.event = {'cls': 'terrains', 'id': 'light', 'trigger': 'changeLight', 'noPass': false}; // 灯 if (id == 166) tmp.event = {'cls': 'terrains', 'id': 'darkLight', 'noPass': true}; // 暗灯 + + ////////////////////////// 怪物部分 ////////////////////////// + // 201-300 怪物 if (id == 201) tmp.event = {'cls': 'enemys', 'id': 'greenSlime'}; if (id == 202) tmp.event = {'cls': 'enemys', 'id': 'redSlime'}; @@ -232,6 +250,9 @@ maps.prototype.getBlock = function (x, y, id) { if (id == 259) tmp.event = {'cls': 'enemys', 'id': 'darkFairy'}; if (id == 260) tmp.event = {'cls': 'enemys', 'id': 'greenKnight'}; + ////////////////////////// 待定... ////////////////////////// + // 目前ID暂时不要超过400 + return tmp; } diff --git a/libs/ui.js b/libs/ui.js index 6ac8143a..97e9b6df 100644 --- a/libs/ui.js +++ b/libs/ui.js @@ -1044,7 +1044,7 @@ ui.prototype.drawThumbnail = function(floorId, canvas, blocks, x, y, size, heroL if (core.isset(block.event) && !(core.isset(block.enable) && !block.enable)) { if (block.event.cls == 'autotile') { // core.drawAutotile(); - autotileMaps[13*block.x + block.y] = true; + autotileMaps[13*block.x + block.y] = block.event.id; continue; } else { diff --git a/main.js b/main.js index f173fa80..6d7f82bc 100644 --- a/main.js +++ b/main.js @@ -33,14 +33,12 @@ function main() { 'mdefCol': document.getElementById('mdefCol'), 'expCol': document.getElementById('expCol'), }; - // console.log('加载游戏容器和开始界面dom对象完成 如下'); - // console.log(this.dom); this.loadList = [ 'items', 'icons', 'maps', 'enemys', 'events', 'data', 'ui', 'core' ]; - // console.log('加载js文件列表加载完成' + this.loadList); this.images = [ - 'animates', 'enemys', 'hero', 'items', 'npcs', 'terrains', "autotile" + 'animates', 'enemys', 'hero', 'items', 'npcs', 'terrains' + // Autotile 动态添加 ]; this.sounds = { 'mp3': ['bgm-loop', 'floor'], @@ -78,6 +76,8 @@ function main() { 'curse': document.getElementById('curse'), 'hard': document.getElementById("hard") } + + //------------------------ 用户修改内容 ------------------------// this.version = "0.1"; // 游戏版本号;如果更改了游戏内容建议修改此version以免造成缓存问题。 this.useCompress = false; // 是否使用压缩文件 @@ -88,6 +88,8 @@ function main() { this.floorIds = [ // 在这里按顺序放所有的楼层;其顺序直接影响到楼层传送器的顺序和上楼器/下楼器的顺序 "sample0", "sample1", "sample2" ] + //------------------------ 用户修改内容 END ------------------------// + this.floors = {} this.instance = {}; this.canvas = {}; From c21d62fb3762cf9ad7841bea76635cfff9b3d925 Mon Sep 17 00:00:00 2001 From: ckcz123 Date: Wed, 27 Dec 2017 17:25:14 +0800 Subject: [PATCH 03/25] Disable Battle Animate --- libs/data.js | 1 + libs/events.js | 19 ++++++++++++++++--- libs/ui.js | 2 ++ 更新说明.txt | 3 ++- 4 files changed, 21 insertions(+), 4 deletions(-) diff --git a/libs/data.js b/libs/data.js index fab64b02..f63ec3d6 100644 --- a/libs/data.js +++ b/libs/data.js @@ -128,6 +128,7 @@ data.prototype.init = function() { "bigKeyIsBox": false, // 如果此项为true,则视为钥匙盒,红黄蓝钥匙+1;若为false,则视为大黄门钥匙 /****** 系统相关 ******/ "startDirectly": false, // 点击“开始游戏”后是否立刻开始游戏而不显示难度选择界面 + "canOpenBattleAnimate": false, // 是否允许用户开启战斗过程;如果此项为false,则下面两项均强制视为false "showBattleAnimateConfirm": true, // 是否在游戏开始时提供“是否开启战斗动画”的选项 "battleAnimate": true, // 是否默认显示战斗动画;用户可以手动在菜单栏中开关 "displayEnemyDamage": true, // 是否地图怪物显伤;用户可以手动在菜单栏中开关 diff --git a/libs/events.js b/libs/events.js index 91091425..59ac6553 100644 --- a/libs/events.js +++ b/libs/events.js @@ -66,6 +66,14 @@ events.prototype.startGame = function (hard) { core.hideStartAnimate(function() { core.drawText(core.clone(core.firstData.startText), function() { + + // 强制关闭战斗过程? + if (!core.flags.canOpenBattleAnimate) { + core.flags.showBattleAnimateConfirm=false; + core.flags.battleAnimate=false; + core.setLocalStorage('battleAnimate', false); + } + if (core.flags.showBattleAnimateConfirm) { // 是否提供“开启战斗动画”的选择项 core.status.event.selection = core.flags.battleAnimate ? 0 : 1; core.ui.drawConfirmBox("你想开启战斗动画吗?\n之后可以在菜单栏中开启或关闭。\n(强烈建议新手开启此项)", function () { @@ -1125,9 +1133,14 @@ events.prototype.clickSwitchs = function (x,y) { core.ui.drawSwitchs(); break; case 1: - core.flags.battleAnimate=!core.flags.battleAnimate; - core.setLocalStorage('battleAnimate', core.flags.battleAnimate); - core.ui.drawSwitchs(); + if (!core.flags.canOpenBattleAnimate) { + core.drawTip("本塔不能开启战斗动画!"); + } + else { + core.flags.battleAnimate=!core.flags.battleAnimate; + core.setLocalStorage('battleAnimate', core.flags.battleAnimate); + core.ui.drawSwitchs(); + } break; case 2: core.flags.displayEnemyDamage=!core.flags.displayEnemyDamage; diff --git a/libs/ui.js b/libs/ui.js index 97e9b6df..d712d134 100644 --- a/libs/ui.js +++ b/libs/ui.js @@ -443,6 +443,8 @@ ui.prototype.drawBattleAnimate = function(monsterId, callback) { core.setAlpha('ui', 1); core.strokeRect('ui', left - 1, top - 1, right + 1, bottom + 1, '#FFFFFF', 2); core.clearMap('data',0,0,416,416); + + clearInterval(core.interval.tipAnimate); core.setAlpha('data', 1); core.setOpacity('data', 1); core.status.boxAnimateObjs = []; diff --git a/更新说明.txt b/更新说明.txt index b0e69a89..8f51d1ae 100644 --- a/更新说明.txt +++ b/更新说明.txt @@ -1,6 +1,7 @@ 全键盘操作 √ Ctrl快速跳过对话 √ 支持不同层使用不同的地面素材 √ -直接内嵌了诸多默认的terrains素材 +支持多个Autotile同时存在 √ +直接内嵌了诸多默认的terrains素材 √ 自动定位到上次存/读档位置 √ 设置储存 √ From 9031a8351f3e018c5ff0b504f145bbbd83cc6267 Mon Sep 17 00:00:00 2001 From: ckcz123 Date: Wed, 27 Dec 2017 17:38:00 +0800 Subject: [PATCH 04/25] Update FG --- libs/data.js | 2 +- libs/ui.js | 3 +-- 更新说明.txt | 1 + 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/libs/data.js b/libs/data.js index f63ec3d6..fecc718c 100644 --- a/libs/data.js +++ b/libs/data.js @@ -128,7 +128,7 @@ data.prototype.init = function() { "bigKeyIsBox": false, // 如果此项为true,则视为钥匙盒,红黄蓝钥匙+1;若为false,则视为大黄门钥匙 /****** 系统相关 ******/ "startDirectly": false, // 点击“开始游戏”后是否立刻开始游戏而不显示难度选择界面 - "canOpenBattleAnimate": false, // 是否允许用户开启战斗过程;如果此项为false,则下面两项均强制视为false + "canOpenBattleAnimate": true, // 是否允许用户开启战斗过程;如果此项为false,则下面两项均强制视为false "showBattleAnimateConfirm": true, // 是否在游戏开始时提供“是否开启战斗动画”的选项 "battleAnimate": true, // 是否默认显示战斗动画;用户可以手动在菜单栏中开关 "displayEnemyDamage": true, // 是否地图怪物显伤;用户可以手动在菜单栏中开关 diff --git a/libs/ui.js b/libs/ui.js index d712d134..2911de16 100644 --- a/libs/ui.js +++ b/libs/ui.js @@ -594,8 +594,7 @@ ui.prototype.drawBattleAnimate = function(monsterId, callback) { // 反击 if (core.enemys.hasSpecial(mon_special, 8)) { - var counterDamage = parseInt(core.values.counterAttack * hero_atk); - hero_mdef -= counterDamage; + hero_mdef -= parseInt(core.values.counterAttack * hero_atk); if (hero_mdef<0) { hero_hp+=hero_mdef; diff --git a/更新说明.txt b/更新说明.txt index 8f51d1ae..7d20325b 100644 --- a/更新说明.txt +++ b/更新说明.txt @@ -5,3 +5,4 @@ Ctrl快速跳过对话 √ 直接内嵌了诸多默认的terrains素材 √ 自动定位到上次存/读档位置 √ 设置储存 √ +setFg使用方法更新 \ No newline at end of file From 38672bd677175f04e848793d5389fcc533e0b082 Mon Sep 17 00:00:00 2001 From: oc Date: Wed, 27 Dec 2017 23:45:44 +0800 Subject: [PATCH 05/25] Update Curtain --- index.html | 3 +- libs/core.js | 68 +++++++++++++++++++++++----------------- libs/floors/sample0.js | 2 +- libs/floors/sample1.js | 2 +- libs/floors/sample2.js | 2 +- main.js | 2 ++ styles.css | 39 +++++++++++++---------- 常用工具/地图生成器.exe | Bin 20480 -> 20480 bytes 更新说明.txt | 2 +- 9 files changed, 70 insertions(+), 50 deletions(-) diff --git a/index.html b/index.html index fb79075f..31303e06 100644 --- a/index.html +++ b/index.html @@ -96,10 +96,11 @@

+
- + 此浏览器不支持HTML5 diff --git a/libs/core.js b/libs/core.js index f1c3f1ae..fdbba744 100644 --- a/libs/core.js +++ b/libs/core.js @@ -87,6 +87,7 @@ function core() { 'selection': null, 'ui': null, }, + 'curtainColor': null, 'usingCenterFly':false, 'openingDoor': null, @@ -475,7 +476,7 @@ core.prototype.keyDown = function(keyCode) { case 40: core.moveHero('down'); break; - case 13: case 32: case 51: // 快捷键3:飞 + case 13: case 32: case 67: case 51: // 快捷键3:飞 // 因为加入了两次的检测机制,从keydown转移到keyup,同时保证位置信息正确,但以下情况会触发作图的bug: // 在鼠标的路线移动中使用飞,绿块会滞后一格,显示的位置不对,同时也不会倍以下的代码清除 if (core.status.heroStop && core.hasItem('centerFly')) { @@ -491,9 +492,9 @@ core.prototype.keyDown = function(keyCode) { core.status.usingCenterFly = false; } else if (keyCode==51) { core.status.usingCenterFly = true; - var fillstyle = 'rgba(255,0,0,0.5)'; - if (core.canUseItem('centerFly')) fillstyle = 'rgba(0,255,0,0.5)'; - core.fillRect('ui',(12-core.getHeroLoc('x'))*32,(12-core.getHeroLoc('y'))*32,32,32,fillstyle); + core.setAlpha('ui', 0.5); + core.fillRect('ui',(12-core.getHeroLoc('x'))*32,(12-core.getHeroLoc('y'))*32,32,32,core.canUseItem('centerFly')?'#00FF00':'#FF0000'); + core.setAlpha('ui', 1); core.drawTip("请确认当前中心对称飞行器的位置"); } } @@ -1600,10 +1601,16 @@ core.prototype.changeFloor = function (floorId, stair, heroLoc, time, callback) } window.setTimeout(function () { - // console.log('地图切换到' + floorId); core.playSound('floor', 'mp3'); core.mapChangeAnimate('show', time/2, function () { - core.statusBar.floor.innerHTML = core.status.maps[floorId].name; + + // 根据文字判断是否斜体 + var floorName = core.status.maps[floorId].name; + core.statusBar.floor.innerHTML = floorName; + if (/^[+-]?\d+$/.test(floorName)) + core.statusBar.floor.style.fontStyle = 'italic'; + else core.statusBar.floor.style.fontStyle = 'normal'; + core.updateStatusBar(); core.drawMap(floorId, function () { setTimeout(function() { @@ -2406,30 +2413,23 @@ core.prototype.hasBetweenAttack = function(x,y) { core.prototype.setFg = function(color, time, callback) { time = time || 750; - core.setOpacity('fg', 1); - var reset = false; - - if (!core.isset(core.status.event.data.currentColor)) { - core.status.event.data.currentColor = [0,0,0,0]; + if (!core.isset(core.status.curtainColor)) { + core.status.curtainColor = [0,0,0,0]; } - var fromColor = core.status.event.data.currentColor; + var fromColor = core.status.curtainColor; - if (!core.isset(color)) { + if (!core.isset(color)) color = [0,0,0,0]; - reset = true; - } - if (color.length==3) { + if (color.length==3) color.push(1); - } if (color[3]<0) color[3]=0; if (color[3]>1) color[3]=1; var step=0; var changeAnimate = setInterval(function() { step++; - core.clearMap('fg', 0, 0, 416, 416); var nowAlpha = fromColor[3]+(color[3]-fromColor[3])*step/25; var nowR = parseInt(fromColor[0]+(color[0]-fromColor[0])*step/25); @@ -2439,19 +2439,13 @@ core.prototype.setFg = function(color, time, callback) { if (nowG<0) nowG=0; if (nowG>255) nowG=255; if (nowB<0) nowB=0; if (nowB>255) nowB=255; - core.setAlpha('fg', nowAlpha); - var toRGB = "#"+((1<<24)+(nowR<<16)+(nowG<<8)+nowB).toString(16).slice(1) - core.fillRect('fg', 0, 0, 416, 416, toRGB); + var toRGB = "#"+((1<<24)+(nowR<<16)+(nowG<<8)+nowB).toString(16).slice(1); + core.dom.curtain.style.background = toRGB; + core.dom.curtain.style.opacity = nowAlpha; if (step>=25) { clearInterval(changeAnimate); - if (reset) { - core.clearMap('fg', 0, 0, 416, 416); - delete core.status.event.data.currentColor; - core.setAlpha('fg', 1); - core.updateFg(); - } - else core.status.event.data.currentColor = color; + core.status.curtainColor = color; if (core.isset(callback)) callback(); } }, time/25); @@ -2501,6 +2495,7 @@ core.prototype.nextY = function () { */ core.prototype.updateFg = function () { + /* // 如果存在颜色 if (core.isset(core.status.event.data) && core.isset(core.status.event.data.currentColor)) { var color=core.status.event.data.currentColor; @@ -2508,6 +2503,7 @@ core.prototype.updateFg = function () { core.fillRect("fg",0,0,416,416,"#"+((1<<24)+(color[0]<<16)+(color[1]<<8)+color[2]).toString(16).slice(1)); return; } + */ if (!core.isset(core.status.thisMap) || !core.isset(core.status.thisMap.blocks)) return; // 更新显伤 @@ -3324,7 +3320,6 @@ core.prototype.updateStatusBar = function () { core.setStatus('hp', Math.min(core.values.HPMAX, core.getStatus('hp'))); } - // core.statusBar.floor.innerHTML = core.maps.maps[core.status.floorId].name; var statusList = ['hp', 'atk', 'def', 'mdef', 'money', 'experience']; statusList.forEach(function (item) { core.statusBar[item].innerHTML = core.getStatus(item); @@ -3521,6 +3516,15 @@ core.prototype.resize = function(clientWidth, clientHeight) { border: '3px #fff solid', } }, + { + id: 'curtain', + rules: { + width: (canvasWidth - SPACE*2) + unit, + height:(canvasWidth - SPACE*2) + unit, + top: (canvasTop + SPACE) + unit, + right: SPACE + unit, + } + }, { id: 'floorMsgGroup', rules:{ @@ -3602,6 +3606,12 @@ core.prototype.resize = function(clientWidth, clientHeight) { display: mdefDisplay } }, + { + id: 'hard', + rules: { + lineHeight: toolsHeight + unit + } + } ] core.domRenderer(); } diff --git a/libs/floors/sample0.js b/libs/floors/sample0.js index 88f49e47..a32e0d7d 100644 --- a/libs/floors/sample0.js +++ b/libs/floors/sample0.js @@ -4,7 +4,7 @@ main.floors.sample0 = { "floorId": "sample0", // 楼层唯一标识符,需要和名字完全一致 "title": "样板 0 层", // 楼层中文名 - "name": 0, // 显示在状态栏中的层数 + "name": "0", // 显示在状态栏中的层数 "canFlyTo": true, // 该楼能否被楼传器飞到(不能的话在该楼也不允许使用楼传器) "canUseQuickShop": true, // 该层是否允许使用快捷商店 "defaultGround": "ground", // 默认地面的图块ID(terrains中) diff --git a/libs/floors/sample1.js b/libs/floors/sample1.js index b9197f2f..bc23f241 100644 --- a/libs/floors/sample1.js +++ b/libs/floors/sample1.js @@ -4,7 +4,7 @@ main.floors.sample1 = { "floorId": "sample1", // 楼层唯一标识符,需要和名字完全一致 "title": "样板 1 层", // 楼层中文名 - "name": 1, // 显示在状态栏中的层数 + "name": "样板1层", // 显示在状态栏中的层数 "canFlyTo": true, // 该楼能否被楼传器飞到(不能的话在该楼也不允许使用楼传器) "canUseQuickShop": true, // 该层是否允许使用快捷商店 "defaultGround": "grass", // 默认地面的图块ID(terrains中) diff --git a/libs/floors/sample2.js b/libs/floors/sample2.js index fb7af2b4..4c569e37 100644 --- a/libs/floors/sample2.js +++ b/libs/floors/sample2.js @@ -4,7 +4,7 @@ main.floors.sample2 = { "floorId": "sample2", // 楼层唯一标识符,需要和名字完全一致 "title": "主塔 40 层", // 楼层中文名 - "name": 40, // 显示在状态栏中的层数 + "name": "-40", // 显示在状态栏中的层数 "canFlyTo": false, // 该楼能否被楼传器飞到(不能的话在该楼也不允许使用楼传器) "canUseQuickShop": true, // 该层是否允许使用快捷商店 "defaultGround": "snowGround", // 默认地面的图块ID(terrains中) diff --git a/main.js b/main.js index 6d7f82bc..8edd46bf 100644 --- a/main.js +++ b/main.js @@ -20,6 +20,7 @@ function main() { 'toolBar': document.getElementById('toolBar'), 'tools': document.getElementsByClassName('tools'), 'gameCanvas': document.getElementsByClassName('gameCanvas'), + 'curtain': document.getElementById('curtain'), 'startButtons': document.getElementById('startButtons'), 'playGame': document.getElementById('playGame'), 'loadGame': document.getElementById('loadGame'), @@ -32,6 +33,7 @@ function main() { 'statusLabels': document.getElementsByClassName('statusLabel'), 'mdefCol': document.getElementById('mdefCol'), 'expCol': document.getElementById('expCol'), + 'hard': document.getElementById('hard'), }; this.loadList = [ 'items', 'icons', 'maps', 'enemys', 'events', 'data', 'ui', 'core' diff --git a/styles.css b/styles.css index c63e5e92..2c5ebf9d 100644 --- a/styles.css +++ b/styles.css @@ -21,7 +21,7 @@ position: fixed; top: 10px; left: 10px; - z-index: 12; + z-index: 13; } #startPanel { @@ -32,7 +32,7 @@ left: 0; background-color: #fff; overflow: hidden; - z-index: 8; + z-index: 9; } #startTop { @@ -42,7 +42,7 @@ top: 0; left: 0; background-color: #000; - z-index: 11; + z-index: 12; } #startTopProgressBar { @@ -52,7 +52,7 @@ position: absolute; top: 5%; background-color: #fff; - z-index: 12; + z-index: 13; } #startTopProgress { @@ -67,7 +67,7 @@ position: absolute; top: 8%; left: 5%; - z-index: 12; + z-index: 13; } #startBackground { @@ -77,12 +77,12 @@ height: 100%; width: auto; transform:translate(-50%,-50%); - z-index: 9; + z-index: 10; } #startLogo { position: absolute; - z-index: 9; + z-index: 10; left: 0; right: 0; margin-left: auto; @@ -95,7 +95,7 @@ #startTitle { position: absolute; - z-index: 10; + z-index: 11; } #startButtonGroup { @@ -106,7 +106,7 @@ background-color: #000; opacity: 0.85; display: none; - z-index: 9; + z-index: 10; bottom: 0; margin-bottom: 7%; } @@ -142,7 +142,7 @@ display: none; color: #fff; background-color: #000; - z-index: 7; + z-index: 8; } #logoLabel { @@ -170,7 +170,7 @@ -moz-box-sizing: border-box; -webkit-box-sizing: border-box; background: url(images/ground.png) round; - z-index: 6; + z-index: 7; display: none; } #statusBar .status{ @@ -198,7 +198,7 @@ #toolBar { position: absolute; background: url(images/ground.png) round; - z-index: 5; + z-index: 6; box-sizing: border-box; -moz-box-sizing: border-box; -webkit-box-sizing: border-box; @@ -232,6 +232,13 @@ span#poison, span#weak, span#curse { -webkit-box-sizing: border-box; } +#curtain { + z-index: 5; + position: absolute; + opacity: 0; + background: #000000; +} + #bg { z-index: 1; } @@ -240,20 +247,20 @@ span#poison, span#weak, span#curse { z-index: 2; } -#hero { +#fg { z-index: 3; } -#fg { +#hero { z-index: 4; } #ui { - z-index: 5; + z-index: 6; } #data { - z-index: 6; + z-index: 7; } .clearfix:before, diff --git a/常用工具/地图生成器.exe b/常用工具/地图生成器.exe index 5ec618aa414d5658fa98651a23ec6b9bf0690a3a..286aa26b602ab2ecad1a8db0074e005624133e98 100644 GIT binary patch delta 708 zcmY*XTS$~q5T5zf-QV@!^>_cgEi1X1+fs^VUe-%x>e_87qr^3$GR?#c*RwrXNZA$3 z2!BTmBXYYubbAoaOY~Af1wmj>J%oiXMK5L0LlhCsZ%KGy=6v7GobL?h%wQY`<2W*u z@a}QFIh=!+&ATnG(hh(Y;57)aKgskNS{y)Q{_6mMmu`d#s1;Y>7@fkC7$sB;JS)?c z{zP|;9iqJz0FK@uJEtldXwp`TyJ*(tQM)*qW*7ZZv3ryqrG7Ll*YN{Av zEXLUNwsJs>FQ!))QB7QD{!iq#Jd&JVNV7N?T#J;KzuHK6V*P z^*{+9@dwthUrF_PlN{4;A#S0dyNNr#;6BG4ry4~Vq4mZ!W3MGV-&tnhCLd8mxBOzL z3Lcl=)1NDzC&>VL%{$>$K7h{un76Tca|7=)`SMNHOd<*?bM9wi8=2+H<(aa&1lm__ z!x+7;I+W500ceLFh(U}>Di70Ku!^S3RGO>&WM7C+RaP+f(DrIK#$;!;EkSSUJGSAs zHoSG>?UfJNg`YplfprgT={#k-`Cd@iyaB}P7gkaP*fC1c7f<2B6^5kvWJAom-=QmJaB&J_g&79ALo40Bu0}Mk7+1U zn;6f+xx`GH?QjTSKk$kIbn6n^R7(=T!g1bl05^@)6;THk;C&jw^B5;oRGgI=%COcE zGC(9;4qy)Z7_3IoPm_8-o}~|Zmod)8bc0Ar#o$s7+~(*^8+RGSJ*M7vrWT`^XD${P z!X2CtiyOm-8$yeC!to!GC3)JUMSLNJ`6O;}8d=82;O%1>&wJG)0;yCxecSX1Lo{#k zV;}vn1le1?wH+sD(prMkv}_IH9Jy^JxJW@;5TDX@=5OhlOHyGO=oO`@>h@ICEdu{K?Z5f|PJOXc@MA>80K?{NyLSg) z@pyMKQo!CU$v%xJ$meKg!()z%Y&cCV!6?tIdomz zb3|5G={5Gw@yNtlEO+17!tZ$%wGp^uqDuPF1xZ} z)$y}w{EG7G=*wF}IkLFUfYu8<4U diff --git a/更新说明.txt b/更新说明.txt index 7d20325b..cd4e1ea0 100644 --- a/更新说明.txt +++ b/更新说明.txt @@ -5,4 +5,4 @@ Ctrl快速跳过对话 √ 直接内嵌了诸多默认的terrains素材 √ 自动定位到上次存/读档位置 √ 设置储存 √ -setFg使用方法更新 \ No newline at end of file +修改setFg的实现方法 √ From cf02a59deeb23cb9781dc5fc48a343675a17052b Mon Sep 17 00:00:00 2001 From: oc Date: Thu, 28 Dec 2017 01:51:13 +0800 Subject: [PATCH 06/25] Update Status Bar --- images/lv.png | Bin 0 -> 1471 bytes images/up.png | Bin 0 -> 863 bytes index.html | 14 ++++-- libs/core.js | 102 +++++++++++++++++++++++++++++++++-------- libs/data.js | 27 +++++++++-- libs/enemys.js | 11 ++--- libs/events.js | 17 ++----- libs/floors/sample1.js | 4 +- libs/floors/sample2.js | 2 +- libs/ui.js | 54 ++++++++++++---------- main.js | 9 ++++ styles.css | 5 +- 更新说明.txt | 2 + 13 files changed, 171 insertions(+), 76 deletions(-) create mode 100644 images/lv.png create mode 100644 images/up.png diff --git a/images/lv.png b/images/lv.png new file mode 100644 index 0000000000000000000000000000000000000000..3b9cf96c28b3eb21f89270cb037245920f3ea5fc GIT binary patch literal 1471 zcmV;w1wi_VP)@ZYZ>YVu&FRwj2lvgw`KzWCwd~BdymfMM_rMo!yza_jC{32QMTm zl@0X3pL@CI|DW@p!_1j6BEtVOGIR&Vn6CV(Z}M7bnRFIUz=Q6PTL1(h*pL$s|ATJ< zX%|(b+dvN#wD?0WoQJfHzcS2T(iO}t#ns{1=XCYfbG-S(U6VioSnk<@9>|LW>I>Mv z{{{&H$Yx32c>@z>z;_D~#HM8Td>xVm;~e4CAyf}EL z0dWwx6cIIG2|F5}H>*AaJrO{qlw7>=gE}@k;0%yBA;H;w%H*skS&Z!1W{{}Dt#I>uW+5rQB4QX2o)+qoW3;-c* zH*uO1RHNEY$3U_;hjSJ&g1C^V6|?U18(F_^0)VBHWg73zW0OdE7%{5(R1C;`#Pp_m z^{eZ0LkNO1(25d9_iQ4+^%1}@xa)6x@NR{)-9Q8khL76Is1^`<#A+T}Qzv=)U)9=l ztv-isw@8}}g4>G(Iia{~NB>rlxKU@r z?osl0ei3rR9o$B)vmd&rMBJ>S9ObG;wLsL5ffQH*uB(aiBBvKj#K`tx2Jd+k+D!%P zI{VVj5(_j@j&fDwwP`;F6c%q{|1^iQ_in$C8y&|CZA0R!0y=v=)0}c{DQ^3p1KlQa zV_S!J6n1i|IkJsT@u-T~a~U3_%|;k7^9f3%Qshs9YC!3Q|kY4@F&!3iW@ zKx`WT;srg^TyXRE=`2A27(f>=K}aJBemZgB?W2HO%|M}$;qb=C{|HGN)C8jN9~}!$ zaP5mA4ghJ-5)|&Du=7V0zmU<23U9zbb^u;E@GIa2pt+iXfm%I1U3lxr-on@x$c`gs z0L1xjDCqtvK(H%kfdC{znwPu@Ly!rH=4y1VISu62Vj$Uh=-sDZJ=}Qe8++>qi+48& z@?#LL2j_as6$4mY^L-$|m=Fy=KXvVQ`+q(25|FNC5=Ow>_nx15ao?%hsbkNy z{!+XvA~Ui9GFv{OegH<0=qiZCgc;K11}o>w9QkYc;EN~b&H&Yqn+ZllKJJ$+0E$2f z`0SOJzVvEo+s4}qcYh5@o85PiB98z3#h;rnQuKgr_N#p;7UJNy0WhjH1z87g#Z z{Uvii14w}M*qQkwKiD+(+d_UbQl9~gziWfUA0f#i7y+@E+$gqL+Bc0+Gfq9?} z$p1PA#0wW6+r8m|fzj6zw~qg>Uf78vPKvv&u!mhyQk zW@Y7UjivuAEj|aWyAo5W6O!&3w3w_}C zmhK4s@cIm}+3!CD%6{$Yz*?VyhQGiC;37}~RzBfdZ+))fxfi^)(a#)6y!*9=0I|oK Z;=eRJ0L-IjR=ofK002ovPDHLkV1jrryaxaP literal 0 HcmV?d00001 diff --git a/images/up.png b/images/up.png new file mode 100644 index 0000000000000000000000000000000000000000..705189d0a45e311cf44ee7126709945e01e7f677 GIT binary patch literal 863 zcmV-l1EBngP)a=DVxMi`s1i zxTJ@-H0_NCqFr5u#ibxj1(*iTH8`CPc(?8Hwnv+8{P_8XPya;#8Qu^I#(Z_H`pHWG z84j2tx~ev9_Xf9b{dV9~S%(z>Vl}+Eu_5lSYm2zDwKH%|0U>4rPy+}w1E%j2FCR_) z`eNejq3@^qm)n3m`OY0Nf2cW9=qd(hYF5aTCft|_Xjtdn>Xy(byCJaEc2@TVezfC=zc=y$T%ZY1?WjL1#-yQJBe8Jt3 z0#}i!Rsui*824|u5a+6J*~Iz{9({lA=4m#0vOhUuwSj`sp31T6>e`6QT?!DQ3s4A0 zk-G$rvMLd3K;+H>So%HGxg;p1#(*;2b-hU>663Ek-KPfTN3AsA8hSE2H1hb~eGn0C zFo3{u=Agf~BG4gQ$TlEc&4#J-Neut|;LgJ-Jj*$$f`wP_F=zD(7W&3;VG+Q!UwlM+ zD`*k;9T)OQ5`QZ{sNU;%s$RG&=8U9~3Af-qr z#NHW@BDpRb5oR|4$@AR3ozF1MfRtv|t>k-#0vfXqK)e16&U20uIf%mLUQv*F{ubl^ ptW4{204QG)T>g3~{2$ip`WxoBbTmco!D|2j002ovPDHLkV1hfWi;4gM literal 0 HcmV?d00001 diff --git a/index.html b/index.html index 31303e06..44c759a0 100644 --- a/index.html +++ b/index.html @@ -47,10 +47,14 @@

-
+

+
+ +

+

@@ -67,7 +71,7 @@

-
+

@@ -75,12 +79,16 @@

+
+ +

+
-
+
diff --git a/libs/core.js b/libs/core.js index fdbba744..58e84441 100644 --- a/libs/core.js +++ b/libs/core.js @@ -114,6 +114,13 @@ core.prototype.init = function (dom, statusBar, canvas, images, sounds, floorIds core[key] = coreData[key]; } core.flags = core.clone(core.data.flags); + if (!core.flags.enableExperience) + core.flags.enableLevelUp = false; + if (!core.flags.canOpenBattleAnimate) { + core.flags.showBattleAnimateConfirm = false; + core.flags.battleAnimate = false; + core.setLocalStorage('battleAnimate', false); + } core.values = core.clone(core.data.values); core.firstData = core.data.getFirstData(); core.initStatus.shops = core.firstData.shops; @@ -1536,7 +1543,9 @@ core.prototype.afterBattle = function(id, x, y, callback) { core.canvas.event.clearRect(32 * x, 32 * y, 32, 32); } core.updateFg(); - var hint = "打败 " + core.material.enemys[id].name + ",金币+" + money; + var hint = "打败 " + core.material.enemys[id].name; + if (core.flags.enableMoney) + hint += ",金币+" + money; if (core.flags.enableExperience) hint += ",经验+" + core.material.enemys[id].experience; core.drawTip(hint); @@ -1583,15 +1592,19 @@ core.prototype.changeFloor = function (floorId, stair, heroLoc, time, callback) core.clearContinueAutomaticRoute(); core.dom.floorNameLabel.innerHTML = core.status.maps[floorId].title; if (core.isset(stair)) { - // find heroLoc - heroLoc = core.status.hero.loc; + if (!core.isset(heroLoc)) heroLoc={}; var blocks = core.status.maps[floorId].blocks; for (var i in blocks) { if (core.isset(blocks[i].event) && !(core.isset(blocks[i].enable) && !blocks[i].enable) && blocks[i].event.id === stair) { heroLoc.x = blocks[i].x; heroLoc.y = blocks[i].y; + break; } } + if (!core.isset(heroLoc.x)) { + heroLoc.x=core.status.hero.loc.x; + heroLoc.y=core.status.hero.loc.y; + } } if (core.status.maps[floorId].canFlyTo && core.status.hero.flyRange.indexOf(floorId)<0) { if (core.floorIds.indexOf(floorId)>core.floorIds.indexOf(core.status.floorId)) @@ -1606,6 +1619,7 @@ core.prototype.changeFloor = function (floorId, stair, heroLoc, time, callback) // 根据文字判断是否斜体 var floorName = core.status.maps[floorId].name; + if (!core.isset(floorName) || floorName=="") floorName=" " core.statusBar.floor.innerHTML = floorName; if (/^[+-]?\d+$/.test(floorName)) core.statusBar.floor.style.fontStyle = 'italic'; @@ -3182,6 +3196,11 @@ core.prototype.getStatus = function (statusName) { return core.status.hero[statusName]; } +core.prototype.getLvName = function () { + if (core.status.hero.lv>core.firstData.levelUp.length) return core.status.hero.lv; + return core.firstData.levelUp[core.status.hero.lv-1].name || core.status.hero.lv; +} + core.prototype.setFlag = function(flag, value) { if (!core.isset(core.status.hero)) return; core.status.hero.flags[flag]=value; @@ -3302,9 +3321,9 @@ core.prototype.hide = function (obj, speed, callback) { ////// 状态栏相关 ////// core.prototype.clearStatusBar = function() { - var statusList = ['floor', 'hp', 'atk', 'def', 'mdef', 'money', 'experience', 'yellowKey', 'blueKey', 'redKey', 'poison', 'weak', 'curse', 'hard']; + var statusList = ['floor', 'lv', 'hp', 'atk', 'def', 'mdef', 'money', 'experience', 'up', 'yellowKey', 'blueKey', 'redKey', 'poison', 'weak', 'curse', 'hard']; statusList.forEach(function (e) { - core.statusBar[e].innerHTML = ""; + core.statusBar[e].innerHTML = " "; }); core.statusBar.image.book.style.opacity = 0.3; core.statusBar.image.fly.style.opacity = 0.3; @@ -3320,6 +3339,12 @@ core.prototype.updateStatusBar = function () { core.setStatus('hp', Math.min(core.values.HPMAX, core.getStatus('hp'))); } + var lvName = core.getLvName(); + core.statusBar.lv.innerHTML = lvName; + if (/^[+-]?\d+$/.test(lvName)) + core.statusBar.lv.style.fontStyle = 'italic'; + else core.statusBar.lv.style.fontStyle = 'normal'; + var statusList = ['hp', 'atk', 'def', 'mdef', 'money', 'experience']; statusList.forEach(function (item) { core.statusBar[item].innerHTML = core.getStatus(item); @@ -3376,18 +3401,22 @@ core.prototype.resize = function(clientWidth, clientHeight) { statusWidth, statusHeight, statusMaxWidth,statusLabelsLH, toolBarWidth, toolBarHeight, toolBarTop, toolBarBorder, toolsWidth, toolsHeight,toolsMargin,toolsPMaxwidth, - fontSize, margin; + fontSize, toolbarFontSize, margin; - var count = 9; + var count = 11; + if (!core.flags.enableFloor) count--; + if (!core.flags.enableLv) count--; if (!core.flags.enableMDef) count--; + if (!core.flags.enableMoney) count--; if (!core.flags.enableExperience) count--; + if (!core.flags.enableLevelUp) count--; if (!core.flags.enableDebuff) count--; - var statusLineHeight = BASE_LINEHEIGHT * 9/count; + var statusLineHeight = BASE_LINEHEIGHT * 9 / count; + var statusLineFontSize = DEFAULT_FONT_SIZE; + if (count>9) statusLineFontSize = statusLineFontSize * 9 / count; - var shopDisplay, mdefDisplay, expDisplay; - mdefDisplay = core.flags.enableMDef ? 'block' : 'none'; - expDisplay = core.flags.enableExperience ? 'block' : 'none'; + var shopDisplay; statusBarBorder = '3px #fff solid'; toolBarBorder = '3px #fff solid'; @@ -3407,13 +3436,13 @@ core.prototype.resize = function(clientWidth, clientHeight) { var scale = core.domStyle.scale var tempWidth = DEFAULT_CANVAS_WIDTH * scale; - fontSize = DEFAULT_FONT_SIZE * scale; if(!isHorizontal){ //竖屏 core.domStyle.screenMode = 'vertical'; //显示快捷商店图标 shopDisplay = 'block'; //判断应该显示几行 - var col = core.flags.enableMDef || core.flags.enableExperience || core.flags.enableDebuff ? 3 : 2; + // var col = core.flags.enableMDef || core.flags.enableExperience || core.flags.enableDebuff ? 3 : 2; + var col = parseInt((count-1)/3)+1; var tempTopBarH = scale * (BASE_LINEHEIGHT * col + SPACE * 2) + 6; var tempBotBarH = scale * (BASE_LINEHEIGHT + SPACE * 4) + 6; @@ -3440,6 +3469,8 @@ core.prototype.resize = function(clientWidth, clientHeight) { margin = scale * SPACE * 2; toolsMargin = scale * SPACE * 4; + fontSize = DEFAULT_FONT_SIZE * scale; + toolbarFontSize = DEFAULT_FONT_SIZE * scale; }else { //横屏 core.domStyle.screenMode = 'horizontal'; shopDisplay = 'none'; @@ -3457,6 +3488,8 @@ core.prototype.resize = function(clientWidth, clientHeight) { toolBarTop = scale*statusLineHeight * count + SPACE * 2; toolBarBorder = '3px #fff solid'; toolsHeight = scale * BASE_LINEHEIGHT; + fontSize = statusLineFontSize * scale; + toolbarFontSize = DEFAULT_FONT_SIZE * scale; borderRight = ''; statusMaxWidth = scale * DEFAULT_BAR_WIDTH; toolsPMaxwidth = scale * DEFAULT_BAR_WIDTH; @@ -3486,7 +3519,8 @@ core.prototype.resize = function(clientWidth, clientHeight) { toolsHeight = BASE_LINEHEIGHT; borderRight = ''; - fontSize = DEFAULT_FONT_SIZE; + fontSize = statusLineFontSize; + toolbarFontSize = DEFAULT_FONT_SIZE; statusMaxWidth = DEFAULT_BAR_WIDTH; toolsPMaxwidth = DEFAULT_BAR_WIDTH * .9; margin = SPACE * 2; @@ -3511,8 +3545,6 @@ core.prototype.resize = function(clientWidth, clientHeight) { height: canvasWidth + unit, top: canvasTop + unit, right: 0, - // left: canvasLeft + unit, - border: '3px #fff solid', } }, @@ -3576,7 +3608,7 @@ core.prototype.resize = function(clientWidth, clientHeight) { borderBottom: toolBarBorder, borderLeft: toolBarBorder, borderRight: borderRight, - fontSize: fontSize + unit + fontSize: toolbarFontSize + unit } }, { @@ -3595,15 +3627,45 @@ core.prototype.resize = function(clientWidth, clientHeight) { } }, { - id: 'expCol', + id: 'floorCol', rules: { - display: expDisplay + display: core.flags.enableFloor ? 'block': 'none' + } + }, + { + id: 'lvCol', + rules: { + display: core.flags.enableLv ? 'block': 'none' } }, { id: 'mdefCol', rules: { - display: mdefDisplay + display: core.flags.enableMDef ? 'block': 'none' + } + }, + { + id: 'moneyCol', + rules: { + display: core.flags.enableMoney ? 'block': 'none' + } + }, + { + id: 'expCol', + rules: { + display: core.flags.enableExperience ? 'block': 'none' + } + }, + { + id: 'upCol', + rules: { + display: core.flags.enableLevelUp ? 'block': 'none' + } + }, + { + 'id': 'debuffCol', + rules: { + display: core.flags.enableDebuff ? 'block': 'none' } }, { diff --git a/libs/data.js b/libs/data.js index fecc718c..ce9176a9 100644 --- a/libs/data.js +++ b/libs/data.js @@ -10,12 +10,13 @@ data.prototype.init = function() { "floorId": "sample0", // 初始楼层ID "hero": { // 勇士初始数据 "name": "阳光", // 勇士名;可以改成喜欢的 + 'lv': 1, // 初始等级,该项必须为正整数 "hp": 1000, // 初始生命值 "atk": 100, // 初始攻击 "def": 100, // 初始防御 "mdef": 100, // 初始魔防 "money": 100, // 初始金币 - "experience": 1000, // 初始经验 + "experience": 0, // 初始经验 "items": { // 初始道具个数 "keys": { "yellowKey": 0, @@ -57,10 +58,11 @@ data.prototype.init = function() { {"text": "防御+4", "effect": "status:def+=4"}, {"text": "魔防+10", "effect": "status:mdef+=10"} // effect只能对status和item进行操作,不能修改flag值。 - // 中间只能用+=符号(也就是只能增加某个属性或道具) + // 必须是X+=Y的形式,其中Y可以是一个表达式,以status:xxx或item:xxx为参数 // 其他effect样例: // "item:yellowKey+=1" 黄钥匙+1 // "item:pickaxe+=3" 破墙镐+3 + // "status:hp+=2*(status:atk+status:def)" 将生命提升攻防和的数值的两倍 ] }, "expShop1": { // 商店唯一ID @@ -80,6 +82,17 @@ data.prototype.init = function() { ] }, }, + "levelUp": [ // 经验升级所需要的数值,是一个数组 + {}, // 第一项为初始等级,可以简单留空,也可以写name + {"need": 20, "name": "第二级", "effect": "status:hp+=2*(status:atk+status:def);status:atk+=10;status:def+=10"}, // 先将生命提升攻防和的2倍;再将攻击+10,防御+10 + // 每一个里面可以含有三个参数 name, need, effect + // need为所需要的经验数值,是一个正整数。请确保need所需的依次递增 + // name为该等级的名称,也可以省略代表使用系统默认值;本项将显示在状态栏中 + // effect为本次升级所执行的操作,可由若干项组成,由分号分开; + // 其中每一项写法和上面的商店完全相同,同样必须是X+=Y的形式,Y是一个表达式,同样可以使用status:xxx或item:xxx代表勇士的某项数值/道具个数 + {"need": 40, "effect": "status:hp+=2*(status:atk+status:def);status:atk+=10;status:def+=10"}, + // 依次往下写需要的数值即可 + ] } // 各种数值;一些数值可以在这里设置 this.values = { @@ -118,9 +131,15 @@ data.prototype.init = function() { // 系统FLAG,在游戏运行中中请不要修改它。 this.flags = { /****** 角色状态相关 ******/ - "enableMDef": true, // 是否涉及勇士的魔防值;如果此项为false,则状态栏不会显示勇士的魔防值 - "enableExperience": true, // 是否涉及经验值;如果此项为false,则状态栏和怪物手册均将不会显示经验值 + "enableNegativeDamage": true, // 是否支持负伤害(回血) + "enableFloor": true, // 是否在状态栏显示当前楼层 + "enableLv": false, // 是否在状态栏显示当前等级 + "enableMDef": true, // 是否在状态栏及战斗界面显示魔防(护盾) + "enableMoney": true, // 是否在状态栏、怪物手册及战斗界面显示金币 + "enableExperience": true, // 是否在状态栏、怪物手册及战斗界面显示经验 + "enableLevelUp": false, // 是否允许等级提升(进阶);如果上面enableExperience为false,则此项恒视为false "enableDebuff": true, // 是否涉及毒衰咒;如果此项为false则不会在状态栏中显示毒衰咒的debuff + ////// 上述的几个开关将直接影响状态栏的显示效果 ////// /****** 道具相关 ******/ "flyNearStair": true, // 是否需要在楼梯边使用传送器 "pickaxeFourDirections": true, // 使用破墙镐是否四个方向都破坏;如果false则只破坏面前的墙壁 diff --git a/libs/enemys.js b/libs/enemys.js index 3b28b06e..05eba39b 100644 --- a/libs/enemys.js +++ b/libs/enemys.js @@ -131,7 +131,7 @@ enemys.prototype.getCritical = function (monsterId) { if (this.hasSpecial(monster.special, 3) || this.hasSpecial(monster.special, 10)) return "???"; var last = this.calDamage(core.status.hero.atk, core.status.hero.def, core.status.hero.mdef, monster.hp, monster.atk, monster.def, monster.special); - if (last == 0) return 0; + if (last <= 0) return 0; for (var i = core.status.hero.atk + 1; i <= monster.hp + monster.def; i++) { var damage = this.calDamage(i, core.status.hero.def, core.status.hero.mdef, @@ -147,9 +147,8 @@ enemys.prototype.getCritical = function (monsterId) { enemys.prototype.getCriticalDamage = function (monsterId) { var c = this.getCritical(monsterId); if (c == '???') return '???'; - if (c == 0) return 0; + if (c <= 0) return 0; var monster = core.material.enemys[monsterId]; - // if (c<=0) return 0; var last = this.calDamage(core.status.hero.atk, core.status.hero.def, core.status.hero.mdef, monster.hp, monster.atk, monster.def, monster.special); if (last == 999999999) return '???'; @@ -202,11 +201,7 @@ enemys.prototype.calDamage = function (hero_atk, hero_def, hero_mdef, mon_hp, mo var ans = damage + turn * per_damage + (turn + 1) * counterDamage; ans -= hero_mdef; - // 魔防回血 - // return ans; - - // 魔防不回血 - return ans <= 0 ? 0 : ans; + return core.flags.enableNegativeDamage?ans:Math.max(0, ans); } // 获得当前楼层的怪物列表 diff --git a/libs/events.js b/libs/events.js index 59ac6553..6ff86ca0 100644 --- a/libs/events.js +++ b/libs/events.js @@ -20,12 +20,11 @@ events.prototype.init = function () { callback(); }, 'changeFloor': function (data, core, callback) { - var heroLoc = null; - if (core.isset(data.event.data.loc)) { + var heroLoc = {}; + if (core.isset(data.event.data.loc)) heroLoc = {'x': data.event.data.loc[0], 'y': data.event.data.loc[1]}; - if (core.isset(data.event.data.direction)) - heroLoc.direction = data.event.data.direction; - } + if (core.isset(data.event.data.direction)) + heroLoc.direction = data.event.data.direction; core.changeFloor(data.event.data.floorId, data.event.data.stair, heroLoc, data.event.data.time, callback); }, @@ -66,14 +65,6 @@ events.prototype.startGame = function (hard) { core.hideStartAnimate(function() { core.drawText(core.clone(core.firstData.startText), function() { - - // 强制关闭战斗过程? - if (!core.flags.canOpenBattleAnimate) { - core.flags.showBattleAnimateConfirm=false; - core.flags.battleAnimate=false; - core.setLocalStorage('battleAnimate', false); - } - if (core.flags.showBattleAnimateConfirm) { // 是否提供“开启战斗动画”的选择项 core.status.event.selection = core.flags.battleAnimate ? 0 : 1; core.ui.drawConfirmBox("你想开启战斗动画吗?\n之后可以在菜单栏中开启或关闭。\n(强烈建议新手开启此项)", function () { diff --git a/libs/floors/sample1.js b/libs/floors/sample1.js index bc23f241..b28c41d1 100644 --- a/libs/floors/sample1.js +++ b/libs/floors/sample1.js @@ -4,7 +4,7 @@ main.floors.sample1 = { "floorId": "sample1", // 楼层唯一标识符,需要和名字完全一致 "title": "样板 1 层", // 楼层中文名 - "name": "样板1层", // 显示在状态栏中的层数 + "name": "1", // 显示在状态栏中的层数 "canFlyTo": true, // 该楼能否被楼传器飞到(不能的话在该楼也不允许使用楼传器) "canUseQuickShop": true, // 该层是否允许使用快捷商店 "defaultGround": "grass", // 默认地面的图块ID(terrains中) @@ -273,7 +273,7 @@ main.floors.sample1 = { }, "changeFloor": { // 楼层转换事件;该事件不能和上面的events有冲突(同位置点),否则会被覆盖 "4,12": {"floorId": "sample0", "loc": [6,0]}, // 由于楼下有多个上楼梯,所以需指定位置而不是简单地写"stair": "upFloor" - "5,5": {"floorId": "sample2", "stair": "downFloor"} + "5,5": {"floorId": "sample2", "stair": "downFloor", "direction": "up"} }, "afterBattle": { // 战斗后可能触发的事件列表 "9,6": [ // 初级卫兵1 diff --git a/libs/floors/sample2.js b/libs/floors/sample2.js index 4c569e37..32d227ff 100644 --- a/libs/floors/sample2.js +++ b/libs/floors/sample2.js @@ -4,7 +4,7 @@ main.floors.sample2 = { "floorId": "sample2", // 楼层唯一标识符,需要和名字完全一致 "title": "主塔 40 层", // 楼层中文名 - "name": "-40", // 显示在状态栏中的层数 + "name": "40", // 显示在状态栏中的层数 "canFlyTo": false, // 该楼能否被楼传器飞到(不能的话在该楼也不允许使用楼传器) "canUseQuickShop": true, // 该层是否允许使用快捷商店 "defaultGround": "snowGround", // 默认地面的图块ID(terrains中) diff --git a/libs/ui.js b/libs/ui.js index 2911de16..62ef59e8 100644 --- a/libs/ui.js +++ b/libs/ui.js @@ -430,7 +430,10 @@ ui.prototype.drawBattleAnimate = function(monsterId, callback) { var left=10, right=416-2*left; - var lines = core.flags.enableExperience?5:4; + // var lines = core.flags.enableExperience?5:4; + var lines = 3; + if (core.flags.enableMDef || core.flags.enableMoney || core.flags.enableExperience) lines=4; + if (core.flags.enableMoney && core.flags.enableExperience) lines=5; var lineHeight = 60; var height = lineHeight * lines + 50; @@ -515,7 +518,7 @@ ui.prototype.drawBattleAnimate = function(monsterId, callback) { if (core.flags.enableMDef) { textTop += lineHeight; core.canvas.ui.textAlign='left'; - core.fillText('ui', "魔防", left_start, textTop, '#DDDDDD', '16px Verdana'); + core.fillText('ui', "护盾", left_start, textTop, '#DDDDDD', '16px Verdana'); core.drawLine('ui', left_start, textTop + 8, left_end, textTop + 8, '#FFFFFF', 2); core.canvas.data.textAlign='right'; core.fillText('data', hero_mdef, left_end, textTop+26, '#DDDDDD', 'bold 16px Verdana'); @@ -543,12 +546,14 @@ ui.prototype.drawBattleAnimate = function(monsterId, callback) { core.canvas.ui.textAlign='left'; core.fillText('ui', mon_def, right_start, textTop+26, '#DDDDDD', 'bold 16px Verdana'); - textTop += lineHeight; - core.canvas.ui.textAlign='right'; - core.fillText('ui', "金币", right_end, textTop, '#DDDDDD', '16px Verdana'); - core.drawLine('ui', right_start, textTop + 8, right_end, textTop + 8, '#FFFFFF', 2); - core.canvas.ui.textAlign='left'; - core.fillText('ui', mon_money, right_start, textTop+26, '#DDDDDD', 'bold 16px Verdana'); + if (core.flags.enableMoney) { + textTop += lineHeight; + core.canvas.ui.textAlign = 'right'; + core.fillText('ui', "金币", right_end, textTop, '#DDDDDD', '16px Verdana'); + core.drawLine('ui', right_start, textTop + 8, right_end, textTop + 8, '#FFFFFF', 2); + core.canvas.ui.textAlign = 'left'; + core.fillText('ui', mon_money, right_start, textTop + 26, '#DDDDDD', 'bold 16px Verdana'); + } if (core.flags.enableExperience) { textTop += lineHeight; @@ -564,12 +569,6 @@ ui.prototype.drawBattleAnimate = function(monsterId, callback) { core.canvas.ui.textAlign='right'; core.fillText("ui", "S", right_start-8, 208+15, "#FFFFFF", "italic bold 40px Verdana"); -/* - core.drawLine('data', left + right - margin - boxWidth + 6, top+margin+boxWidth-6, - left+right-margin-6, top+margin+6, '#FF0000', 4); - core.drawLine('data', left + margin + 6, top+margin+heroHeight+(boxWidth-32)-6, - left+margin+boxWidth-6, top+margin+6, '#FF0000', 4); -*/ var battleInterval = setInterval(function() { core.playSound("attack", "ogg"); @@ -797,25 +796,34 @@ ui.prototype.drawEnemyBook = function (page) { core.fillText('ui', enemy.atk, 285, 62 * i + 32, '#DDDDDD', 'bold 13px Verdana'); core.fillText('ui', '防御', 335, 62 * i + 32, '#DDDDDD', '13px Verdana'); core.fillText('ui', enemy.def, 365, 62 * i + 32, '#DDDDDD', 'bold 13px Verdana'); - core.fillText('ui', '金币', 165, 62 * i + 50, '#DDDDDD', '13px Verdana'); - core.fillText('ui', enemy.money, 195, 62 * i + 50, '#DDDDDD', 'bold 13px Verdana'); - var damage_offset = 326; + var expOffset = 165; + if (core.flags.enableMoney) { + core.fillText('ui', '金币', 165, 62 * i + 50, '#DDDDDD', '13px Verdana'); + core.fillText('ui', enemy.money, 195, 62 * i + 50, '#DDDDDD', 'bold 13px Verdana'); + expOffset = 255; + } + if (core.flags.enableExperience) { core.canvas.ui.textAlign = "left"; - core.fillText('ui', '经验', 255, 62 * i + 50, '#DDDDDD', '13px Verdana'); - core.fillText('ui', enemy.experience, 285, 62 * i + 50, '#DDDDDD', 'bold 13px Verdana'); - damage_offset = 361; + core.fillText('ui', '经验', expOffset, 62 * i + 50, '#DDDDDD', '13px Verdana'); + core.fillText('ui', enemy.experience, expOffset + 30, 62 * i + 50, '#DDDDDD', 'bold 13px Verdana'); } + var damageOffet = 281; + if (core.flags.enableMoney && core.flags.enableExperience) + damageOffet = 361; + else if (core.flags.enableMoney || core.flags.enableExperience) + damageOffet = 326; + + core.canvas.ui.textAlign = "center"; var damage = enemy.damage; var color = '#FFFF00'; if (damage >= core.status.hero.hp) color = '#FF0000'; - if (damage == 0) color = '#00FF00'; + if (damage <= 0) color = '#00FF00'; if (damage >= 999999999) damage = '无法战斗'; - var length = core.canvas.ui.measureText(damage).width; - core.fillText('ui', damage, damage_offset, 62 * i + 50, color, 'bold 13px Verdana'); + core.fillText('ui', damage, damageOffet, 62 * i + 50, color, 'bold 13px Verdana'); core.canvas.ui.textAlign = "left"; diff --git a/main.js b/main.js index 8edd46bf..91194798 100644 --- a/main.js +++ b/main.js @@ -31,8 +31,13 @@ function main() { 'hardLevel': document.getElementById('hardLevel'), 'data': document.getElementById('data'), 'statusLabels': document.getElementsByClassName('statusLabel'), + 'floorCol': document.getElementById('floorCol'), + 'lvCol': document.getElementById('lvCol'), 'mdefCol': document.getElementById('mdefCol'), + 'moneyCol': document.getElementById('moneyCol'), 'expCol': document.getElementById('expCol'), + 'upCol': document.getElementById('upCol'), + 'debuffCol': document.getElementById('debuffCol'), 'hard': document.getElementById('hard'), }; this.loadList = [ @@ -49,12 +54,14 @@ function main() { this.statusBar = { 'image': { 'floor': document.getElementById('img-floor'), + 'lv': document.getElementById('img-lv'), 'hp': document.getElementById("img-hp"), 'atk': document.getElementById("img-atk"), 'def': document.getElementById("img-def"), 'mdef': document.getElementById("img-mdef"), 'money': document.getElementById("img-money"), 'experience': document.getElementById("img-experience"), + 'up': document.getElementById("img-up"), 'book': document.getElementById("img-book"), 'fly': document.getElementById("img-fly"), 'toolbox': document.getElementById("img-toolbox"), @@ -64,12 +71,14 @@ function main() { 'settings': document.getElementById("img-settings") }, 'floor': document.getElementById('floor'), + 'lv': document.getElementById('lv'), 'hp': document.getElementById('hp'), 'atk': document.getElementById('atk'), 'def': document.getElementById("def"), 'mdef': document.getElementById('mdef'), 'money': document.getElementById("money"), 'experience': document.getElementById("experience"), + 'up': document.getElementById('up'), 'yellowKey': document.getElementById("yellowKey"), 'blueKey': document.getElementById("blueKey"), 'redKey': document.getElementById("redKey"), diff --git a/styles.css b/styles.css index 2c5ebf9d..6523b3b8 100644 --- a/styles.css +++ b/styles.css @@ -180,8 +180,9 @@ } .status img{ vertical-align: middle; - width: 1.6em; - height: 1.6em; + width: auto; + height: 100%; + max-height: 1.6em; } #statusBar span{ color: white; diff --git a/更新说明.txt b/更新说明.txt index cd4e1ea0..af8b3f58 100644 --- a/更新说明.txt +++ b/更新说明.txt @@ -1,8 +1,10 @@ 全键盘操作 √ Ctrl快速跳过对话 √ +增加负伤 √ 支持不同层使用不同的地面素材 √ 支持多个Autotile同时存在 √ 直接内嵌了诸多默认的terrains素材 √ 自动定位到上次存/读档位置 √ 设置储存 √ 修改setFg的实现方法 √ +大范围领域伤害 \ No newline at end of file From 68f0a28a61e47ec6f6e36bca214fa5d46ebf5c0a Mon Sep 17 00:00:00 2001 From: oc Date: Thu, 28 Dec 2017 09:17:35 +0800 Subject: [PATCH 07/25] Enable Level Up --- libs/core.js | 56 ++++++++++++++++++++++++++++++++++++++++----- libs/data.js | 27 ++++++++++++++-------- libs/enemys.js | 2 +- libs/events.js | 8 +------ libs/floors/MT0.js | 2 +- libs/floors/test.js | 45 ++++++++++++++++++++++++++++++++++++ main.js | 2 +- 7 files changed, 117 insertions(+), 25 deletions(-) create mode 100644 libs/floors/test.js diff --git a/libs/core.js b/libs/core.js index 58e84441..fb84f7b0 100644 --- a/libs/core.js +++ b/libs/core.js @@ -1537,12 +1537,11 @@ core.prototype.afterBattle = function(id, x, y, callback) { var experience = core.material.enemys[id].experience; if (core.hasFlag('curse')) experience=0; core.status.hero.experience += experience; - core.updateStatusBar(); if (core.isset(x) && core.isset(y)) { core.removeBlock(x, y); core.canvas.event.clearRect(32 * x, 32 * y, 32, 32); } - core.updateFg(); + // core.updateStatusBar(); var hint = "打败 " + core.material.enemys[id].name; if (core.flags.enableMoney) hint += ",金币+" + money; @@ -1625,7 +1624,6 @@ core.prototype.changeFloor = function (floorId, stair, heroLoc, time, callback) core.statusBar.floor.style.fontStyle = 'italic'; else core.statusBar.floor.style.fontStyle = 'normal'; - core.updateStatusBar(); core.drawMap(floorId, function () { setTimeout(function() { core.mapChangeAnimate('hide', time/4, function () { @@ -1638,9 +1636,10 @@ core.prototype.changeFloor = function (floorId, stair, heroLoc, time, callback) core.setHeroLoc('x', heroLoc.x); core.setHeroLoc('y', heroLoc.y); core.drawHero(core.getHeroLoc('direction'), core.getHeroLoc('x'), core.getHeroLoc('y'), 'stop'); - core.updateCheckBlockMap(); - core.updateCheckBlock(); - core.updateFg(); + core.updateStatusBar(); + // core.updateCheckBlockMap(); + // core.updateCheckBlock(); + // core.updateFg(); }, 15) }); }); @@ -2783,6 +2782,21 @@ core.prototype.calValue = function (value) { return eval(value); } +core.prototype.doEffect = function (expression) { + // 必须使用"+=" + var arr = expression.split("+="); + if (arr.length!=2) return; + var name=arr[0], value=core.calValue(arr[1]); + if (name.indexOf("status:")==0) { + var status=name.substring(7); + core.setStatus(status, core.getStatus(status)+value); + } + else if (name.indexOf("item:")==0) { + var itemId=name.substring(5); + core.setItem(itemId, core.itemCount(itemId)+value); + } +} + core.prototype.splitLines = function(canvas, text, maxLength, font) { if (core.isset(font)) core.setFont(canvas, font); @@ -3334,6 +3348,9 @@ core.prototype.clearStatusBar = function() { */ core.prototype.updateStatusBar = function () { + // 检查登记 + core.checkLvUp(); + // 上限999999 if (core.values.HPMAX>0) { core.setStatus('hp', Math.min(core.values.HPMAX, core.getStatus('hp'))); @@ -3349,6 +3366,12 @@ core.prototype.updateStatusBar = function () { statusList.forEach(function (item) { core.statusBar[item].innerHTML = core.getStatus(item); }); + // 进阶 + if (core.flags.enableLevelUp && core.status.hero.lv=core.firstData.levelUp.length) return; + // 计算下一个所需要的数值 + var need=core.firstData.levelUp[core.status.hero.lv].need; + if (!core.isset(need)) return; + if (core.status.hero.experience>=need) { + // 升级 + core.status.hero.lv++; + var effect = core.firstData.levelUp[core.status.hero.lv-1].effect; + if (typeof effect == "string") { + effect.split(";").forEach(function (t) { + core.doEffect(t); + }); + } + else if (effect instanceof Function) { + effect(); + } + core.checkLvUp(); + } +} + core.prototype.resize = function(clientWidth, clientHeight) { // 默认画布大小 diff --git a/libs/data.js b/libs/data.js index ce9176a9..a7bc1d6b 100644 --- a/libs/data.js +++ b/libs/data.js @@ -7,7 +7,7 @@ data.prototype.init = function() { "title": "魔塔样板", // 游戏名,将显示在标题页面以及切换楼层的界面中 "name": "template", // 游戏的唯一英文标识符。由英文、数字、下划线组成,不能超过20个字符。 "version": "Ver 1.0.0 (Beta)", // 当前游戏版本;版本不一致的存档不能通用。 - "floorId": "sample0", // 初始楼层ID + "floorId": "test", // 初始楼层ID "hero": { // 勇士初始数据 "name": "阳光", // 勇士名;可以改成喜欢的 'lv': 1, // 初始等级,该项必须为正整数 @@ -27,7 +27,7 @@ data.prototype.init = function() { "tools": {} }, "flyRange": [], // 初始可飞的楼层;一般留空数组即可 - "loc": {"direction": "up", "x": 6, "y": 10}, // 勇士初始位置 + "loc": {"direction": "up", "x": 6, "y": 12}, // 勇士初始位置 "flags": { // 游戏过程中的变量或flags "poison": false, // 毒 "weak": false, // 衰 @@ -84,13 +84,22 @@ data.prototype.init = function() { }, "levelUp": [ // 经验升级所需要的数值,是一个数组 {}, // 第一项为初始等级,可以简单留空,也可以写name - {"need": 20, "name": "第二级", "effect": "status:hp+=2*(status:atk+status:def);status:atk+=10;status:def+=10"}, // 先将生命提升攻防和的2倍;再将攻击+10,防御+10 + // 每一个里面可以含有三个参数 name, need, effect // need为所需要的经验数值,是一个正整数。请确保need所需的依次递增 // name为该等级的名称,也可以省略代表使用系统默认值;本项将显示在状态栏中 - // effect为本次升级所执行的操作,可由若干项组成,由分号分开; + // effect为本次升级所执行的操作,可由若干项组成,由分号分开 // 其中每一项写法和上面的商店完全相同,同样必须是X+=Y的形式,Y是一个表达式,同样可以使用status:xxx或item:xxx代表勇士的某项数值/道具个数 - {"need": 40, "effect": "status:hp+=2*(status:atk+status:def);status:atk+=10;status:def+=10"}, + {"need": 20, "name": "第二级", "effect": "status:hp+=2*(status:atk+status:def);status:atk+=10;status:def+=10"}, // 先将生命提升攻防和的2倍;再将攻击+10,防御+10 + + // effect也允许写一个function,代表本次升级将会执行的操作 + {"need": 40, "effect": function () { + core.drawText("恭喜升级!"); + core.status.hero.hp *= 2; + core.status.hero.atk += 100; + core.status.hero.def += 100; + }}, + // 依次往下写需要的数值即可 ] } @@ -132,13 +141,13 @@ data.prototype.init = function() { this.flags = { /****** 角色状态相关 ******/ "enableNegativeDamage": true, // 是否支持负伤害(回血) - "enableFloor": true, // 是否在状态栏显示当前楼层 - "enableLv": false, // 是否在状态栏显示当前等级 + "enableFloor": false, // 是否在状态栏显示当前楼层 + "enableLv": true, // 是否在状态栏显示当前等级 "enableMDef": true, // 是否在状态栏及战斗界面显示魔防(护盾) "enableMoney": true, // 是否在状态栏、怪物手册及战斗界面显示金币 "enableExperience": true, // 是否在状态栏、怪物手册及战斗界面显示经验 - "enableLevelUp": false, // 是否允许等级提升(进阶);如果上面enableExperience为false,则此项恒视为false - "enableDebuff": true, // 是否涉及毒衰咒;如果此项为false则不会在状态栏中显示毒衰咒的debuff + "enableLevelUp": true, // 是否允许等级提升(进阶);如果上面enableExperience为false,则此项恒视为false + "enableDebuff": false, // 是否涉及毒衰咒;如果此项为false则不会在状态栏中显示毒衰咒的debuff ////// 上述的几个开关将直接影响状态栏的显示效果 ////// /****** 道具相关 ******/ "flyNearStair": true, // 是否需要在楼梯边使用传送器 diff --git a/libs/enemys.js b/libs/enemys.js index 05eba39b..f236d68d 100644 --- a/libs/enemys.js +++ b/libs/enemys.js @@ -5,7 +5,7 @@ function enemys() { enemys.prototype.init = function () { // 怪物属性初始化定义: this.enemys = { - 'greenSlime': {'name': '绿头怪', 'hp': 100, 'atk': 120, 'def': 0, 'money': 1, 'experience': 0, 'special': 0}, + 'greenSlime': {'name': '绿头怪', 'hp': 100, 'atk': 120, 'def': 0, 'money': 1, 'experience': 1, 'special': 0}, 'redSlime': {'name': '红头怪', 'hp': 0, 'atk': 0, 'def': 0, 'money': 0, 'experience': 0, 'special': 0}, 'blackSlime': {'name': '青头怪', 'hp': 0, 'atk': 0, 'def': 0, 'money': 0, 'experience': 0, 'special': 0}, 'slimelord': {'name': '怪王', 'hp': 100, 'atk': 120, 'def': 0, 'money': 10, 'experience': 0, 'special': 9}, diff --git a/libs/events.js b/libs/events.js index 6ff86ca0..26d62ac6 100644 --- a/libs/events.js +++ b/libs/events.js @@ -329,7 +329,6 @@ events.prototype.doAction = function() { core.status.hero.hp=0; core.updateStatusBar(); core.events.lose('damage'); - } else { core.updateStatusBar(); @@ -817,12 +816,7 @@ events.prototype.clickShop = function(x,y) { // 更新属性 choice.effect.split(";").forEach(function (t) { - if (t.indexOf("status:")==0) { - eval(t.replace("status:", "core.status.hero.")); - } - else if (t.indexOf("item:")==0) { - eval(t.replace("item:", "core.getItem('").replace("+=", "', ")+")"); - } + core.doEffect(t); }); core.updateStatusBar(); shop.times++; diff --git a/libs/floors/MT0.js b/libs/floors/MT0.js index a267cd1e..c8d90ad4 100644 --- a/libs/floors/MT0.js +++ b/libs/floors/MT0.js @@ -4,7 +4,7 @@ main.floors.MT0 = { "floorId": "MT0", // 楼层唯一标识符,需要和名字完全一致 "title": "主塔 0 层", // 楼层中文名 - "name": 0, // 显示在状态栏中的层数 + "name": "0", // 显示在状态栏中的层数 "canFlyTo": true, // 该楼能否被楼传器飞到(不能的话在该楼也不允许使用楼传器) "canUseQuickShop": true, // 该层是否允许使用快捷商店 "defaultGround": "ground", // 默认地面的图块ID(terrains中) diff --git a/libs/floors/test.js b/libs/floors/test.js new file mode 100644 index 00000000..c125ab71 --- /dev/null +++ b/libs/floors/test.js @@ -0,0 +1,45 @@ +// 这里需要改楼层名,请和文件名及下面的floorId保持完全一致 +// 楼层唯一标识符仅能由字母、数字、下划线组成,且不能由数字开头 +// 推荐用法:第20层就用MT20,第38层就用MT38,地下6层就用MT_6(用下划线代替负号),隐藏3层用MT3h(h表示隐藏),等等 +main.floors.test = { + "floorId": "test", // 楼层唯一标识符,需要和名字完全一致 + "title": "test", // 楼层中文名 + "name": "", // 显示在状态栏中的层数 + "canFlyTo": true, // 该楼能否被楼传器飞到(不能的话在该楼也不允许使用楼传器) + "canUseQuickShop": true, // 该层是否允许使用快捷商店 + "defaultGround": "ground", // 默认地面的图块ID(terrains中) + "map": [ // 地图数据,需要是13x13,建议使用地图生成器来生成 + [201,201,201,201,201,201,201,201,201,201,201,201,201], + [201,201,201,201,201,201,201,201,201,201,201,201,201], + [201,201,201,201,201,201,201,201,201,201,201,201,201], + [201,201,201,201,201,201,201,201,201,201,201,201,201], + [201,201,201,201,201,201,201,201,201,201,201,201,201], + [201,201,201,201,201,201,201,201,201,201,201,201,201], + [201,201,201,201,201,201,201,201,201,201,201,201,201], + [201,201,201,201,201,201,201,201,201,201,201,201,201], + [201,201,201,201,201,201,201,201,201,201,201,201,201], + [201,201,201,201,201,201,201,201,201,201,201,201,201], + [201,201,201,201,201,201,201,201,201,201,201,201,201], + [201,201,201,201,201,201, 45,201,201,201,201,201,201], + [201,201,201,201,201,201, 0,201,201,201,201,201,201] + ], + "firstArrive": [ // 第一次到该楼层触发的事件 + + ], + "events": { // 该楼的所有可能事件列表 + + }, + "changeFloor": { // 楼层转换事件;该事件不能和上面的events有冲突(同位置点),否则会被覆盖 + + }, + "afterBattle": { // 战斗后可能触发的事件列表 + + }, + "afterGetItem": { // 获得道具后可能触发的事件列表 + + }, + "afterOpenDoor": { // 开完门后可能触发的事件列表 + + } +} + diff --git a/main.js b/main.js index 91194798..fe644e79 100644 --- a/main.js +++ b/main.js @@ -97,7 +97,7 @@ function main() { // 如果要进行剧本的修改请务必将其改成false。 this.floorIds = [ // 在这里按顺序放所有的楼层;其顺序直接影响到楼层传送器的顺序和上楼器/下楼器的顺序 - "sample0", "sample1", "sample2" + "sample0", "sample1", "sample2", "test" ] //------------------------ 用户修改内容 END ------------------------// From fc01f4333653b34b1538f597ca51497bf2883207 Mon Sep 17 00:00:00 2001 From: oc Date: Thu, 28 Dec 2017 09:20:16 +0800 Subject: [PATCH 08/25] Enable Level Up --- libs/data.js | 2 +- 更新说明.txt | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/libs/data.js b/libs/data.js index a7bc1d6b..426eca15 100644 --- a/libs/data.js +++ b/libs/data.js @@ -7,7 +7,7 @@ data.prototype.init = function() { "title": "魔塔样板", // 游戏名,将显示在标题页面以及切换楼层的界面中 "name": "template", // 游戏的唯一英文标识符。由英文、数字、下划线组成,不能超过20个字符。 "version": "Ver 1.0.0 (Beta)", // 当前游戏版本;版本不一致的存档不能通用。 - "floorId": "test", // 初始楼层ID + "floorId": "sample0", // 初始楼层ID "hero": { // 勇士初始数据 "name": "阳光", // 勇士名;可以改成喜欢的 'lv': 1, // 初始等级,该项必须为正整数 diff --git a/更新说明.txt b/更新说明.txt index af8b3f58..6e9cc527 100644 --- a/更新说明.txt +++ b/更新说明.txt @@ -1,4 +1,5 @@ 全键盘操作 √ +进阶 √ Ctrl快速跳过对话 √ 增加负伤 √ 支持不同层使用不同的地面素材 √ From b549a5fd19296edd12f4220cf6d35e5f1b4bc19b Mon Sep 17 00:00:00 2001 From: oc Date: Thu, 28 Dec 2017 09:23:46 +0800 Subject: [PATCH 09/25] Enable Level Up --- libs/data.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/libs/data.js b/libs/data.js index 426eca15..d8ad6961 100644 --- a/libs/data.js +++ b/libs/data.js @@ -27,7 +27,7 @@ data.prototype.init = function() { "tools": {} }, "flyRange": [], // 初始可飞的楼层;一般留空数组即可 - "loc": {"direction": "up", "x": 6, "y": 12}, // 勇士初始位置 + "loc": {"direction": "up", "x": 6, "y": 10}, // 勇士初始位置 "flags": { // 游戏过程中的变量或flags "poison": false, // 毒 "weak": false, // 衰 @@ -75,7 +75,7 @@ data.prototype.init = function() { "choices": [ // 在choices中写need,可以针对每个选项都有不同的需求。 // 这里的need同样可以以times作为参数,比如 "need": "100+20*times" - {"text": "等级+1", "need": "100", "effect": "status:hp+=1000;status:atk+=7;status:def+=7"}, + {"text": "等级+1", "need": "100", "effect": "status:lv+=1;status:hp+=1000;status:atk+=7;status:def+=7"}, // 多个effect直接以分号分开即可。如上面的意思是生命+1000,攻击+7,防御+7。 {"text": "攻击+5", "need": "30", "effect": "status:atk+=5"}, {"text": "防御+5", "need": "30", "effect": "status:def+=5"}, @@ -146,8 +146,8 @@ data.prototype.init = function() { "enableMDef": true, // 是否在状态栏及战斗界面显示魔防(护盾) "enableMoney": true, // 是否在状态栏、怪物手册及战斗界面显示金币 "enableExperience": true, // 是否在状态栏、怪物手册及战斗界面显示经验 - "enableLevelUp": true, // 是否允许等级提升(进阶);如果上面enableExperience为false,则此项恒视为false - "enableDebuff": false, // 是否涉及毒衰咒;如果此项为false则不会在状态栏中显示毒衰咒的debuff + "enableLevelUp": false, // 是否允许等级提升(进阶);如果上面enableExperience为false,则此项恒视为false + "enableDebuff": true, // 是否涉及毒衰咒;如果此项为false则不会在状态栏中显示毒衰咒的debuff ////// 上述的几个开关将直接影响状态栏的显示效果 ////// /****** 道具相关 ******/ "flyNearStair": true, // 是否需要在楼梯边使用传送器 From dab6656720ec5c70cf355864d1c87802bf77820b Mon Sep 17 00:00:00 2001 From: oc Date: Thu, 28 Dec 2017 12:08:01 +0800 Subject: [PATCH 10/25] =?UTF-8?q?=E9=A2=86=E5=9F=9F=E3=80=81=E5=A4=B9?= =?UTF-8?q?=E5=87=BB=E6=9C=BA=E5=88=B6=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- libs/core.js | 208 ++++++++++++++++++++++--------------------------- libs/data.js | 8 +- libs/enemys.js | 5 +- 3 files changed, 101 insertions(+), 120 deletions(-) diff --git a/libs/core.js b/libs/core.js index fb84f7b0..dfc681f3 100644 --- a/libs/core.js +++ b/libs/core.js @@ -57,7 +57,7 @@ function core() { 'floorId': null, 'thisMap': null, 'maps': null, - 'checkBlock': [], // 显伤伤害 + 'checkBlock': {}, // 显伤伤害 // 勇士状态;自动寻路相关 'heroMoving': false, @@ -1098,8 +1098,8 @@ core.prototype.automaticRoute = function (destX, destY) { // 绕过可能的夹击点 // if (nextBlock.block.event.trigger == 'checkBlock') deepAdd=200; } - if (core.status.checkBlock[nid]>0) - deepAdd = core.status.checkBlock[nid]; + if (core.status.checkBlock.damage[nid]>0) + deepAdd = core.status.checkBlock.damage[nid]; if (nx == destX && ny == destY) { route[nid] = direction; @@ -1270,9 +1270,9 @@ core.prototype.setHeroMoveTriggerInterval = function () { core.drawHero(core.getHeroLoc('direction'), core.getHeroLoc('x'), core.getHeroLoc('y'), 'stop'); } core.trigger(core.getHeroLoc('x'), core.getHeroLoc('y')); - core.checkBlock(); clearInterval(core.interval.heroMoveInterval); core.status.heroMoving = false; + core.checkBlock(); }); } }, 50); @@ -1549,7 +1549,6 @@ core.prototype.afterBattle = function(id, x, y, callback) { hint += ",经验+" + core.material.enemys[id].experience; core.drawTip(hint); - core.updateCheckBlockMap(); // 打完怪物,触发事件 core.events.afterBattle(id,x,y,callback); @@ -1637,9 +1636,6 @@ core.prototype.changeFloor = function (floorId, stair, heroLoc, time, callback) core.setHeroLoc('y', heroLoc.y); core.drawHero(core.getHeroLoc('direction'), core.getHeroLoc('x'), core.getHeroLoc('y'), 'stop'); core.updateStatusBar(); - // core.updateCheckBlockMap(); - // core.updateCheckBlock(); - // core.updateFg(); }, 15) }); }); @@ -2153,7 +2149,6 @@ core.prototype.addBlock = function(x,y,floodId) { // 本身是禁用事件,启用之 if (core.isset(block.enable) && !block.enable) { block.enable = true; - core.updateCheckBlockMap(); // 在本层,添加动画 if (floodId == core.status.floorId && core.isset(block.event)) { blockIcon = core.material.icons[block.event.cls][block.event.id]; @@ -2195,17 +2190,12 @@ core.prototype.removeBlockById = function (index, floorId) { if (!core.isset(event)) event = core.floors[floorId].changeFloor[x+","+y]; - var shouldUpdateBlockMap = blocks[index].event.cls == 'enemys'; // 不存在事件,直接删除 if (!core.isset(event)) { blocks.splice(index,1); - if (shouldUpdateBlockMap) - core.updateCheckBlockMap(); return; } blocks[index].enable = false; - if (shouldUpdateBlockMap) - core.updateCheckBlockMap(); } core.prototype.removeBlockByIds = function (floorId, ids) { @@ -2304,70 +2294,88 @@ core.prototype.drawBoxAnimate = function (background) { } } -core.prototype.updateCheckBlockMap = function() { - // 更新领域、夹击地图 - core.status.checkBlockMap = []; +// 更新领域、显伤 +core.prototype.updateCheckBlock = function() { + core.status.checkBlock = {}; + if (!core.isset(core.status.thisMap)) return; var blocks = core.status.thisMap.blocks; + + // Step1: 更新怪物地图 + core.status.checkBlock.map = []; // 记录怪物地图 for (var n=0;n12 || ny<0 || ny>12) continue; + if (!zoneSquare && Math.abs(dx)+Math.abs(dy)>range) continue; + core.status.checkBlock.damage[13*nx+ny]+=enemy.value; + } + } + } + // 存在阻击 + if (core.enemys.hasSpecial(enemy.special, 18)) { + } } } } -} -// 更新领域、显伤点 -core.prototype.updateCheckBlock = function() { - if (!core.isset(core.status.thisMap)) return; - if (!core.isset(core.status.checkBlockMap)) core.updateCheckBlockMap(); - core.status.checkBlock = []; + + // Step3: 更新夹击点坐标,并将夹击伤害加入到damage中 + core.status.checkBlock.betweenAttack = []; // 记录(x,y)点是否有夹击 for (var x=0;x<13;x++) { for (var y=0;y<13;y++) { - // 计算(x,y)点伤害 - var damage = 0; - if (!core.enemyExists(x,y)) { // 如果该点本身不存在怪物(打死怪物会调用更新) - - // 领域 - [[-1,0],[0,-1],[1,0],[0,1]].forEach(function (dir) { - var nx = x+dir[0], ny = y+dir[1]; - if (nx<0 || nx>12 || ny<0 || ny>12) return; - if (core.status.checkBlockMap[13*nx+ny]%1000000>0) { - damage += core.status.checkBlockMap[13*nx+ny] % 1000000; - } - }) - - var leftValue = core.status.hero.hp - damage; - if (leftValue>1) { - var has = false; - // 夹击 - if (x>0 && x<12) { - var id1=parseInt(core.status.checkBlockMap[13*(x-1)+y]/1000000), - id2=parseInt(core.status.checkBlockMap[13*(x+1)+y]/1000000); - if (id1>0 && id1==id2) - has = true; - } - if (y>0 && y<12) { - var id1=parseInt(core.status.checkBlockMap[13*x+y-1]/1000000), - id2=parseInt(core.status.checkBlockMap[13*x+y+1]/1000000); - if (id1>0 && id1==id2) - has = true; - } - if (has) { - damage += parseInt((leftValue+1) / 2); + var has=false; + if (x>0 && x<12) { + var id1=core.status.checkBlock.map[13*(x-1)+y], + id2=core.status.checkBlock.map[13*(x+1)+y]; + if (core.isset(id1) && core.isset(id2) && id1==id2) { + var enemy = core.enemys.getEnemys(id1); + if (core.enemys.hasSpecial(enemy.special, 16)) { + has = true; } } } - core.status.checkBlock[13*x+y] = damage; + if (y>0 && y<12) { + var id1=core.status.checkBlock.map[13*x+y-1], + id2=core.status.checkBlock.map[13*x+y+1]; + if (core.isset(id1) && core.isset(id2) && id1==id2) { + var enemy = core.enemys.getEnemys(id1); + if (core.enemys.hasSpecial(enemy.special, 16)) { + has = true; + } + } + } + // 存在夹击 + if (has) { + core.status.checkBlock.betweenAttack[13*x+y]=true; + var leftHp = core.status.hero.hp - core.status.checkBlock.damage[13*x+y]; + if (leftHp>1) + core.status.checkBlock.damage[13*x+y] += parseInt((leftHp+1)/2); + } } } } @@ -2375,13 +2383,22 @@ core.prototype.updateCheckBlock = function() { core.prototype.checkBlock = function () { // 检查领域、夹击事件 var x=core.getHeroLoc('x'), y=core.getHeroLoc('y'); - if (core.status.checkBlock[13*x+y]>0) { - core.status.hero.hp -= core.status.checkBlock[13*x+y]; - if (core.hasBetweenAttack(x,y)) { + var damage = core.status.checkBlock.damage[13*x+y]; + if (damage>0) { + core.status.hero.hp -= damage; + + // 检查阻击事件 + var snipe = []; + + if (core.status.checkBlock.betweenAttack[13*x+y]) { core.drawTip('受到夹击,生命变成一半'); } - else if (core.hasZone(x,y)) { - core.drawTip('受到领域伤害'+core.status.checkBlock[13*x+y]+'点'); + // 阻击 + else if (snipe.length>0) { + core.drawTip('受到阻击伤害'+damage+'点'); + } + else { + core.drawTip('受到领域伤害'+damage+'点'); } if (core.status.hero.hp<=0) { core.status.hero.hp=0; @@ -2393,37 +2410,6 @@ core.prototype.checkBlock = function () { } } -core.prototype.hasZone = function (x,y) { - if (!core.isset(core.status.checkBlockMap)) core.updateCheckBlockMap(); - var isZone = false; - // 领域 - [[-1,0],[0,-1],[1,0],[0,1]].forEach(function (dir) { - var nx = x+dir[0], ny = y+dir[1]; - if (nx<0 || nx>12 || ny<0 || ny>12) return; - if (core.status.checkBlockMap[13*nx+ny]%1000000>0) { - isZone = true; - } - }) - return isZone; -} - -core.prototype.hasBetweenAttack = function(x,y) { - if (!core.isset(core.status.checkBlockMap)) core.updateCheckBlockMap(); - // 夹击 - if (x>0 && x<12) { - var id1=parseInt(core.status.checkBlockMap[13*(x-1)+y]/1000000), - id2=parseInt(core.status.checkBlockMap[13*(x+1)+y]/1000000); - if (id1>0 && id1==id2) - return true; - } - if (y>0 && y<12) { - var id1=parseInt(core.status.checkBlockMap[13*x+y-1]/1000000), - id2=parseInt(core.status.checkBlockMap[13*x+y+1]/1000000); - if (id1>0 && id1==id2) - return true; - } -} - core.prototype.setFg = function(color, time, callback) { time = time || 750; @@ -2508,16 +2494,6 @@ core.prototype.nextY = function () { */ core.prototype.updateFg = function () { - /* - // 如果存在颜色 - if (core.isset(core.status.event.data) && core.isset(core.status.event.data.currentColor)) { - var color=core.status.event.data.currentColor; - core.setAlpha('fg', color[3]); - core.fillRect("fg",0,0,416,416,"#"+((1<<24)+(color[0]<<16)+(color[1]<<8)+color[2]).toString(16).slice(1)); - return; - } - */ - if (!core.isset(core.status.thisMap) || !core.isset(core.status.thisMap.blocks)) return; // 更新显伤 var mapBlocks = core.status.thisMap.blocks; @@ -2562,7 +2538,7 @@ core.prototype.updateFg = function () { core.canvas.fg.textAlign = 'center'; for (var x=0;x<13;x++) { for (var y=0;y<13;y++) { - var damage = core.status.checkBlock[13*x+y]; + var damage = core.status.checkBlock.damage[13*x+y]; if (damage>0) { core.setFillStyle('fg', '#000000'); core.canvas.fg.fillText(damage, 32 * x + 17, 32 * (y + 1) - 13); @@ -3348,14 +3324,17 @@ core.prototype.clearStatusBar = function() { */ core.prototype.updateStatusBar = function () { - // 检查登记 + // 检查等级 core.checkLvUp(); - // 上限999999 + // 检查HP上限 if (core.values.HPMAX>0) { core.setStatus('hp', Math.min(core.values.HPMAX, core.getStatus('hp'))); } + // 更新领域、阻击、显伤 + core.updateCheckBlock(); + var lvName = core.getLvName(); core.statusBar.lv.innerHTML = lvName; if (/^[+-]?\d+$/.test(lvName)) @@ -3393,7 +3372,6 @@ core.prototype.updateStatusBar = function () { } else { core.statusBar.image.fly.style.opacity = 0.3; } - core.updateCheckBlock(); core.updateFg(); } diff --git a/libs/data.js b/libs/data.js index d8ad6961..606db8a4 100644 --- a/libs/data.js +++ b/libs/data.js @@ -85,7 +85,7 @@ data.prototype.init = function() { "levelUp": [ // 经验升级所需要的数值,是一个数组 {}, // 第一项为初始等级,可以简单留空,也可以写name - // 每一个里面可以含有三个参数 name, need, effect + // 每一个里面可以含有三个参数 need, name, effect // need为所需要的经验数值,是一个正整数。请确保need所需的依次递增 // name为该等级的名称,也可以省略代表使用系统默认值;本项将显示在状态栏中 // effect为本次升级所执行的操作,可由若干项组成,由分号分开 @@ -139,8 +139,7 @@ data.prototype.init = function() { } // 系统FLAG,在游戏运行中中请不要修改它。 this.flags = { - /****** 角色状态相关 ******/ - "enableNegativeDamage": true, // 是否支持负伤害(回血) + /****** 状态栏相关 ******/ "enableFloor": false, // 是否在状态栏显示当前楼层 "enableLv": true, // 是否在状态栏显示当前等级 "enableMDef": true, // 是否在状态栏及战斗界面显示魔防(护盾) @@ -154,6 +153,9 @@ data.prototype.init = function() { "pickaxeFourDirections": true, // 使用破墙镐是否四个方向都破坏;如果false则只破坏面前的墙壁 "bombFourDirections": true, // 使用炸弹是否四个方向都会炸;如果false则只炸面前的怪物(即和圣锤等价) "bigKeyIsBox": false, // 如果此项为true,则视为钥匙盒,红黄蓝钥匙+1;若为false,则视为大黄门钥匙 + /****** 怪物相关 ******/ + "enableNegativeDamage": true, // 是否支持负伤害(回血) + "zoneSquare": false, // 领域类型。如果此项为true则为九宫格伤害,为false则为十字伤害 /****** 系统相关 ******/ "startDirectly": false, // 点击“开始游戏”后是否立刻开始游戏而不显示难度选择界面 "canOpenBattleAnimate": true, // 是否允许用户开启战斗过程;如果此项为false,则下面两项均强制视为false diff --git a/libs/enemys.js b/libs/enemys.js index f236d68d..fdffc71a 100644 --- a/libs/enemys.js +++ b/libs/enemys.js @@ -23,8 +23,8 @@ enemys.prototype.init = function () { 'slimeMan': {'name': '影子战士', 'hp': 100, 'atk': 0, 'def': 0, 'money': 11, 'experience': 0, 'special': 10}, // 模仿怪的攻防设为0就好 'bluePriest': {'name': '初级法师', 'hp': 100, 'atk': 120, 'def': 0, 'money': 3, 'experience': 0, 'special': 2}, 'redPriest': {'name': '高级法师', 'hp': 0, 'atk': 0, 'def': 0, 'money': 0, 'experience': 0, 'special': 0}, - 'brownWizard': {'name': '初级巫师', 'hp': 100, 'atk': 120, 'def': 0, 'money': 16, 'experience': 0, 'special': 15, 'value': 100}, // 领域怪需要加value表示领域伤害的数值 - 'redWizard': {'name': '高级巫师', 'hp': 1000, 'atk': 1200, 'def': 0, 'money': 160, 'experience': 0, 'special': 15, 'value': 200}, + 'brownWizard': {'name': '初级巫师', 'hp': 100, 'atk': 120, 'def': 0, 'money': 16, 'experience': 0, 'special': 15, 'value': 100, 'zoneSquare': true}, // 领域怪需要加value表示领域伤害的数值;zoneSquare代表是否九宫格伤害 + 'redWizard': {'name': '高级巫师', 'hp': 1000, 'atk': 1200, 'def': 0, 'money': 160, 'experience': 0, 'special': 15, 'value': 200, 'range': 2}, // range可选,代表领域伤害的范围;不加默认为1 'yellowGuard': {'name': '初级卫兵', 'hp': 100, 'atk': 120, 'def': 0, 'money': 10, 'experience': 0, 'special': 0}, 'blueGuard': {'name': '中级卫兵', 'hp': 0, 'atk': 0, 'def': 0, 'money': 0, 'experience': 0, 'special': 0}, 'redGuard': {'name': '高级卫兵', 'hp': 0, 'atk': 0, 'def': 0, 'money': 0, 'experience': 0, 'special': 0}, @@ -100,6 +100,7 @@ enemys.prototype.getSpecialText = function (enemyId) { if (this.hasSpecial(special, 15)) text.push("领域"); if (this.hasSpecial(special, 16)) text.push("夹击"); if (this.hasSpecial(special, 17)) text.push("仇恨"); + if (this.hasSpecial(special, 18)) text.push("阻击"); return text.join(" "); } From 8dcb6cb61ad3eb67f15cb301b417e0aaea02c517 Mon Sep 17 00:00:00 2001 From: oc Date: Thu, 28 Dec 2017 13:27:54 +0800 Subject: [PATCH 11/25] Update Snipe --- libs/core.js | 19 ++++++++++++++++++- libs/data.js | 2 +- libs/enemys.js | 2 +- libs/floors/sample0.js | 4 ++-- libs/floors/test.js | 26 +++++++++++++------------- 5 files changed, 35 insertions(+), 18 deletions(-) diff --git a/libs/core.js b/libs/core.js index dfc681f3..f10ea08a 100644 --- a/libs/core.js +++ b/libs/core.js @@ -2337,7 +2337,13 @@ core.prototype.updateCheckBlock = function() { } // 存在阻击 if (core.enemys.hasSpecial(enemy.special, 18)) { - + for (var dx=-1;dx<=1;dx++) { + for (var dy=-1;dy<=1;dy++) { + var nx=x+dx, ny=y+dy; + if (nx<0 || nx>12 || ny<0 || ny>12 || Math.abs(dx)+Math.abs(dy)>1) continue; + core.status.checkBlock.damage[13*nx+ny]+=enemy.value; + } + } } } } @@ -2389,6 +2395,17 @@ core.prototype.checkBlock = function () { // 检查阻击事件 var snipe = []; + var scan = { + 'up': {'x': 0, 'y': -1}, + 'left': {'x': -1, 'y': 0}, + 'down': {'x': 0, 'y': 1}, + 'right': {'x': 1, 'y': 0} + } + for (var direction in scan) { + var nx = x+scan[direction].x, ny=y+scan[direction].y; + if (nx<0 || nx>12 || ny<0 || ny>12) continue; + } + if (core.status.checkBlock.betweenAttack[13*x+y]) { core.drawTip('受到夹击,生命变成一半'); diff --git a/libs/data.js b/libs/data.js index 606db8a4..6c490d77 100644 --- a/libs/data.js +++ b/libs/data.js @@ -7,7 +7,7 @@ data.prototype.init = function() { "title": "魔塔样板", // 游戏名,将显示在标题页面以及切换楼层的界面中 "name": "template", // 游戏的唯一英文标识符。由英文、数字、下划线组成,不能超过20个字符。 "version": "Ver 1.0.0 (Beta)", // 当前游戏版本;版本不一致的存档不能通用。 - "floorId": "sample0", // 初始楼层ID + "floorId": "test", // 初始楼层ID "hero": { // 勇士初始数据 "name": "阳光", // 勇士名;可以改成喜欢的 'lv': 1, // 初始等级,该项必须为正整数 diff --git a/libs/enemys.js b/libs/enemys.js index fdffc71a..c08ae30e 100644 --- a/libs/enemys.js +++ b/libs/enemys.js @@ -41,7 +41,7 @@ enemys.prototype.init = function () { 'poisonSkeleton': {'name': '紫骷髅', 'hp': 0, 'atk': 0, 'def': 0, 'money': 0, 'experience': 0, 'special': 0}, 'poisonBat': {'name': '紫蝙蝠', 'hp': 100, 'atk': 120, 'def': 0, 'money': 14, 'experience': 0, 'special': 13}, 'steelRock': {'name': '铁面人', 'hp': 0, 'atk': 0, 'def': 0, 'money': 0, 'experience': 0, 'special': 0}, - 'skeletonPriest': {'name': '骷髅法师', 'hp': 0, 'atk': 0, 'def': 0, 'money': 0, 'experience': 0, 'special': 0}, + 'skeletonPriest': {'name': '骷髅法师', 'hp': 100, 'atk': 100, 'def': 0, 'money': 0, 'experience': 0, 'special': 18, 'value': 20}, 'skeletonKing': {'name': '骷髅王', 'hp': 0, 'atk': 0, 'def': 0, 'money': 0, 'experience': 0, 'special': 0}, 'skeletonWizard': {'name': '骷髅巫师', 'hp': 0, 'atk': 0, 'def': 0, 'money': 0, 'experience': 0, 'special': 0}, 'redSkeletonCaption': {'name': '骷髅武士', 'hp': 0, 'atk': 0, 'def': 0, 'money': 0, 'special': 0}, diff --git a/libs/floors/sample0.js b/libs/floors/sample0.js index a32e0d7d..761bc5ed 100644 --- a/libs/floors/sample0.js +++ b/libs/floors/sample0.js @@ -16,8 +16,8 @@ main.floors.sample0 = { [216, 247, 256, 235, 248, 6, 0, 3, 49, 50, 51, 52, 38], [6, 6, 125, 6, 6, 6, 0, 1, 45, 46, 47, 48, 37], [224, 254, 212, 232, 204, 5, 0, 1, 31, 32, 34, 33, 36], - [201, 205, 217, 215, 207, 5, 50, 1, 27, 28, 29, 30, 35], - [5, 5, 125, 5, 5, 5, 50, 1, 21, 22, 23, 24, 25], + [201, 205, 217, 215, 207, 5, 0, 1, 27, 28, 29, 30, 35], + [5, 5, 125, 5, 5, 5, 0, 1, 21, 22, 23, 24, 25], [0, 0, 0, 0, 0, 0, 45, 1, 1, 1, 121, 1, 1], [4, 4, 126, 4, 4, 4, 0, 0, 0, 0, 0, 85, 124], [87, 11, 12, 13, 14, 4, 4, 2, 2, 2, 122, 2, 2], diff --git a/libs/floors/test.js b/libs/floors/test.js index c125ab71..4a1fce20 100644 --- a/libs/floors/test.js +++ b/libs/floors/test.js @@ -9,19 +9,19 @@ main.floors.test = { "canUseQuickShop": true, // 该层是否允许使用快捷商店 "defaultGround": "ground", // 默认地面的图块ID(terrains中) "map": [ // 地图数据,需要是13x13,建议使用地图生成器来生成 - [201,201,201,201,201,201,201,201,201,201,201,201,201], - [201,201,201,201,201,201,201,201,201,201,201,201,201], - [201,201,201,201,201,201,201,201,201,201,201,201,201], - [201,201,201,201,201,201,201,201,201,201,201,201,201], - [201,201,201,201,201,201,201,201,201,201,201,201,201], - [201,201,201,201,201,201,201,201,201,201,201,201,201], - [201,201,201,201,201,201,201,201,201,201,201,201,201], - [201,201,201,201,201,201,201,201,201,201,201,201,201], - [201,201,201,201,201,201,201,201,201,201,201,201,201], - [201,201,201,201,201,201,201,201,201,201,201,201,201], - [201,201,201,201,201,201,201,201,201,201,201,201,201], - [201,201,201,201,201,201, 45,201,201,201,201,201,201], - [201,201,201,201,201,201, 0,201,201,201,201,201,201] + [ 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], + [ 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], + [ 0, 0, 0, 0, 0, 0, 0,237, 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, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 45, 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] ], "firstArrive": [ // 第一次到该楼层触发的事件 From c99997dca4bc6a2f0cb9efb2b372689ba07eb4a4 Mon Sep 17 00:00:00 2001 From: oc Date: Thu, 28 Dec 2017 19:16:31 +0800 Subject: [PATCH 12/25] =?UTF-8?q?=E6=94=AF=E6=8C=81=E9=98=BB=E5=87=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- libs/core.js | 145 ++++++++++++++++++++++++++++++++++++++++++-- libs/data.js | 2 +- libs/events.js | 18 +++++- libs/floors/test.js | 19 +++--- 更新说明.txt | 8 +-- 5 files changed, 171 insertions(+), 21 deletions(-) diff --git a/libs/core.js b/libs/core.js index f10ea08a..e91d0d08 100644 --- a/libs/core.js +++ b/libs/core.js @@ -886,7 +886,8 @@ core.prototype.onmousewheel = function (direct) { /////////// 寻路代码相关 /////////// core.prototype.clearAutomaticRouteNode = function (x, y) { - core.canvas.ui.clearRect(x * 32 + 5, y * 32 + 5, 27, 27); + if (core.status.event.id==null) + core.canvas.ui.clearRect(x * 32 + 5, y * 32 + 5, 27, 27); } core.prototype.stopAutomaticRoute = function () { @@ -2272,6 +2273,15 @@ core.prototype.setGlobalAnimate = function (speed) { }, speed / 2); } +core.prototype.syncGlobalAnimate = function () { + core.status.twoAnimateObjs.forEach(function (t) { + t.status=0; + }) + core.status.fourAnimateObjs.forEach(function (t) { + t.status=0; + }) +} + core.prototype.setBoxAnimate = function () { clearInterval(core.interval.boxAnimate); if (core.status.boxAnimateObjs.length > 0) { @@ -2328,6 +2338,7 @@ core.prototype.updateCheckBlock = function() { if (core.isset(enemy.zoneSquare)) zoneSquare=enemy.zoneSquare; for (var dx=-range;dx<=range;dx++) { for (var dy=-range;dy<=range;dy++) { + if (dx==0 && dy==0) continue; var nx=x+dx, ny=y+dy; if (nx<0 || nx>12 || ny<0 || ny>12) continue; if (!zoneSquare && Math.abs(dx)+Math.abs(dy)>range) continue; @@ -2339,6 +2350,7 @@ core.prototype.updateCheckBlock = function() { if (core.enemys.hasSpecial(enemy.special, 18)) { for (var dx=-1;dx<=1;dx++) { for (var dy=-1;dy<=1;dy++) { + if (dx==0 && dy==0) continue; var nx=x+dx, ny=y+dy; if (nx<0 || nx>12 || ny<0 || ny>12 || Math.abs(dx)+Math.abs(dy)>1) continue; core.status.checkBlock.damage[13*nx+ny]+=enemy.value; @@ -2404,9 +2416,15 @@ core.prototype.checkBlock = function () { for (var direction in scan) { var nx = x+scan[direction].x, ny=y+scan[direction].y; if (nx<0 || nx>12 || ny<0 || ny>12) continue; + var id=core.status.checkBlock.map[13*nx+ny]; + if (core.isset(id)) { + var enemy = core.enemys.getEnemys(id); + if (core.isset(enemy) && core.enemys.hasSpecial(enemy.special, 18)) { + snipe.push({'direction': direction, 'x': nx, 'y': ny}); + } + } } - if (core.status.checkBlock.betweenAttack[13*x+y]) { core.drawTip('受到夹击,生命变成一半'); } @@ -2423,10 +2441,122 @@ core.prototype.checkBlock = function () { core.events.lose('zone'); return; } + snipe = snipe.filter(function (t) { + var x=t.x, y=t.y, direction = t.direction; + var nx = x+scan[direction].x, ny=y+scan[direction].y; + + return nx>=0 && nx<=12 && ny>=0 && ny<=12 && core.getBlock(nx, ny, core.status.floorId, false)==null; + }); core.updateStatusBar(); + if (snipe.length>0) + core.snipe(snipe); } } +core.prototype.snipe = function (snipes) { + core.waitHeroToStop(function() { + core.lockControl(); + + var scan = { + 'up': {'x': 0, 'y': -1}, + 'left': {'x': -1, 'y': 0}, + 'down': {'x': 0, 'y': 1}, + 'right': {'x': 1, 'y': 0} + }; + + snipes.forEach(function (snipe) { + var x=snipe.x, y=snipe.y, direction = snipe.direction; + snipe.nx = x+scan[snipe.direction].x; + snipe.ny = y+scan[snipe.direction].y; + + core.removeGlobalAnimate(x, y); + + var block = core.getBlock(x,y).block; + + snipe.blockIcon = core.material.icons[block.event.cls][block.event.id]; + snipe.blockImage = core.material.images[block.event.cls]; + var damage = core.enemys.getDamage(block.event.id); + + var color = "#000000"; + if (damage <= 0) color = '#00FF00'; + else if (damage < core.status.hero.hp / 3) color = '#FFFFFF'; + else if (damage < core.status.hero.hp * 2 / 3) color = '#FFFF00'; + else if (damage < core.status.hero.hp) color = '#FF7F00'; + else color = '#FF0000'; + + if (damage >= 999999999) damage = "???"; + else if (damage > 100000) damage = (damage / 10000).toFixed(1) + "w"; + + snipe.damage = damage; + snipe.color = color; + snipe.block = core.clone(block); + }) + + var time = 500, step = 0; + + var animateValue = 2; + var animateCurrent = 0; + var animateTime = 0; + + core.canvas.fg.textAlign = 'left'; + + var animate=window.setInterval(function() { + + step++; + animateTime += time / 16; + if (animateTime >= core.values.animateSpeed * 2 / animateValue) { + animateCurrent++; + animateTime = 0; + if (animateCurrent>=animateValue) animateCurrent=0; + } + + snipes.forEach(function (snipe) { + var x=snipe.x, y=snipe.y, direction = snipe.direction; + + var nowX=32*x+scan[direction].x*2*step, nowY=32*y+scan[direction].y*2*step; + + // 清空上一次 + core.clearMap('event', nowX-2*scan[direction].x, nowY-2*scan[direction].y, 32, 32); + core.clearMap('fg', nowX-2*scan[direction].x, nowY-2*scan[direction].y, 32, 32); + + core.canvas.event.drawImage(snipe.blockImage, animateCurrent*32, snipe.blockIcon*32, 32, 32, nowX, nowY, 32, 32); + + if (core.hasItem('book')) { + // drawFG + core.setFillStyle('fg', '#000000'); + core.canvas.fg.fillText(snipe.damage, nowX + 2, nowY + 30); + core.canvas.fg.fillText(snipe.damage, nowX, nowY + 30); + core.canvas.fg.fillText(snipe.damage, nowX + 2, nowY + 32); + core.canvas.fg.fillText(snipe.damage, nowX, nowY + 32); + + core.setFillStyle('fg', snipe.color); + core.canvas.fg.fillText(snipe.damage, nowX + 1, nowY + 31); + } + + }) + + if (step==16) { // 移动完毕 + clearInterval(animate); + snipes.forEach(function (t) { + core.removeBlock(t.x, t.y); + var nBlock = core.clone(t.block); + nBlock.x = t.nx; nBlock.y = t.ny; + core.status.thisMap.blocks.push(nBlock); + core.addGlobalAnimate(animateValue, 32*t.nx, 32*t.ny, t.blockIcon, t.blockImage); + }); + core.syncGlobalAnimate(); + core.updateStatusBar(); + // 不存在自定义事件 + if (core.status.event.id==null) + core.unLockControl(); + } + }, time/16); + + + + }); +} + core.prototype.setFg = function(color, time, callback) { time = time || 750; @@ -3402,9 +3532,14 @@ core.prototype.checkLvUp = function () { core.status.hero.lv++; var effect = core.firstData.levelUp[core.status.hero.lv-1].effect; if (typeof effect == "string") { - effect.split(";").forEach(function (t) { - core.doEffect(t); - }); + if (effect.indexOf("function")==0) { + eval("("+effect+")()"); + } + else { + effect.split(";").forEach(function (t) { + core.doEffect(t); + }); + } } else if (effect instanceof Function) { effect(); diff --git a/libs/data.js b/libs/data.js index 6c490d77..adb77995 100644 --- a/libs/data.js +++ b/libs/data.js @@ -145,7 +145,7 @@ data.prototype.init = function() { "enableMDef": true, // 是否在状态栏及战斗界面显示魔防(护盾) "enableMoney": true, // 是否在状态栏、怪物手册及战斗界面显示金币 "enableExperience": true, // 是否在状态栏、怪物手册及战斗界面显示经验 - "enableLevelUp": false, // 是否允许等级提升(进阶);如果上面enableExperience为false,则此项恒视为false + "enableLevelUp": true, // 是否允许等级提升(进阶);如果上面enableExperience为false,则此项恒视为false "enableDebuff": true, // 是否涉及毒衰咒;如果此项为false则不会在状态栏中显示毒衰咒的debuff ////// 上述的几个开关将直接影响状态栏的显示效果 ////// /****** 道具相关 ******/ diff --git a/libs/events.js b/libs/events.js index 26d62ac6..051996a0 100644 --- a/libs/events.js +++ b/libs/events.js @@ -352,8 +352,14 @@ events.prototype.doAction = function() { core.events.lose(data.reason); break; case "function": - if (core.isset(data["function"])) - data["function"](); + var func = data["function"]; + if (core.isset(func)) { + if ((typeof func == "string") && func.indexOf("function")==0) { + eval('('+func+')()'); + } + else if (func instanceof Function) + func(); + } this.doAction(); break; case "update": @@ -528,6 +534,12 @@ events.prototype.afterBattle = function(enemyId,x,y,callback) { return; } + // 阻击:不处理任何事件 + if (core.enemys.hasSpecial(special, 18)) { + if (core.isset(callback)) callback(); + return; + } + // 检查处理后的事件。 var event = core.floors[core.status.floorId].afterBattle[x+","+y]; if (core.isset(event)) { @@ -536,8 +548,8 @@ events.prototype.afterBattle = function(enemyId,x,y,callback) { //继续行走 else { core.continueAutomaticRoute(); - if (core.isset(callback)) callback(); } + if (core.isset(callback)) callback(); } /****** 开完门 ******/ diff --git a/libs/floors/test.js b/libs/floors/test.js index 4a1fce20..d85b7a2b 100644 --- a/libs/floors/test.js +++ b/libs/floors/test.js @@ -12,14 +12,14 @@ main.floors.test = { [ 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], + [ 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 1, 0, 237, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 220, 246,0, 246, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 219, 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, 0, 0, 0, 0, 0], - [ 0, 0, 0, 0, 0, 0, 0,237, 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, 0, 0, 0, 0, 0], - [ 0, 0, 0, 0, 45, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 45, 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, 0, 0, 0, 0, 0, 0] ], @@ -27,7 +27,10 @@ main.floors.test = { ], "events": { // 该楼的所有可能事件列表 - + "6,4": [ + "test", + {"type": 'hide'} + ] }, "changeFloor": { // 楼层转换事件;该事件不能和上面的events有冲突(同位置点),否则会被覆盖 diff --git a/更新说明.txt b/更新说明.txt index 6e9cc527..cdc48c46 100644 --- a/更新说明.txt +++ b/更新说明.txt @@ -1,11 +1,11 @@ 全键盘操作 √ -进阶 √ +经验升级(进阶) √ +支持阻击 √ +九宫格领域、大范围领域 √ Ctrl快速跳过对话 √ 增加负伤 √ 支持不同层使用不同的地面素材 √ 支持多个Autotile同时存在 √ 直接内嵌了诸多默认的terrains素材 √ 自动定位到上次存/读档位置 √ -设置储存 √ -修改setFg的实现方法 √ -大范围领域伤害 \ No newline at end of file +修改setFg的实现方法 √ \ No newline at end of file From 5f7a03ec70ab4381947560d691d84d6b9e98ef07 Mon Sep 17 00:00:00 2001 From: oc Date: Thu, 28 Dec 2017 22:02:08 +0800 Subject: [PATCH 13/25] FloorMsgGroup --- libs/core.js | 4 ++-- libs/data.js | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/libs/core.js b/libs/core.js index e91d0d08..b40b7d91 100644 --- a/libs/core.js +++ b/libs/core.js @@ -3735,8 +3735,8 @@ core.prototype.resize = function(clientWidth, clientHeight) { id: 'floorMsgGroup', rules:{ width: (canvasWidth - SPACE*2) + unit, - height:(canvasWidth - SPACE*2) + unit, - top: (canvasTop + SPACE) + unit, + height: (gameGroupHeight - SPACE*2) + unit, + top: SPACE + unit, right: SPACE + unit, } }, diff --git a/libs/data.js b/libs/data.js index adb77995..a454c296 100644 --- a/libs/data.js +++ b/libs/data.js @@ -7,7 +7,7 @@ data.prototype.init = function() { "title": "魔塔样板", // 游戏名,将显示在标题页面以及切换楼层的界面中 "name": "template", // 游戏的唯一英文标识符。由英文、数字、下划线组成,不能超过20个字符。 "version": "Ver 1.0.0 (Beta)", // 当前游戏版本;版本不一致的存档不能通用。 - "floorId": "test", // 初始楼层ID + "floorId": "sample0", // 初始楼层ID "hero": { // 勇士初始数据 "name": "阳光", // 勇士名;可以改成喜欢的 'lv': 1, // 初始等级,该项必须为正整数 From 95686a637cd705c301c39191f330196eec7c8129 Mon Sep 17 00:00:00 2001 From: oc Date: Fri, 29 Dec 2017 12:28:59 +0800 Subject: [PATCH 14/25] Music --- index.html | 1 + libs/core.js | 320 ++++++++++++----- libs/data.js | 6 +- libs/events.js | 80 +++-- libs/floors/test.js | 48 --- libs/items.js | 3 + libs/thirdparty/mid.js | 701 +++++++++++++++++++++++++++++++++++++ libs/thirdparty/mid.min.js | 3 + libs/ui.js | 5 +- main.js | 27 +- sounds/058-Slow01.mid | Bin 0 -> 6183 bytes sounds/G2_koko.mid | Bin 0 -> 31666 bytes sounds/star.mid | Bin 0 -> 15102 bytes test.js | 0 14 files changed, 1016 insertions(+), 178 deletions(-) delete mode 100644 libs/floors/test.js create mode 100644 libs/thirdparty/mid.js create mode 100644 libs/thirdparty/mid.min.js create mode 100644 sounds/058-Slow01.mid create mode 100644 sounds/G2_koko.mid create mode 100644 sounds/star.mid create mode 100644 test.js diff --git a/index.html b/index.html index 44c759a0..ae063d97 100644 --- a/index.html +++ b/index.html @@ -113,5 +113,6 @@ 此浏览器不支持HTML5
+ \ No newline at end of file diff --git a/libs/core.js b/libs/core.js index b40b7d91..d89d08cf 100644 --- a/libs/core.js +++ b/libs/core.js @@ -7,12 +7,14 @@ function core() { this.statusBar = {}; this.canvas = {}; this.images = []; - this.sounds = {}; + this.bgms = []; + this.sounds = []; this.floorIds = []; this.floors = {}; this.firstData = {}; this.material = { 'images': {}, + 'bgms': {}, 'sounds': {}, 'ground': null, 'items': {}, @@ -35,12 +37,12 @@ function core() { 'openDoorAnimate': null } this.musicStatus = { - 'isIOS': false, - 'loaded': false, - 'bgmStatus': false, - 'soundStatus': true, - 'playedSound': null, - 'playedBgm': null, + 'audioContext': null, // WebAudioContext + 'startDirectly': false, // 是否直接播放(加载)音乐 + 'bgmStatus': false, // 是否播放BGM + 'soundStatus': true, // 是否播放SE + 'playingBgm': null, // 正在播放的BGM + 'isPlaying': false, } // 样式 this.domStyle = { @@ -102,11 +104,12 @@ function core() { /////////// 系统事件相关 /////////// -core.prototype.init = function (dom, statusBar, canvas, images, sounds, floorIds, floors, coreData) { +core.prototype.init = function (dom, statusBar, canvas, images, bgms, sounds, floorIds, floors, coreData) { core.dom = dom; core.statusBar = statusBar; core.canvas = canvas; core.images = images; + core.bgms = bgms; core.sounds = sounds; core.floorIds = floorIds; core.floors = floors; @@ -134,16 +137,43 @@ core.prototype.init = function (dom, statusBar, canvas, images, sounds, floorIds core.material.icons = core.icons.getIcons(); core.material.events = core.events.getEvents(); - // test if iOS - core.musicStatus.soundStatus = core.getLocalStorage('soundStatus', true); - var userAgent = navigator.userAgent; - if (userAgent.indexOf('iPhone') > -1 || userAgent.indexOf('iPad') > -1) { - console.log("你的设备为iphone,不自动播放音乐!"); - core.musicStatus.isIOS = true; - core.musicStatus.soundStatus = false; + + if (location.protocol.indexOf("http")==0) { + window.AudioContext = window.AudioContext || window.webkitAudioContext || window.mozAudioContext || window.msAudioContext; + try { + core.musicStatus.audioContext = new window.AudioContext(); + } catch (e) { + console.log("该浏览器不支持AudioContext"); + core.musicStatus.audioContext = null; + } } + // 音效设置部分 + var isPC = true; + ["Android", "iPhone", "SymbianOS", "Windows Phone", "iPad", "iPod"].forEach(function (t) { + if (navigator.userAgent.indexOf(t)>=0) isPC=false; + }); + if (isPC) { + // 如果是PC端直接加载 + core.musicStatus.startDirectly = true; + } + else { + var connection = navigator.connection; + if (core.isset(connection) && connection.type=='wifi') + core.musicStatus.startDirectly = true; + } + + // 先从存储中读取BGM状态 + core.musicStatus.bgmStatus = core.getLocalStorage('bgmStatus', true); + if (!core.musicStatus.startDirectly) // 如果当前网络环境不允许 + core.musicStatus.bgmStatus = false; + core.setLocalStorage('bgmStatus', core.musicStatus.bgmStatus); + + core.musicStatus.soundStatus = core.getLocalStorage('soundStatus', true); + core.setLocalStorage('soundStatus', core.musicStatus.soundStatus); + + // switchs core.flags.battleAnimate = core.getLocalStorage('battleAnimate', core.flags.battleAnimate); core.flags.displayEnemyDamage = core.getLocalStorage('enemyDamage', core.flags.displayEnemyDamage); @@ -232,7 +262,7 @@ core.prototype.loader = function (callback) { core.material.images.autotile[autotileId]=image; if (Object.keys(core.material.images.autotile).length==autotileIds.length) { // 音频 - core.loadSounds(callback); + core.loadMusic(callback); } }) } @@ -259,65 +289,112 @@ core.prototype.loadImage = function (imgName, callback) { } } -core.prototype.loadSounds = function (callback) { - for (var key in core.sounds) { - for (var i = 0; i < core.sounds[key].length; i++) { - var soundName=core.sounds[key][i]; - soundName = soundName.split('-'); - var sound = new Audio(); - sound.preload = 'none'; - sound.src = 'sounds/' + soundName[0] + '.' + key; - if (soundName[1] == 'loop') { - sound.loop = 'loop'; +core.prototype.loadMusic = function (callback) { + + core.bgms.forEach(function (t) { + + // 判断是不是mid + if (/^.*\.mid$/.test(t)) { + + if (core.musicStatus.audioContext!=null) { + core.material.bgms[t] = 'loading'; + var xhr = new XMLHttpRequest(); + xhr.open('GET', 'sounds/'+t, true); + xhr.overrideMimeType("text/plain; charset=x-user-defined"); + xhr.onload = function(e) { //下载完成 + try { + var ff = []; + var mx = this.responseText.length; + for (var z = 0; z < mx; z++) + ff[z] = String.fromCharCode(this.responseText.charCodeAt(z) & 255); + var shouldStart = core.material.bgms[t] == 'starting'; + core.material.bgms[t] = AudioPlayer(core.musicStatus.audioContext, Replayer(MidiFile(ff.join("")), Synth(44100)), true); + + if (shouldStart) + core.playBgm(t); + } + catch (ee) { + console.log(ee); + core.material.bgms[t] = null; + } + + }; + xhr.ontimeout = function(e) { + console.log(e); + core.material.bgms[t] = null; + } + xhr.onerror = function(e) { + console.log(e); + core.material.bgms[t] = null; + } + xhr.send(); + } + else { + core.material.bgms[t] = null; } - - if (!core.isset(core.material.sounds[key])) - core.material.sounds[key] = {}; - core.material.sounds[key][soundName[0]] = sound; } - } + else { + var music = new Audio(); + if (!core.musicStatus.startDirectly) + music.preload = 'none'; // 默认不加载 + music.src = 'sounds/'+t; + music.loop = 'loop'; + core.material.bgms[t] = music; + } + }); + + core.sounds.forEach(function (t) { + + if (core.musicStatus.audioContext != null) { + var xhr = new XMLHttpRequest(); + xhr.open('GET', 'sounds/'+t, true); + xhr.responseType = 'arraybuffer'; + xhr.onload = function(e) { //下载完成 + try { + core.musicStatus.audioContext.decodeAudioData(this.response, function (buffer) { + core.material.sounds[t] = buffer; + }, function (e) { + console.log(e); + core.material.sounds[t] = null; + }) + } + catch (ee) { + console.log(ee); + core.material.sounds[t] = null; + } + }; + + xhr.ontimeout = function(e) { + console.log(e); + core.material.sounds[t] = null; + } + xhr.onerror = function(e) { + console.log(e); + core.material.sounds[t] = null; + } + xhr.send(); + } + else { + var music = new Audio(); + music.src = 'sounds/'+t; + core.material.sounds[t] = music; + } + + }); + + // 直接开始播放 + if (core.musicStatus.startDirectly && core.bgms.length>0) + core.playBgm(core.bgms[0]); + callback(); } -core.prototype.loadSound = function() { - if (!core.isset(core.material.sounds.mp3)) return; - if (core.musicStatus.isIOS) return; - if (core.musicStatus.loaded) return; - core.musicStatus.loaded=true; - console.log("加载音乐"); - - var toLoadList = []; - - for (var key in core.material.sounds) { - for (var name in core.material.sounds[key]) { - toLoadList.push(core.material.sounds[key][name]); - } - } - core.loadSoundItem(toLoadList); -} - -core.prototype.loadSoundItem = function (toLoadList) { - if (toLoadList.length==0) { - if (core.musicStatus.bgmStatus>0) return; - core.musicStatus.bgmStatus=1; - if (core.musicStatus.soundStatus) - core.playBgm('bgm', 'mp3'); - return; - } - var item = toLoadList.shift(); - item.oncanplay = function() { - core.loadSoundItem(toLoadList); - } - item.load(); -} - core.prototype.isPlaying = function() { if (core.isset(core.status.played) && core.status.played) return true; return false; } - core.prototype.clearStatus = function() { // 停止各个Timeout和Interval for (var i in core.interval) { @@ -1472,7 +1549,7 @@ core.prototype.openDoor = function (id, x, y, needKey, callback) { } } // open - core.playSound("door", "ogg"); + core.playSound("door.ogg"); var state = 0; var doorId = id; if (!(doorId.substring(doorId.length-4)=="Door")) { @@ -1518,7 +1595,7 @@ core.prototype.battle = function (id, x, y, force, callback) { }); } else { - core.playSound('attack', 'ogg'); + core.playSound('attack.ogg'); core.afterBattle(id, x, y, callback); } } @@ -1613,7 +1690,7 @@ core.prototype.changeFloor = function (floorId, stair, heroLoc, time, callback) } window.setTimeout(function () { - core.playSound('floor', 'mp3'); + core.playSound('floor.mp3'); core.mapChangeAnimate('show', time/2, function () { // 根据文字判断是否斜体 @@ -2770,7 +2847,7 @@ core.prototype.getNextItem = function() { core.prototype.getItem = function (itemId, itemNum, itemX, itemY, callback) { // core.getItemAnimate(itemId, itemNum, itemX, itemY); - core.playSound('item', 'ogg'); + core.playSound('item.ogg'); var itemCls = core.material.items[itemId].cls; core.items.getItemEffect(itemId, itemNum); core.removeBlock(itemX, itemY); @@ -3375,23 +3452,106 @@ core.prototype.isset = function (val) { return true } -core.prototype.playSound = function (soundName, soundType) { - if (!core.musicStatus.soundStatus || !core.musicStatus.loaded) { +core.prototype.playBgm = function (bgm) { + + // 如果不允许播放 + if (!core.musicStatus.bgmStatus) return; + // 音频不存在 + if (!core.isset(core.material.bgms[bgm])) return; + + // 延迟播放 + if (core.material.bgms[bgm] == 'loading') { + core.material.bgms[bgm] = 'starting'; return; } - if (!core.isset(core.material.sounds[soundType][soundName])) return; - core.musicStatus.playedSound = core.material.sounds[soundType][soundName]; - core.musicStatus.playedSound.play(); + + try { + // 如果当前正在播放,且和本BGM相同,直接忽略 + if (core.musicStatus.playingBgm == bgm && core.musicStatus.isPlaying) { + return; + } + // 如果正在播放中,暂停 + if (core.isset(core.musicStatus.playingBgm) && core.musicStatus.isPlaying) { + core.material.bgms[core.musicStatus.playingBgm].pause(); + } + // 播放当前BGM + core.musicStatus.playingBgm = bgm; + core.material.bgms[bgm].play(); + core.musicStatus.isPlaying = true; + + } + catch (e) { + console.log("无法播放BGM "+bgm); + console.log(e); + core.musicStatus.playingBgm = null; + } } -core.prototype.playBgm = function (bgmName, bgmType) { - if (core.musicStatus.isIOS || !core.musicStatus.loaded) return; - if (core.isset(core.musicStatus.playedBgm)) { - core.musicStatus.playedBgm.pause(); +core.prototype.pauseBgm = function () { + // 直接暂停播放 + try { + if (core.isset(core.musicStatus.playingBgm)) { + core.material.bgms[core.musicStatus.playingBgm].pause(); + } + core.musicStatus.isPlaying = false; + } + catch (e) { + console.log("无法暂停BGM "+bgm); + console.log(e); + } +} + +core.prototype.resumeBgm = function () { + // 恢复BGM + try { + if (core.isset(core.musicStatus.playingBgm)) { + core.material.bgms[core.musicStatus.playingBgm].play(); + core.musicStatus.isPlaying = true; + } + else { + if (core.bgms.length>0) { + core.playBgm(core.bgms[0]); + core.musicStatus.isPlaying = true; + } + } + } + catch (e) { + console.log("无法恢复BGM "+bgm); + console.log(e); + } +} + +core.prototype.playSound = function (sound) { + + // 如果不允许播放 + if (!core.musicStatus.soundStatus) return; + // 音频不存在 + if (!core.isset(core.material.sounds[sound])) return; + + try { + if (core.musicStatus.audioContext != null) { + var source = core.musicStatus.audioContext.createBufferSource(); + source.buffer = core.material.sounds[sound]; + source.connect(core.musicStatus.audioContext.destination); + try { + source.start(0); + } + catch (e) { + try { + source.noteOn(0); + } + catch (ee) { + } + } + } + else { + core.material.sounds[sound].play(); + } + } + catch (eee) { + console.log("无法播放SE "+bgm); + console.log(eee); } - core.musicStatus.playedBgm = core.material.sounds[bgmType][bgmName]; - if (core.musicStatus.soundStatus) - core.musicStatus.playedBgm.play(); } core.prototype.changeSoundStatus = function () { diff --git a/libs/data.js b/libs/data.js index a454c296..870ffb38 100644 --- a/libs/data.js +++ b/libs/data.js @@ -140,12 +140,12 @@ data.prototype.init = function() { // 系统FLAG,在游戏运行中中请不要修改它。 this.flags = { /****** 状态栏相关 ******/ - "enableFloor": false, // 是否在状态栏显示当前楼层 - "enableLv": true, // 是否在状态栏显示当前等级 + "enableFloor": true, // 是否在状态栏显示当前楼层 + "enableLv": false, // 是否在状态栏显示当前等级 "enableMDef": true, // 是否在状态栏及战斗界面显示魔防(护盾) "enableMoney": true, // 是否在状态栏、怪物手册及战斗界面显示金币 "enableExperience": true, // 是否在状态栏、怪物手册及战斗界面显示经验 - "enableLevelUp": true, // 是否允许等级提升(进阶);如果上面enableExperience为false,则此项恒视为false + "enableLevelUp": false, // 是否允许等级提升(进阶);如果上面enableExperience为false,则此项恒视为false "enableDebuff": true, // 是否涉及毒衰咒;如果此项为false则不会在状态栏中显示毒衰咒的debuff ////// 上述的几个开关将直接影响状态栏的显示效果 ////// /****** 道具相关 ******/ diff --git a/libs/events.js b/libs/events.js index 051996a0..7d8f955f 100644 --- a/libs/events.js +++ b/libs/events.js @@ -133,6 +133,17 @@ events.prototype.afterChangeFloor = function (floorId) { this.doEvents(core.floors[floorId].firstArrive); core.setFlag("visited_"+floorId, true); } + + // 播放BGM + if (floorId == 'sample0') { + core.playBgm('bgm.mp3'); + } + if (floorId == 'sample1') { + core.playBgm('star.mid'); + } + if (floorId == 'sample2') { + core.playBgm('058-G2_koko.mid'); + } } ////// 实际事件的处理 ////// @@ -285,11 +296,6 @@ events.prototype.doAction = function() { block = block.block; if (core.isset(block.event) && block.event.trigger=='action') { // 触发 - /* - core.status.event = {'id': 'action', 'data': { - 'list': core.clone(block.event.data), 'x': block.x, 'y': block.y, 'callback': core.status.event.data.callback - }} - */ core.status.event.data.list = core.clone(block.event.data); core.status.event.data.x=block.x; core.status.event.data.y=block.y; @@ -298,11 +304,21 @@ events.prototype.doAction = function() { this.doAction(); break; case "playSound": - var name=data.name.split("."); - if (name.length==2) - core.playSound(name[0],name[1]); + core.playSound(data.name); this.doAction(); break; + case "playBgm": + core.playBgm(data.name); + this.doAction(); + break + case "pauseBgm": + core.pauseBgm(); + this.doAction(); + break + case "resumeBgm": + core.resumeBgm(); + this.doAction(); + break case "setValue": try { var value=core.calValue(data.value); @@ -623,6 +639,12 @@ events.prototype.changeLight = function(x, y) { // 改变灯后的事件 events.prototype.afterChangeLight = function(x,y) { +} + +// 使用炸弹/圣锤后的事件 +events.prototype.afterUseBomb = function () { + + } // 存档事件前一刻的处理 @@ -651,6 +673,13 @@ events.prototype.keyDownCtrl = function () { } } +events.prototype.clickConfirmBox = function (x,y) { + if ((x == 4 || x == 5) && y == 7 && core.isset(core.status.event.data.yes)) + core.status.event.data.yes(); + if ((x == 7 || x == 8) && y == 7 && core.isset(core.status.event.data.no)) + core.status.event.data.no(); +} + events.prototype.keyUpConfirmBox = function (keycode) { if (keycode==37) { core.status.event.selection=0; @@ -673,12 +702,6 @@ events.prototype.keyUpConfirmBox = function (keycode) { } } } -events.prototype.clickConfirmBox = function (x,y) { - if ((x == 4 || x == 5) && y == 7 && core.isset(core.status.event.data.yes)) - core.status.event.data.yes(); - if ((x == 7 || x == 8) && y == 7 && core.isset(core.status.event.data.no)) - core.status.event.data.no(); -} // 正在处理事件时的点击操作... events.prototype.clickAction = function (x,y) { @@ -769,7 +792,6 @@ events.prototype.keyUpBook = function (keycode) { } } -// 飞行器 events.prototype.clickFly = function(x,y) { if ((x==10 || x==11) && y==9) core.ui.drawFly(core.status.event.data-1); if ((x==10 || x==11) && y==5) core.ui.drawFly(core.status.event.data+1); @@ -1115,21 +1137,27 @@ events.prototype.keyUpSL = function (keycode) { events.prototype.clickSwitchs = function (x,y) { if (x<5 || x>7) return; var choices = [ - "背景音乐", "战斗动画", "怪物显伤", "领域显伤", "返回主菜单" + "背景音乐", "背景音效", "战斗动画", "怪物显伤", "领域显伤", "返回主菜单" ]; var topIndex = 6 - parseInt((choices.length - 1) / 2); if (y>=topIndex && y> 4; + event.channel = eventTypeByte & 0x0f; + event.type = 'channel'; + switch (eventType) { + case 0x08: + event.subtype = 'noteOff'; + event.noteNumber = param1; + event.velocity = stream.readInt8(); + return event; + case 0x09: + event.noteNumber = param1; + event.velocity = stream.readInt8(); + if (event.velocity == 0) { + event.subtype = 'noteOff'; + } else { + event.subtype = 'noteOn'; + } + return event; + case 0x0a: + event.subtype = 'noteAftertouch'; + event.noteNumber = param1; + event.amount = stream.readInt8(); + return event; + case 0x0b: + event.subtype = 'controller'; + event.controllerType = param1; + event.value = stream.readInt8(); + return event; + case 0x0c: + event.subtype = 'programChange'; + event.programNumber = param1; + return event; + case 0x0d: + event.subtype = 'channelAftertouch'; + event.amount = param1; + return event; + case 0x0e: + event.subtype = 'pitchBend'; + event.value = param1 + (stream.readInt8() << 7); + return event; + default: + throw "Unrecognised MIDI event type: " + eventType + } + } + } + + stream = Stream(data); + var headerChunk = readChunk(stream); + if (headerChunk.id != 'MThd' || headerChunk.length != 6) { + throw "Bad .mid file - header not found"; + } + var headerStream = Stream(headerChunk.data); + var formatType = headerStream.readInt16(); + var trackCount = headerStream.readInt16(); + var timeDivision = headerStream.readInt16(); + + if (timeDivision & 0x8000) { + throw "Expressing time division in SMTPE frames is not supported yet" + } else { + ticksPerBeat = timeDivision; + } + + var header = { + 'formatType': formatType, + 'trackCount': trackCount, + 'ticksPerBeat': ticksPerBeat + } + var tracks = []; + for (var i = 0; i < header.trackCount; i++) { + tracks[i] = []; + var trackChunk = readChunk(stream); + if (trackChunk.id != 'MTrk') { + throw "Unexpected chunk - expected MTrk, got "+ trackChunk.id; + } + var trackStream = Stream(trackChunk.data); + while (!trackStream.eof()) { + var event = readEvent(trackStream); + tracks[i].push(event); + //console.log(event); + } + } + + return { + 'header': header, + 'tracks': tracks + } +} +function Replayer(midiFile, synth) { + var trackStates = []; + var beatsPerMinute = 120; + var ticksPerBeat = midiFile.header.ticksPerBeat; + var channelCount = 16; + var channels = []; + var nextEventInfo; + var samplesToNextEvent; + + function Channel() { + + var generatorsByNote = {}; + var currentProgram = PianoProgram; + + function noteOn(note, velocity) { + if (generatorsByNote[note] && !generatorsByNote[note].released) { + /* playing same note before releasing the last one. BOO */ + generatorsByNote[note].noteOff(); /* TODO: check whether we ought to be passing a velocity in */ + } + generator = currentProgram.createNote(note, velocity); + synth.addGenerator(generator); + generatorsByNote[note] = generator; + } + function noteOff(note, velocity) { + if (generatorsByNote[note] && !generatorsByNote[note].released) { + generatorsByNote[note].noteOff(velocity); + } + } + function setProgram(programNumber) { + currentProgram = PROGRAMS[programNumber] || PianoProgram; + } + + return { + 'noteOn': noteOn, + 'noteOff': noteOff, + 'setProgram': setProgram + } + } + + function getNextEvent() { + var ticksToNextEvent = null; + var nextEventTrack = null; + var nextEventIndex = null; + + for (var i = 0; i < trackStates.length; i++) { + if ( + trackStates[i].ticksToNextEvent != null + && (ticksToNextEvent == null || trackStates[i].ticksToNextEvent < ticksToNextEvent) + ) { + ticksToNextEvent = trackStates[i].ticksToNextEvent; + nextEventTrack = i; + nextEventIndex = trackStates[i].nextEventIndex; + } + } + if (nextEventTrack != null) { + /* consume event from that track */ + var nextEvent = midiFile.tracks[nextEventTrack][nextEventIndex]; + if (midiFile.tracks[nextEventTrack][nextEventIndex + 1]) { + trackStates[nextEventTrack].ticksToNextEvent += midiFile.tracks[nextEventTrack][nextEventIndex + 1].deltaTime; + } else { + trackStates[nextEventTrack].ticksToNextEvent = null; + } + trackStates[nextEventTrack].nextEventIndex += 1; + /* advance timings on all tracks by ticksToNextEvent */ + for (var i = 0; i < trackStates.length; i++) { + if (trackStates[i].ticksToNextEvent != null) { + trackStates[i].ticksToNextEvent -= ticksToNextEvent + } + } + nextEventInfo = { + 'ticksToEvent': ticksToNextEvent, + 'event': nextEvent, + 'track': nextEventTrack + } + var beatsToNextEvent = ticksToNextEvent / ticksPerBeat; + var secondsToNextEvent = beatsToNextEvent / (beatsPerMinute / 60); + samplesToNextEvent += secondsToNextEvent * synth.sampleRate; + } else { + nextEventInfo = null; + samplesToNextEvent = null; + self.finished = true; + } + } + + function generate(samples) { + var data = new Array(samples*2); + var samplesRemaining = samples; + var dataOffset = 0; + + while (true) { + if (samplesToNextEvent != null && samplesToNextEvent <= samplesRemaining) { + /* generate samplesToNextEvent samples, process event and repeat */ + var samplesToGenerate = Math.ceil(samplesToNextEvent); + if (samplesToGenerate > 0) { + synth.generateIntoBuffer(samplesToGenerate, data, dataOffset); + dataOffset += samplesToGenerate * 2; + samplesRemaining -= samplesToGenerate; + samplesToNextEvent -= samplesToGenerate; + } + + handleEvent(); + getNextEvent(); + } else { + /* generate samples to end of buffer */ + if (samplesRemaining > 0) { + synth.generateIntoBuffer(samplesRemaining, data, dataOffset); + samplesToNextEvent -= samplesRemaining; + } + break; + } + } + return data; + } + + function handleEvent() { + var event = nextEventInfo.event; + switch (event.type) { + case 'meta': + switch (event.subtype) { + case 'setTempo': + beatsPerMinute = 60000000 / event.microsecondsPerBeat + } + break; + case 'channel': + switch (event.subtype) { + case 'noteOn': + channels[event.channel].noteOn(event.noteNumber, event.velocity); + break; + case 'noteOff': + channels[event.channel].noteOff(event.noteNumber, event.velocity); + break; + case 'programChange': + //console.log('program change to ' + event.programNumber); + channels[event.channel].setProgram(event.programNumber); + break; + } + break; + } + } + + function reset() { + for (var i = 0; i < midiFile.tracks.length; i++) { + trackStates[i] = { + 'nextEventIndex': 0, + 'ticksToNextEvent': ( + midiFile.tracks[i].length ? + midiFile.tracks[i][0].deltaTime : + null + ) + }; + } + for (var i = 0; i < channelCount; i++) { + channels[i] = Channel(); + } + samplesToNextEvent = 0; + getNextEvent(); + } + + reset(); + + var self = { + 'reset': reset, + 'generate': generate, + 'finished': false + } + return self; +} +/* Wrapper for accessing strings through sequential reads */ +function Stream(str) { + var position = 0; + + function read(length) { + var result = str.substr(position, length); + position += length; + return result; + } + + /* read a big-endian 32-bit integer */ + function readInt32() { + var result = ( + (str.charCodeAt(position) << 24) + + (str.charCodeAt(position + 1) << 16) + + (str.charCodeAt(position + 2) << 8) + + str.charCodeAt(position + 3)); + position += 4; + return result; + } + + /* read a big-endian 16-bit integer */ + function readInt16() { + var result = ( + (str.charCodeAt(position) << 8) + + str.charCodeAt(position + 1)); + position += 2; + return result; + } + + /* read an 8-bit integer */ + function readInt8(signed) { + var result = str.charCodeAt(position); + if (signed && result > 127) result -= 256; + position += 1; + return result; + } + + function eof() { + return position >= str.length; + } + + /* read a MIDI-style variable-length integer + (big-endian value in groups of 7 bits, + with top bit set to signify that another byte follows) + */ + function readVarInt() { + var result = 0; + while (true) { + var b = readInt8(); + if (b & 0x80) { + result += (b & 0x7f); + result <<= 7; + } else { + /* b is the last byte */ + return result + b; + } + } + } + + return { + 'eof': eof, + 'read': read, + 'readInt32': readInt32, + 'readInt16': readInt16, + 'readInt8': readInt8, + 'readVarInt': readVarInt + } +} +function SineGenerator(freq) { + var self = {'alive': true}; + var period = sampleRate / freq; + var t = 0; + + self.generate = function(buf, offset, count) { + for (; count; count--) { + var phase = t / period; + var result = Math.sin(phase * 2 * Math.PI); + buf[offset++] += result; + buf[offset++] += result; + t++; + } + } + + return self; +} + +function SquareGenerator(freq, phase) { + var self = {'alive': true}; + var period = sampleRate / freq; + var t = 0; + + self.generate = function(buf, offset, count) { + for (; count; count--) { + var result = ( (t / period) % 1 > phase ? 1 : -1); + buf[offset++] += result; + buf[offset++] += result; + t++; + } + } + + return self; +} + +function ADSRGenerator(child, attackAmplitude, sustainAmplitude, attackTimeS, decayTimeS, releaseTimeS) { + var self = {'alive': true} + var attackTime = sampleRate * attackTimeS; + var decayTime = sampleRate * (attackTimeS + decayTimeS); + var decayRate = (attackAmplitude - sustainAmplitude) / (decayTime - attackTime); + var releaseTime = null; /* not known yet */ + var endTime = null; /* not known yet */ + var releaseRate = sustainAmplitude / (sampleRate * releaseTimeS); + var t = 0; + + self.noteOff = function() { + if (self.released) return; + releaseTime = t; + self.released = true; + endTime = releaseTime + sampleRate * releaseTimeS; + } + + self.generate = function(buf, offset, count) { + if (!self.alive) return; + var input = new Array(count * 2); + for (var i = 0; i < count*2; i++) { + input[i] = 0; + } + child.generate(input, 0, count); + + childOffset = 0; + while(count) { + if (releaseTime != null) { + if (t < endTime) { + /* release */ + while(count && t < endTime) { + var ampl = sustainAmplitude - releaseRate * (t - releaseTime); + buf[offset++] += input[childOffset++] * ampl; + buf[offset++] += input[childOffset++] * ampl; + t++; + count--; + } + } else { + /* dead */ + self.alive = false; + return; + } + } else if (t < attackTime) { + /* attack */ + while(count && t < attackTime) { + var ampl = attackAmplitude * t / attackTime; + buf[offset++] += input[childOffset++] * ampl; + buf[offset++] += input[childOffset++] * ampl; + t++; + count--; + } + } else if (t < decayTime) { + /* decay */ + while(count && t < decayTime) { + var ampl = attackAmplitude - decayRate * (t - attackTime); + buf[offset++] += input[childOffset++] * ampl; + buf[offset++] += input[childOffset++] * ampl; + t++; + count--; + } + } else { + /* sustain */ + while(count) { + buf[offset++] += input[childOffset++] * sustainAmplitude; + buf[offset++] += input[childOffset++] * sustainAmplitude; + t++; + count--; + } + } + } + } + + return self; +} + +function midiToFrequency(note) { + return 440 * Math.pow(2, (note-69)/12); +} + +PianoProgram = { + 'attackAmplitude': 0.2, + 'sustainAmplitude': 0.1, + 'attackTime': 0.02, + 'decayTime': 0.3, + 'releaseTime': 0.02, + 'createNote': function(note, velocity) { + var frequency = midiToFrequency(note); + return ADSRGenerator( + SineGenerator(frequency), + this.attackAmplitude * (velocity / 128), this.sustainAmplitude * (velocity / 128), + this.attackTime, this.decayTime, this.releaseTime + ); + } +} + +StringProgram = { + 'createNote': function(note, velocity) { + var frequency = midiToFrequency(note); + return ADSRGenerator( + SineGenerator(frequency), + 0.5 * (velocity / 128), 0.2 * (velocity / 128), + 0.4, 0.8, 0.4 + ); + } +} + +PROGRAMS = { + 41: StringProgram, + 42: StringProgram, + 43: StringProgram, + 44: StringProgram, + 45: StringProgram, + 46: StringProgram, + 47: StringProgram, + 49: StringProgram, + 50: StringProgram +}; + +function Synth(sampleRate) { + + var generators = []; + + function addGenerator(generator) { + generators.push(generator); + } + + function generate(samples) { + var data = new Array(samples*2); + generateIntoBuffer(samples, data, 0); + return data; + } + + function generateIntoBuffer(samplesToGenerate, buffer, offset) { + for (var i = offset; i < offset + samplesToGenerate * 2; i++) { + buffer[i] = 0; + } + for (var i = generators.length - 1; i >= 0; i--) { + generators[i].generate(buffer, offset, samplesToGenerate); + if (!generators[i].alive) generators.splice(i, 1); + } + } + + return { + 'sampleRate': sampleRate, + 'addGenerator': addGenerator, + 'generate': generate, + 'generateIntoBuffer': generateIntoBuffer + } +} diff --git a/libs/thirdparty/mid.min.js b/libs/thirdparty/mid.min.js new file mode 100644 index 00000000..434a8ae9 --- /dev/null +++ b/libs/thirdparty/mid.min.js @@ -0,0 +1,3 @@ +var sampleRate=44100;function AudioPlayer(generator,opts){if(!opts){opts={}}var latency=opts.latency||1;var checkInterval=latency*100;var audioElement=new Audio();var webkitAudio=window.AudioContext||window.webkitAudioContext;var requestStop=false;if(audioElement.mozSetup){audioElement.mozSetup(2,sampleRate);var buffer=[];var minBufferLength=latency*2*sampleRate;var bufferFillLength=Math.floor(latency*sampleRate);function checkBuffer(){if(buffer.length){var written=audioElement.mozWriteAudio(buffer);buffer=buffer.slice(written)}if(buffer.length';document.body.appendChild(c);var swf=document.getElementById("da-swf");var minBufferDuration=latency*1000;var bufferFillLength=latency*sampleRate;function write(data){var out=new Array(data.length);for(var i=data.length-1;i!=0;i--){out[i]=Math.floor(data[i]*32768)}return swf.write(out.join(" "))}function checkBuffer(){if(swf.bufferedDuration()>4;event.channel=eventTypeByte&15;event.type="channel";switch(eventType){case 8:event.subtype="noteOff";event.noteNumber=param1;event.velocity=stream.readInt8();return event;case 9:event.noteNumber=param1;event.velocity=stream.readInt8();if(event.velocity==0){event.subtype="noteOff"}else{event.subtype="noteOn"}return event;case 10:event.subtype="noteAftertouch";event.noteNumber=param1;event.amount=stream.readInt8();return event;case 11:event.subtype="controller";event.controllerType=param1;event.value=stream.readInt8();return event;case 12:event.subtype="programChange";event.programNumber=param1;return event;case 13:event.subtype="channelAftertouch";event.amount=param1;return event;case 14:event.subtype="pitchBend";event.value=param1+(stream.readInt8()<<7);return event;default:throw"Unrecognised MIDI event type: "+eventType}}}stream=Stream(data);var headerChunk=readChunk(stream);if(headerChunk.id!="MThd"||headerChunk.length!=6){throw"Bad .mid file - header not found"}var headerStream=Stream(headerChunk.data);var formatType=headerStream.readInt16();var trackCount=headerStream.readInt16();var timeDivision=headerStream.readInt16();if(timeDivision&32768){throw"Expressing time division in SMTPE frames is not supported yet"}else{ticksPerBeat=timeDivision}var header={"formatType":formatType,"trackCount":trackCount,"ticksPerBeat":ticksPerBeat};var tracks=[];for(var i=0;i0){synth.generateIntoBuffer(samplesToGenerate,data,dataOffset);dataOffset+=samplesToGenerate*2;samplesRemaining-=samplesToGenerate;samplesToNextEvent-=samplesToGenerate}handleEvent();getNextEvent()}else{if(samplesRemaining>0){synth.generateIntoBuffer(samplesRemaining,data,dataOffset); +samplesToNextEvent-=samplesRemaining}break}}return data}function handleEvent(){var event=nextEventInfo.event;switch(event.type){case"meta":switch(event.subtype){case"setTempo":beatsPerMinute=60000000/event.microsecondsPerBeat}break;case"channel":switch(event.subtype){case"noteOn":channels[event.channel].noteOn(event.noteNumber,event.velocity);break;case"noteOff":channels[event.channel].noteOff(event.noteNumber,event.velocity);break;case"programChange":channels[event.channel].setProgram(event.programNumber);break}break}}function replay(audio){console.log("replay");audio.write(generate(44100));setTimeout(function(){replay(audio)},10)}var self={"replay":replay,"generate":generate,"finished":false};return self}function Stream(str){var position=0;function read(length){var result=str.substr(position,length);position+=length;return result}function readInt32(){var result=((str.charCodeAt(position)<<24)+(str.charCodeAt(position+1)<<16)+(str.charCodeAt(position+2)<<8)+str.charCodeAt(position+3));position+=4;return result}function readInt16(){var result=((str.charCodeAt(position)<<8)+str.charCodeAt(position+1));position+=2;return result}function readInt8(signed){var result=str.charCodeAt(position);if(signed&&result>127){result-=256}position+=1;return result}function eof(){return position>=str.length}function readVarInt(){var result=0;while(true){var b=readInt8();if(b&128){result+=(b&127);result<<=7}else{return result+b}}}return{"eof":eof,"read":read,"readInt32":readInt32,"readInt16":readInt16,"readInt8":readInt8,"readVarInt":readVarInt}}function SineGenerator(freq){var self={"alive":true};var period=sampleRate/freq;var t=0;self.generate=function(buf,offset,count){for(;count;count--){var phase=t/period;var result=Math.sin(phase*2*Math.PI);buf[offset++]+=result;buf[offset++]+=result;t++}};return self}function SquareGenerator(freq,phase){var self={"alive":true};var period=sampleRate/freq;var t=0;self.generate=function(buf,offset,count){for(;count;count--){var result=((t/period)%1>phase?1:-1);buf[offset++]+=result;buf[offset++]+=result;t++}};return self}function ADSRGenerator(child,attackAmplitude,sustainAmplitude,attackTimeS,decayTimeS,releaseTimeS){var self={"alive":true};var attackTime=sampleRate*attackTimeS;var decayTime=sampleRate*(attackTimeS+decayTimeS);var decayRate=(attackAmplitude-sustainAmplitude)/(decayTime-attackTime);var releaseTime=null;var endTime=null;var releaseRate=sustainAmplitude/(sampleRate*releaseTimeS);var t=0;self.noteOff=function(){if(self.released){return}releaseTime=t;self.released=true;endTime=releaseTime+sampleRate*releaseTimeS};self.generate=function(buf,offset,count){if(!self.alive){return}var input=new Array(count*2);for(var i=0;i=0;i--){generators[i].generate(buffer,offset,samplesToGenerate);if(!generators[i].alive){generators.splice(i,1)}}}return{"sampleRate":sampleRate,"addGenerator":addGenerator,"generate":generate,"generateIntoBuffer":generateIntoBuffer}}; \ No newline at end of file diff --git a/libs/ui.js b/libs/ui.js index 62ef59e8..ab9e226e 100644 --- a/libs/ui.js +++ b/libs/ui.js @@ -334,7 +334,8 @@ ui.prototype.drawSwitchs = function() { core.status.event.id = 'switchs'; var choices = [ - "背景音乐:"+(core.musicStatus.soundStatus ? "[ON]" : "[OFF]"), + "背景音乐:"+(core.musicStatus.bgmStatus ? "[ON]" : "[OFF]"), + "背景音效:"+(core.musicStatus.soundStatus ? "[ON]" : "[OFF]"), "战斗动画: " + (core.flags.battleAnimate ? "[ON]" : "[OFF]"), "怪物显伤: " + (core.flags.displayEnemyDamage ? "[ON]" : "[OFF]"), "领域显伤: " + (core.flags.displayExtraDamage ? "[ON]" : "[OFF]"), @@ -571,7 +572,7 @@ ui.prototype.drawBattleAnimate = function(monsterId, callback) { core.fillText("ui", "S", right_start-8, 208+15, "#FFFFFF", "italic bold 40px Verdana"); var battleInterval = setInterval(function() { - core.playSound("attack", "ogg"); + core.playSound("attack.ogg"); if (turn==0) { // 勇士攻击 diff --git a/main.js b/main.js index fe644e79..e5996f71 100644 --- a/main.js +++ b/main.js @@ -45,12 +45,13 @@ function main() { ]; this.images = [ 'animates', 'enemys', 'hero', 'items', 'npcs', 'terrains' - // Autotile 动态添加 ]; - this.sounds = { - 'mp3': ['bgm-loop', 'floor'], - 'ogg': ['attack', 'door', 'item'] - } + this.bgms = [ // 在此存放所有的bgm,和文件名一致。第一项为默认播放项 + '058-Slow01.mid', 'bgm.mp3', 'G2_koko.mid', 'star.mid' + ]; + this.sounds = [ // 在此存放所有的SE,和文件名一致 + 'floor.mp3', 'attack.ogg', 'door.ogg', 'item.ogg' + ] this.statusBar = { 'image': { 'floor': document.getElementById('img-floor'), @@ -97,7 +98,7 @@ function main() { // 如果要进行剧本的修改请务必将其改成false。 this.floorIds = [ // 在这里按顺序放所有的楼层;其顺序直接影响到楼层传送器的顺序和上楼器/下楼器的顺序 - "sample0", "sample1", "sample2", "test" + "sample0", "sample1", "sample2" ] //------------------------ 用户修改内容 END ------------------------// @@ -119,7 +120,7 @@ main.prototype.init = function () { coreData[name] = main[name]; } main.loaderFloors(function() { - main.core.init(main.dom, main.statusBar, main.canvas, main.images, main.sounds, main.floorIds, main.floors, coreData); + main.core.init(main.dom, main.statusBar, main.canvas, main.images, main.bgms, main.sounds, main.floorIds, main.floors, coreData); main.core.resize(main.dom.body.clientWidth, main.dom.body.clientHeight); }) }); @@ -222,18 +223,6 @@ main.dom.body.onselectstart = function () { return false; } -document.onmousemove = function() { - try { - main.core.loadSound(); - }catch (e) {} -} - -document.ontouchstart = function() { - try { - main.core.loadSound(); - }catch (e) {} -} - main.dom.data.onmousedown = function (e) { try { e.stopPropagation(); diff --git a/sounds/058-Slow01.mid b/sounds/058-Slow01.mid new file mode 100644 index 0000000000000000000000000000000000000000..05ce9228c590fc77d3959b0c8230c51ce44ea5ff GIT binary patch literal 6183 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 literal 0 HcmV?d00001 diff --git a/sounds/star.mid b/sounds/star.mid new file mode 100644 index 0000000000000000000000000000000000000000..cc78e5902ba32478f7d12796376e7e2ef8887485 GIT binary patch literal 15102 zcmeI3O>Z056^8G~N(iXnqJlJMNi-c&mPAXUw1_MSa0&s55r__g z1ZeDqJ!Hwrq6;xJIe$anilj}P?~gx`Ggta^CtkHyLSi>XxVwxJMJvcAAkS$()48c^}ExP{Y%Ab92BpeSiY&$N2#8r@sj(}-SJX#X+jPr zN{dTlrP;eNLu2dnX`wg0&oc>6 zX2zI#l4xEGc?_Dlc8FY&BUp}LG2lf3D+1QZhfyVqHN7K314PVc7(8q!bRC(20Ek26*&Ur%mGB*B%G{w zB2k`##B)LJVPH`>HC(KtMgk=2=)y(eb#&sQ@Osn}6}l*#YR|GPvIgXAxDpe_)mP*MYNkU|aNAQcpZ&_N@J z!*CZNDAa-KaFHrr;&*}Hpp=@E@*qDZ$``5R0ESGv11F)w01ih10m4BR!sSAH7EF-I z?<5OjB_&N+3t5vOO}!RO1Zf@?VgIjp@Bh>%b83zKY_0E(T4O(3V?XY)$@p zf1kSSG`K4p+>}i1mw{L@cde4D_3KNex{5Ax+nz$7~V!H@< z2!e14c?bt_5+2+ML44uCIgSw3DB{4L5?m=Lp+hGG2_X(S5Qw{9nz3nr@~2v$qEw{c8CVIP=nhEqiV=TSm7jaV4}i47hEX_ zp@T*c2X@K;LBfbbM(aaR_7DWk2{?#Tghx9{ERRSgl7Vm$1PLJyf*=_Msd5r%m5I1r}qf<7)y6k0hfORn-?C*Jh`iuJXRkfZ-JL^2dt+VH?v*-PnJ#T&Pl(Rmc zF5kX4y>R?r(+j=#CKx9e#~H^NM;J#KZQF~)DYnHQ<9w_wzHPhh{7m?^^NYuS#`^jm z?fmWQyPJRf{t~ax-g~y~ruDIHx1FB}-*$c`d=o$0b`w9_cH8-x@NMU3!Z-1=Z8!0= zZMU7D3I8h3TUUAB8f6@1%roX0vy53r+x7x+3T^Rooafr&+qT=z&xCI~KNG%*pKZH| zpKZJC{7m?^^E2U__}R9b_}RAG&d-EzJ3kY?iJxt|iJxt|?fgvmw)2a}Z|fC}sLx(i z8}y1c=#OvEE83t}^nhN`2EC#UdPTP$&>wH|JXED$)TCcjrC-#fUsR=E)TCcjrC(&- z&ht!_eo+{oeo>WvQ5fI0{r^1wt_Gfh#!VWtt?_vLV_gk&HPF>SR|8!QbTtrYfM?t) zJ)|Z*q$)k6COxDoJ)|Z*q$)k6rfoaVxK(;cVSIW>ReDHaeA{;0`I+!-=NFH^_dH#t(H9pB`X>5Hi9|+X= z;z9FF!jqXHW}YN^Q4AL`Xy)1>a>W3_1_%}dE-(L+WU`|VWgIH?x59vf;yg$VHSo&> zc$okf7%wnJJ^5;;##b{`ca~+?uX@z;;Fx+HG`2pMFC1!o;XuU#o=JFeFu=@{M9+)i zJO<5NJ4CKH2k~btX$c%nKFMf)h) zL(xEFLFhd+E-Lm=wXg9R0TMpC@KCsqPCOLuM?F!Yhr+4$EXyLRkOg6{rcv*M zyYr{Yw|+@o{ Date: Fri, 29 Dec 2017 12:29:21 +0800 Subject: [PATCH 15/25] Music --- test.js | 0 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 test.js diff --git a/test.js b/test.js deleted file mode 100644 index e69de29b..00000000 From 02b67f3c4023f09bcc29141ebc38d1401aa6e5be Mon Sep 17 00:00:00 2001 From: oc Date: Fri, 29 Dec 2017 12:32:18 +0800 Subject: [PATCH 16/25] Music --- libs/events.js | 2 +- main.js | 2 +- sounds/G2_koko.mid | Bin 31666 -> 0 bytes sounds/heianmigong.mid | Bin 0 -> 13813 bytes 4 files changed, 2 insertions(+), 2 deletions(-) delete mode 100644 sounds/G2_koko.mid create mode 100644 sounds/heianmigong.mid diff --git a/libs/events.js b/libs/events.js index 7d8f955f..f4ff1ea8 100644 --- a/libs/events.js +++ b/libs/events.js @@ -142,7 +142,7 @@ events.prototype.afterChangeFloor = function (floorId) { core.playBgm('star.mid'); } if (floorId == 'sample2') { - core.playBgm('058-G2_koko.mid'); + core.playBgm('G2_koko.mid'); } } diff --git a/main.js b/main.js index e5996f71..912a34f8 100644 --- a/main.js +++ b/main.js @@ -47,7 +47,7 @@ function main() { 'animates', 'enemys', 'hero', 'items', 'npcs', 'terrains' ]; this.bgms = [ // 在此存放所有的bgm,和文件名一致。第一项为默认播放项 - '058-Slow01.mid', 'bgm.mp3', 'G2_koko.mid', 'star.mid' + '058-Slow01.mid', 'bgm.mp3', 'heianmigong.mid', 'star.mid' ]; this.sounds = [ // 在此存放所有的SE,和文件名一致 'floor.mp3', 'attack.ogg', 'door.ogg', 'item.ogg' diff --git a/sounds/G2_koko.mid b/sounds/G2_koko.mid deleted file mode 100644 index 430e1a73dff6f1d1d1911bca0df8ebf1f74eecb9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 31666 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 diff --git a/sounds/heianmigong.mid b/sounds/heianmigong.mid new file mode 100644 index 0000000000000000000000000000000000000000..febdc238fae2323063d02ac821fde8ab591ddd9a GIT binary patch literal 13813 zcmeI3-)~c87{}kUb4F!$B;w9h1B`6WZZxA1NJDeBw00>BSy15ynf)u3yZ4{zesl2Cv**ta4T|Z&ur}RfiRqWGXw#a| zeiaFAI@6*}XIsWDPsHrtM4Xq!E5R#icaFyF0JL#54oyHUs0B?x^$MS`$J)>^v1+2FPxL~2p^}fg0&&|J;v5ru zI_H`!_!2#KWVFXN${L}{e#}lG-^h_;&Fg%SNAzH*2SaK1h%`PNW8oMJ$Dzlek}nJ3 zgLEHhG<=DEeCWpqPa}j$Z$E_(Df`^SN%l{&KfwBc9fC%n#>5Hu6WH;nlX>I->53He z3`hm(DvC0w+CTI}z?=B<=Cf>3(m-+);B!&Kn_5z#kn1pRh%-x?hwL zWv{q(Ud#XpGfjPB20)kr5bgp9GXTO2fG~15+Nb4lAdiQ6yvpN#9#C)q1!$uKD6rP( z01E6kI)DPQjSirIUZ+dfYyb-E1(6G)6GY!R=Ku;AF%i=9RgBZNtBA7J2U*N?M#z`+3=^31jaI6xy%BhSn` zfJ2!&nMV$h?npt;fK-s~q9_BaO?bVyyl7CAC-`oAm7+Kl$gh}`lWC~km%LZ5hQ|xL zw#G6VX;elfd2jz&ge}9B;mds1rpxol4ZGe%d6VHzh&w4RNH7iF$ho8Ej-WSEo`63} zdLhlfI(w?&aPx)z3HK13XZx5*&xO1** z@SOKFkwRT%Cbl8z=9kx;EgzvON&rOz%Xb8Y830~)tpgR?#bBSredg5 zKUIgv?N!xFTVtkuTnpY7KMJt~t}Qhs#1go+1g`xFt}SIOZOOfpO&v&|x_%(tJaq(m zB)wy*Yp~^d*Pt=gm4>D_pigUma69MfoC{4upVm1tu6p*BAM5JgO}@I_KB$+k&GPww z_f z)iHePddKjN$}^3}50%#+m&#|N=KrYw8hS1GbEt+I%D=TbZB~zZ`SW{1`(~4#;Q6+V zv)YC~D$^lF*YfeK^WfKv-#z~n63YRhE%W2#Wj>Qw<}-=E_)KD%A2Tm!!&Rb5@pDM5 jAiBbDb5;;tLG&S_D~PUS!($^4-QVW$M{M-spECXi2&$Em literal 0 HcmV?d00001 From 7e832d0496eddbb9a794e7e46da776d38ab02ac8 Mon Sep 17 00:00:00 2001 From: oc Date: Fri, 29 Dec 2017 12:39:49 +0800 Subject: [PATCH 17/25] Music --- libs/events.js | 2 +- main.js | 2 +- sounds/heianmigong.mid | Bin 13813 -> 0 bytes sounds/qianjin.mid | Bin 0 -> 59708 bytes 4 files changed, 2 insertions(+), 2 deletions(-) delete mode 100644 sounds/heianmigong.mid create mode 100644 sounds/qianjin.mid diff --git a/libs/events.js b/libs/events.js index f4ff1ea8..6f1f9710 100644 --- a/libs/events.js +++ b/libs/events.js @@ -142,7 +142,7 @@ events.prototype.afterChangeFloor = function (floorId) { core.playBgm('star.mid'); } if (floorId == 'sample2') { - core.playBgm('G2_koko.mid'); + core.playBgm('qianjin.mid'); } } diff --git a/main.js b/main.js index 912a34f8..57d8f93c 100644 --- a/main.js +++ b/main.js @@ -47,7 +47,7 @@ function main() { 'animates', 'enemys', 'hero', 'items', 'npcs', 'terrains' ]; this.bgms = [ // 在此存放所有的bgm,和文件名一致。第一项为默认播放项 - '058-Slow01.mid', 'bgm.mp3', 'heianmigong.mid', 'star.mid' + '058-Slow01.mid', 'bgm.mp3', 'qianjin.mid', 'star.mid' ]; this.sounds = [ // 在此存放所有的SE,和文件名一致 'floor.mp3', 'attack.ogg', 'door.ogg', 'item.ogg' diff --git a/sounds/heianmigong.mid b/sounds/heianmigong.mid deleted file mode 100644 index febdc238fae2323063d02ac821fde8ab591ddd9a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13813 zcmeI3-)~c87{}kUb4F!$B;w9h1B`6WZZxA1NJDeBw00>BSy15ynf)u3yZ4{zesl2Cv**ta4T|Z&ur}RfiRqWGXw#a| zeiaFAI@6*}XIsWDPsHrtM4Xq!E5R#icaFyF0JL#54oyHUs0B?x^$MS`$J)>^v1+2FPxL~2p^}fg0&&|J;v5ru zI_H`!_!2#KWVFXN${L}{e#}lG-^h_;&Fg%SNAzH*2SaK1h%`PNW8oMJ$Dzlek}nJ3 zgLEHhG<=DEeCWpqPa}j$Z$E_(Df`^SN%l{&KfwBc9fC%n#>5Hu6WH;nlX>I->53He z3`hm(DvC0w+CTI}z?=B<=Cf>3(m-+);B!&Kn_5z#kn1pRh%-x?hwL zWv{q(Ud#XpGfjPB20)kr5bgp9GXTO2fG~15+Nb4lAdiQ6yvpN#9#C)q1!$uKD6rP( z01E6kI)DPQjSirIUZ+dfYyb-E1(6G)6GY!R=Ku;AF%i=9RgBZNtBA7J2U*N?M#z`+3=^31jaI6xy%BhSn` zfJ2!&nMV$h?npt;fK-s~q9_BaO?bVyyl7CAC-`oAm7+Kl$gh}`lWC~km%LZ5hQ|xL zw#G6VX;elfd2jz&ge}9B;mds1rpxol4ZGe%d6VHzh&w4RNH7iF$ho8Ej-WSEo`63} zdLhlfI(w?&aPx)z3HK13XZx5*&xO1** z@SOKFkwRT%Cbl8z=9kx;EgzvON&rOz%Xb8Y830~)tpgR?#bBSredg5 zKUIgv?N!xFTVtkuTnpY7KMJt~t}Qhs#1go+1g`xFt}SIOZOOfpO&v&|x_%(tJaq(m zB)wy*Yp~^d*Pt=gm4>D_pigUma69MfoC{4upVm1tu6p*BAM5JgO}@I_KB$+k&GPww z_f z)iHePddKjN$}^3}50%#+m&#|N=KrYw8hS1GbEt+I%D=TbZB~zZ`SW{1`(~4#;Q6+V zv)YC~D$^lF*YfeK^WfKv-#z~n63YRhE%W2#Wj>Qw<}-=E_)KD%A2Tm!!&Rb5@pDM5 jAiBbDb5;;tLG&S_D~PUS!($^4-QVW$M{M-spECXi2&$Em diff --git a/sounds/qianjin.mid b/sounds/qianjin.mid new file mode 100644 index 0000000000000000000000000000000000000000..b4236a960165dbf7f5d17c096866722bc20df101 GIT binary patch literal 59708 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 aF^nz$@LYq~a#3iLIpsunnq36Ex%_`_K{}`a literal 0 HcmV?d00001 From 53ba0d4f5119ea9d0c8614490618cd303439b313 Mon Sep 17 00:00:00 2001 From: oc Date: Fri, 29 Dec 2017 16:47:09 +0800 Subject: [PATCH 18/25] Update BGM --- libs/core.js | 3 +-- libs/enemys.js | 23 +++++++++++++++-------- libs/events.js | 4 ++++ libs/floors/sample0.js | 1 - libs/floors/sample1.js | 5 +++-- libs/items.js | 2 +- libs/thirdparty/mid.min.js | 3 --- libs/ui.js | 4 ++-- main.js | 2 ++ 更新说明.txt | 3 ++- 10 files changed, 30 insertions(+), 20 deletions(-) delete mode 100644 libs/thirdparty/mid.min.js diff --git a/libs/core.js b/libs/core.js index d89d08cf..502a5130 100644 --- a/libs/core.js +++ b/libs/core.js @@ -335,8 +335,7 @@ core.prototype.loadMusic = function (callback) { } else { var music = new Audio(); - if (!core.musicStatus.startDirectly) - music.preload = 'none'; // 默认不加载 + music.preload = core.musicStatus.startDirectly?'auto':'none'; music.src = 'sounds/'+t; music.loop = 'loop'; core.material.bgms[t] = music; diff --git a/libs/enemys.js b/libs/enemys.js index c08ae30e..00541d09 100644 --- a/libs/enemys.js +++ b/libs/enemys.js @@ -101,6 +101,8 @@ enemys.prototype.getSpecialText = function (enemyId) { if (this.hasSpecial(special, 16)) text.push("夹击"); if (this.hasSpecial(special, 17)) text.push("仇恨"); if (this.hasSpecial(special, 18)) text.push("阻击"); + if (this.hasSpecial(special, 19)) text.push("自爆"); + if (this.hasSpecial(special, 20)) text.push("无敌"); return text.join(" "); } @@ -161,22 +163,27 @@ enemys.prototype.getCriticalDamage = function (monsterId) { // 1防减伤计算 enemys.prototype.getDefDamage = function (monsterId) { var monster = core.material.enemys[monsterId]; - return this.calDamage(core.status.hero.atk, core.status.hero.def, core.status.hero.mdef, - monster.hp, monster.atk, monster.def, monster.special) - - this.calDamage(core.status.hero.atk, core.status.hero.def + 1, core.status.hero.mdef, - monster.hp, monster.atk, monster.def, monster.special) + var nowDamage = this.calDamage(core.status.hero.atk, core.status.hero.def, core.status.hero.mdef, + monster.hp, monster.atk, monster.def, monster.special); + if (nowDamage == 999999999) return "???"; + return nowDamage - this.calDamage(core.status.hero.atk, core.status.hero.def + 1, core.status.hero.mdef, + monster.hp, monster.atk, monster.def, monster.special); } enemys.prototype.calDamage = function (hero_atk, hero_def, hero_mdef, mon_hp, mon_atk, mon_def, mon_special) { - // 魔攻 - if (this.hasSpecial(mon_special,2)) hero_def = 0; - // 坚固 - if (this.hasSpecial(mon_special,3) && mon_def < hero_atk - 1) mon_def = hero_atk - 1; + + if (this.hasSpecial(mon_special, 20) && !core.hasItem("cross")) // 如果是无敌属性,且勇士未持有十字架 + return 999999999; // 返回无限大 + // 模仿 if (this.hasSpecial(mon_special,10)) { mon_atk = hero_atk; mon_def = hero_def; } + // 魔攻 + if (this.hasSpecial(mon_special,2)) hero_def = 0; + // 坚固 + if (this.hasSpecial(mon_special,3) && mon_def < hero_atk - 1) mon_def = hero_atk - 1; if (hero_atk <= mon_def) return 999999999; // 不可战斗时请直接返回999999999 var per_damage = mon_atk - hero_def; diff --git a/libs/events.js b/libs/events.js index 6f1f9710..e82bfc8e 100644 --- a/libs/events.js +++ b/libs/events.js @@ -540,6 +540,10 @@ events.prototype.afterBattle = function(enemyId,x,y,callback) { if (core.enemys.hasSpecial(special, 17)) { core.setFlag('hatred', parseInt(core.getFlag('hatred', 0)/2)); } + // 自爆 + if (core.enemys.hasSpecial(special, 19)) { + core.status.hero.hp = 1; + } // 增加仇恨值 core.setFlag('hatred', core.getFlag('hatred',0)+core.values.hatred); core.updateStatusBar(); diff --git a/libs/floors/sample0.js b/libs/floors/sample0.js index 761bc5ed..1fab84e8 100644 --- a/libs/floors/sample0.js +++ b/libs/floors/sample0.js @@ -102,7 +102,6 @@ main.floors.sample0 = { "炸弹是只能炸面前的怪物还是四个方向的怪物,由data.js中的系统Flag所决定。\n如只能炸前方怪物则和上面的圣锤等价。\n不能被炸的怪物在enemys中可以定义,可参见样板里黑衣魔王和黑暗大法师的写法。", ], "10,4": ["“上楼”和“下楼”的目标层由 main.js 的 floorIds顺序所决定。"], - "10,3": ["十字架目前未被定义,可能需要自行实现功能。\n有关如何实现一个道具功能参见doc文档。"], "9,2": ["该道具默认是大黄门钥匙,如需改为钥匙盒直接修改 data.js 中的系统Flag即可。"], "10,2": ["屠龙匕首目前未被定义,可能需要自行实现功能。\n有关如何实现一个道具功能参见doc文档。"], }, diff --git a/libs/floors/sample1.js b/libs/floors/sample1.js index b28c41d1..3934514b 100644 --- a/libs/floors/sample1.js +++ b/libs/floors/sample1.js @@ -31,8 +31,9 @@ main.floors.sample1 = { "4,10": [ // 走到中间时的提示 "\t[样板提示]本层楼将会对各类事件进行介绍。", "左边是一个仿50层的陷阱做法,上方是商店、快捷商店的使用方法,右上是一个典型的杀怪开门的例子,右下是各类可能的NPC事件。", - "本样板目前支持的事件列表大致有:\ntext: 显示一段文字(比如你现在正在看到的)\ntip: 左上角显示提示\nshow: 使一个事件有效(可见、可被交互)\nhide: 使一个事件失效(不可见、不可被交互)\ntrigger: 触发另一个地点的事件\nbattle: 强制和某怪物战斗\nopenDoor: 无需钥匙开门(例如机关门、暗墙)\nopenShop: 打开一个全局商店\ndisableShop: 禁用一个全局商店\nchangeFloor: 传送勇士到某层某位置\nchangePos: 传送勇士到当层某位置;转向\nsetFg: 更改画面色调", - "move: 移动事件效果\nmoveHero: 移动勇士效果\nplaySound: 播放某个音频\nif: 条件判断\nchoices: 提供选项\nsetValue: 设置勇士属性道具,或某个变量/flag\nupdate: 更新状态栏和地图显伤\nwin: 获得胜利(游戏通关)\nlose: 游戏失败\nsleep: 等待多少毫秒\nexit: 立刻结束当前事件\nrevisit: 立刻结束事件并重新触发\nfunction: 自定义JS脚本\n更多支持的事件还在编写中,欢迎您宝贵的意见。", + "本样板目前支持的事件列表大致有:\ntext: 显示一段文字(比如你现在正在看到的)\ntip: 左上角显示提示\nshow: 使一个事件有效(可见、可被交互)\nhide: 使一个事件失效(不可见、不可被交互)\ntrigger: 触发另一个地点的事件\nbattle: 强制和某怪物战斗\nopenDoor: 无需钥匙开门(例如机关门、暗墙)", + "openShop: 打开一个全局商店\ndisableShop: 禁用一个全局商店\nchangeFloor: 传送勇士到某层某位置\nchangePos: 传送勇士到当层某位置;转向\nsetFg: 更改画面色调\nmove: 移动事件效果\nmoveHero: 移动勇士效果\nplayBgm: 播放某个背景音乐\npauseBgm: 暂停背景音乐\nresumeBgm: 恢复背景音乐的播放\nplaySound: 播放某个音频", + "if: 条件判断\nchoices: 提供选项\nsetValue: 设置勇士属性道具,或某个变量/flag\nupdate: 更新状态栏和地图显伤\nwin: 获得胜利(游戏通关)\nlose: 游戏失败\nsleep: 等待多少毫秒\nexit: 立刻结束当前事件\nrevisit: 立刻结束事件并重新触发\nfunction: 自定义JS脚本\n\n更多支持的事件还在编写中,欢迎您宝贵的意见。", "有关各事件的样例,可参见本层一些NPC的写法。\n所有事件样例本层都有介绍。\n\n一个自定义事件处理完后,需要调用{\"type\": \"hide\"}该事件才不会再次出现。", {"type": "hide"} ], diff --git a/libs/items.js b/libs/items.js index 0605a16e..449d2980 100644 --- a/libs/items.js +++ b/libs/items.js @@ -36,7 +36,7 @@ items.prototype.init = function () { 'fly': {'cls': 'constants', 'name': '楼层传送器', 'text': '可以自由往来去过的楼层'}, 'coin': {'cls': 'constants', 'name': '幸运金币', 'text': '持有时打败怪物可得双倍金币'}, 'snow': {'cls': 'constants', 'name': '冰冻徽章', 'text': '可以将四周的熔岩变成平地'}, - 'cross': {'cls': 'constants', 'name': '十字架', 'text': '该道具尚未被定义'}, + 'cross': {'cls': 'constants', 'name': '十字架', 'text': '持有后无视怪物的无敌属性'}, 'knife': {'cls': 'constants', 'name': '屠龙匕首', 'text': '该道具尚未被定义'}, 'shoes': {'cls': 'constants', 'name': '绿鞋', 'text': '持有时无视负面地形'}, diff --git a/libs/thirdparty/mid.min.js b/libs/thirdparty/mid.min.js deleted file mode 100644 index 434a8ae9..00000000 --- a/libs/thirdparty/mid.min.js +++ /dev/null @@ -1,3 +0,0 @@ -var sampleRate=44100;function AudioPlayer(generator,opts){if(!opts){opts={}}var latency=opts.latency||1;var checkInterval=latency*100;var audioElement=new Audio();var webkitAudio=window.AudioContext||window.webkitAudioContext;var requestStop=false;if(audioElement.mozSetup){audioElement.mozSetup(2,sampleRate);var buffer=[];var minBufferLength=latency*2*sampleRate;var bufferFillLength=Math.floor(latency*sampleRate);function checkBuffer(){if(buffer.length){var written=audioElement.mozWriteAudio(buffer);buffer=buffer.slice(written)}if(buffer.length';document.body.appendChild(c);var swf=document.getElementById("da-swf");var minBufferDuration=latency*1000;var bufferFillLength=latency*sampleRate;function write(data){var out=new Array(data.length);for(var i=data.length-1;i!=0;i--){out[i]=Math.floor(data[i]*32768)}return swf.write(out.join(" "))}function checkBuffer(){if(swf.bufferedDuration()>4;event.channel=eventTypeByte&15;event.type="channel";switch(eventType){case 8:event.subtype="noteOff";event.noteNumber=param1;event.velocity=stream.readInt8();return event;case 9:event.noteNumber=param1;event.velocity=stream.readInt8();if(event.velocity==0){event.subtype="noteOff"}else{event.subtype="noteOn"}return event;case 10:event.subtype="noteAftertouch";event.noteNumber=param1;event.amount=stream.readInt8();return event;case 11:event.subtype="controller";event.controllerType=param1;event.value=stream.readInt8();return event;case 12:event.subtype="programChange";event.programNumber=param1;return event;case 13:event.subtype="channelAftertouch";event.amount=param1;return event;case 14:event.subtype="pitchBend";event.value=param1+(stream.readInt8()<<7);return event;default:throw"Unrecognised MIDI event type: "+eventType}}}stream=Stream(data);var headerChunk=readChunk(stream);if(headerChunk.id!="MThd"||headerChunk.length!=6){throw"Bad .mid file - header not found"}var headerStream=Stream(headerChunk.data);var formatType=headerStream.readInt16();var trackCount=headerStream.readInt16();var timeDivision=headerStream.readInt16();if(timeDivision&32768){throw"Expressing time division in SMTPE frames is not supported yet"}else{ticksPerBeat=timeDivision}var header={"formatType":formatType,"trackCount":trackCount,"ticksPerBeat":ticksPerBeat};var tracks=[];for(var i=0;i0){synth.generateIntoBuffer(samplesToGenerate,data,dataOffset);dataOffset+=samplesToGenerate*2;samplesRemaining-=samplesToGenerate;samplesToNextEvent-=samplesToGenerate}handleEvent();getNextEvent()}else{if(samplesRemaining>0){synth.generateIntoBuffer(samplesRemaining,data,dataOffset); -samplesToNextEvent-=samplesRemaining}break}}return data}function handleEvent(){var event=nextEventInfo.event;switch(event.type){case"meta":switch(event.subtype){case"setTempo":beatsPerMinute=60000000/event.microsecondsPerBeat}break;case"channel":switch(event.subtype){case"noteOn":channels[event.channel].noteOn(event.noteNumber,event.velocity);break;case"noteOff":channels[event.channel].noteOff(event.noteNumber,event.velocity);break;case"programChange":channels[event.channel].setProgram(event.programNumber);break}break}}function replay(audio){console.log("replay");audio.write(generate(44100));setTimeout(function(){replay(audio)},10)}var self={"replay":replay,"generate":generate,"finished":false};return self}function Stream(str){var position=0;function read(length){var result=str.substr(position,length);position+=length;return result}function readInt32(){var result=((str.charCodeAt(position)<<24)+(str.charCodeAt(position+1)<<16)+(str.charCodeAt(position+2)<<8)+str.charCodeAt(position+3));position+=4;return result}function readInt16(){var result=((str.charCodeAt(position)<<8)+str.charCodeAt(position+1));position+=2;return result}function readInt8(signed){var result=str.charCodeAt(position);if(signed&&result>127){result-=256}position+=1;return result}function eof(){return position>=str.length}function readVarInt(){var result=0;while(true){var b=readInt8();if(b&128){result+=(b&127);result<<=7}else{return result+b}}}return{"eof":eof,"read":read,"readInt32":readInt32,"readInt16":readInt16,"readInt8":readInt8,"readVarInt":readVarInt}}function SineGenerator(freq){var self={"alive":true};var period=sampleRate/freq;var t=0;self.generate=function(buf,offset,count){for(;count;count--){var phase=t/period;var result=Math.sin(phase*2*Math.PI);buf[offset++]+=result;buf[offset++]+=result;t++}};return self}function SquareGenerator(freq,phase){var self={"alive":true};var period=sampleRate/freq;var t=0;self.generate=function(buf,offset,count){for(;count;count--){var result=((t/period)%1>phase?1:-1);buf[offset++]+=result;buf[offset++]+=result;t++}};return self}function ADSRGenerator(child,attackAmplitude,sustainAmplitude,attackTimeS,decayTimeS,releaseTimeS){var self={"alive":true};var attackTime=sampleRate*attackTimeS;var decayTime=sampleRate*(attackTimeS+decayTimeS);var decayRate=(attackAmplitude-sustainAmplitude)/(decayTime-attackTime);var releaseTime=null;var endTime=null;var releaseRate=sustainAmplitude/(sampleRate*releaseTimeS);var t=0;self.noteOff=function(){if(self.released){return}releaseTime=t;self.released=true;endTime=releaseTime+sampleRate*releaseTimeS};self.generate=function(buf,offset,count){if(!self.alive){return}var input=new Array(count*2);for(var i=0;i=0;i--){generators[i].generate(buffer,offset,samplesToGenerate);if(!generators[i].alive){generators.splice(i,1)}}}return{"sampleRate":sampleRate,"addGenerator":addGenerator,"generate":generate,"generateIntoBuffer":generateIntoBuffer}}; \ No newline at end of file diff --git a/libs/ui.js b/libs/ui.js index ab9e226e..bbb85c16 100644 --- a/libs/ui.js +++ b/libs/ui.js @@ -390,12 +390,12 @@ ui.prototype.drawBattleAnimate = function(monsterId, callback) { hero_hp -= core.enemys.getExtraDamage(monster); - if (core.enemys.hasSpecial(mon_special, 2)) hero_def=0; // 魔攻 - if (core.enemys.hasSpecial(mon_special, 3) && mon_def Date: Fri, 29 Dec 2017 18:00:12 +0800 Subject: [PATCH 19/25] Update damage --- libs/enemys.js | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/libs/enemys.js b/libs/enemys.js index 00541d09..95a19585 100644 --- a/libs/enemys.js +++ b/libs/enemys.js @@ -165,9 +165,10 @@ enemys.prototype.getDefDamage = function (monsterId) { var monster = core.material.enemys[monsterId]; var nowDamage = this.calDamage(core.status.hero.atk, core.status.hero.def, core.status.hero.mdef, monster.hp, monster.atk, monster.def, monster.special); - if (nowDamage == 999999999) return "???"; - return nowDamage - this.calDamage(core.status.hero.atk, core.status.hero.def + 1, core.status.hero.mdef, + var nextDamage = this.calDamage(core.status.hero.atk, core.status.hero.def + 1, core.status.hero.mdef, monster.hp, monster.atk, monster.def, monster.special); + if (nowDamage == 999999999 || nextDamage == 999999999) return "???"; + return nowDamage - nextDamage; } enemys.prototype.calDamage = function (hero_atk, hero_def, hero_mdef, mon_hp, mon_atk, mon_def, mon_special) { From 356dc647b446e436f616f8411be22a0fe744637b Mon Sep 17 00:00:00 2001 From: oc Date: Fri, 29 Dec 2017 21:58:41 +0800 Subject: [PATCH 20/25] Support Hue --- 常用工具/便捷PS工具.exe | Bin 18432 -> 19968 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/常用工具/便捷PS工具.exe b/常用工具/便捷PS工具.exe index c27e7010697dfd6e7338f859751e43de674b6a2e..a85e29fdd920ea29a553c1ac2f55718a1362bc92 100644 GIT binary patch delta 8624 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 delta 7462 zcma)B3vd+ImA&uHOm|O@7??p{keC)AJW_8%$&{-vnU<2xA&%1T2w6 zj{=E5q+G}y98;lECQbmGP5jZuF||ttCng&hj_ zXf%_gDnreA_xJ93@4ip>h|CF*IVz4mv~+C8f_3D7-XZ zvnNZUAglOfTY9qpN<;JsM7Obd6Va$pfA#313{es58;C01_Lh2gt+>Vf!yK3_eCN84 zhza3MkTiUo-4{h7oPh)aTI{|h#!tG;{P=tpUr8Z)9bF$9M%=K{ zrK}o}j1ifVQLCeY2W6`elik6<-N66`>)x$RbX$Y5g~d>0H%Nna9pdpFJtat66$!

T5G2!NPJtR{rvnRW!L(}yJ9(#AOdo?t-%99JyY4)vZxbAFiR%O8?FeI?n z-SJuDg`-t6L~qSkW`~}$OVR2(7v5nTbh5!%V5uR zi^FZA%H1BGAf)@%u(gOe?IdFCT0n1z^K_%^K$g`u^pmV^p2l^tXCkoa7KmO*Q>AdP zhikAM%FKGFiBru2Xvx_u-oc_5n6P9w*JB+EJiT>l*)(t2R6%4nPp)*{moQq{&66sf zcHnRA4u21DHtwa;x+lU>Cp|O>JvRvKO`cF*G!uA(@b``ygg@PN(-(Skt-nKd^A@Nd zjf2ZVFPFjJ7qXj|Ub$G{z2~rx6@QVx7=XJQ_f4=q;Ngq+4fDck2jN zGQEN$?;i4$+AEdJS-tJ!5wfnO&T*R0A)sp#pYyh%(9+T@rIVd(>Uxfod;fJ#_LSTA zWV{RE@m?vDM<|QGSWooC*sr zkvo56u`{eD>?-qX!ik30gmo=d#{CLw!meCRxFl>ztxz0l^sN8&l9W1dWox1m`8Dz6 z)kED;6Wl0yHQ~K)eT2nLtjR72le0OsEl19JVp*bW`0BH*T+P(+JM8BUYZV}<$VvkYon<9XD4gDL92C_8&n7jx{a7qYXh(q~ukTy@7^bT(w!Sq6K!fSoT* zkG-($>`A?rV`sgPoo!VI1i1?+z|j`NQl%cZt=?D%m|X0KNRWZBxqi{3kYx3f9bn9I+4 zqBc>K%P+f?E$q)+b!g!ZYgOI^pZ_cgKXj}QF$L=`zO9Gd>+DG_%ki+Dn4iz1Y^Kkn zI;_p{Si@*o_Gs=C*#E4H#T< zBX5+l2av$u;EdbP?6P4N>9O=EpZB-(_t=QX?$lTcoH4ZO=pV5AV zs)`COO{z>u4yjw0>_k(V+yP8u)wJaOY#t|*Hn*dvNQb6ld*BHdJ2(;Pij%wHsJBwb zFyza4?0PTA_8v}<0+?Ec<5Y0nn1eNtkuIZJ@AVq%LAbhONlZXXT|^!gWv5l|F60#G zhZ~RA!qpW5Sw@*LynO?cEB?oDzJ^2-4kDpR^xwFVC$x2?I(KbDD(IO0 zzhgU2Sk*>nu*CRfLKBv(YF&u-CFqygw_vA@B~Tv;;(JTJCGhS=^l{B}LVp(V4ocuA zP!qZlwvYNL4Y#DQ+dqDh(;>FvH=ZtA@I!Z|94|H60a>H{3QsEh70{%*Kt;f$^?}8} zNx`C^Nh^c%fZG**S>d-8o>%x^3a=|H3UTDZP)*3BH43*Xi{q%~+0cnlntqI-n)H96 zD+r2fS3(+1(Re8HfF`ZdwgS7f9hye3D*IJnoHYG3V(N5`Y*e@e7^e={<75L(`ij0o zGwF=J6_!i-3woSBQeNF~IB22~F*Lf%;1t^x9suj>(nY2suvuCfmPmwk$z&0Ve#NA;LHf zXwsethaQF;rK^!k5tD92PM|6!MO>TaqItn6tu7ibqhu>QQslleF?s7mWaiB>p6anp zClXGd7)7(7jldQt$CfxxWx$IHf9{U0S?jdO6|n40( z7Zm0&tj{wGKR$wP^TVOZv`++CuZVS&yqOX*n#GD27 zSWu{sR)`vCKdtt(wPFhX^z&O^v&HS$(VKApa%3+wonG~|Bf`YAkK(ds-{VRv$BAa` zBqGD~kG}RSvK1l-5V9rHRAWaU1*ksW`A5S`TXu9a6I&ONW)yHTDO(;QX<# z9SIzO_HVxS^}s=Bulm|kfx}cue^lDz#>K!1Xcdi2;Z?Mf0!r&IKU}mOKE4y)z|A4) zm%sr17U&4o2>MVtJ_i1Ma$%ysuh(C&IOI|OQ4wpw19Xy3@p=ItR@krbxWbbPpH}$1 z!gC5=2DZ^9B@ZfmL*Z56S-K8GUVk*10w{SvT5zYI(Oo5X7URmjV+%GDrvhiYlP{u^2en%_h2 z(Qg3R+b)jiVbLy50H=!A^a@8*)4O^?tfXstoj4#q(Hlh{y3GboHCjY1%`=ul&Zb@u zOOL)q^s5<66&nnmK)cZ;j*I=qWjZc;flc&~(I=YdYsQ1(X+$1DuhYh3$p4(t2>F6> zTs*IG#=~l-o)hmGr^O|NJ}2ByYs;NMQ5iPr4KW9JRjduS(R*TVxKRv>BjMw~v*90z z>*A&Gd2th+-l0M9qwp)R|7Z9V3F%qh4F3$4Ux%NkPWmu>1@fQ5b(rZy^A|w2ucWDF z8~$i{lHP)Msrf75J?1H@aO8G42E}1uHQd)ktvq912mXh7LxkyV^Jl;h;0@EK3a!YW z#e6@}f`}#u#qtPeSdYu|4bcf~g%{5(c{H*e_*A4^u9O!eRdOxt6J)#cb}EdK!=W*n zQnW*!6RkzNWha((AMnHQA$b5nkIIMT6Gb;qWc21@(|r07!6DVpMvF^ zK$e?j3owcuwMsl7z9^m)BjiE(hz#N^hxqU2cy>Pwd?xTH@P&X291NVqMNo`uK;RAw zK`v2Ph6`1aD0k=A?}>f~?QRH5zzchMtXV(MmyQk4kPnZh9Ju!K|n`qdi zZ{FM0W$$Wq|Dhq_%QM`g4U66D4W~x>KJwZb?&G)4asT($-;CVSnci)u@!~`K+IQ~l z7$c;K6Nq=h?g?iWVgHEG1*7j~^&_}#5@ z-x;~*v6TDV+?qPm3dm7W{ENplOT=T`NKqND2>Xt#p~{WT8-s_32x##}e49|^cq2no zh=lO;SkPc2pot-dxMB_|X014A2@wqeVtZLMuv#*TYY;YyWsU_bifSa{nd4E22A)qa zMx(LJ$ynw)A&kl}93B1=MCeu!s$q<>bnXz#Jk44x^IhbOMom2!&-7t3B~qn6XIe5I zLr^Sp4zuJQ0bLk)`-)}G>&T3zh#j%aMbiqw|1zfwaqgE5D*!6=gy3*j!_ai3i-Y$ zImENCEZ3}Q7<*rswIXl4eY|QS)>q**Rouk;s@2Hf4e~B_7tP;jHSr{)@xG=YrqqZP zu8hW;P=ZRY+kE#&^S1{V#rqby4GXT|RQvxyDbc?YNqX?xv1cyP=h_ywmETjmReR}~ zrAM~ic5U3R@0cALnB0P-7x2q6`+19HtG~KbUf$?#UU;V)U7U_>BFb<+|6|=Z@YrHI W6viKrapdUta|U8}ejxg%=>HGBouFg@ From 0c61b6d28d140950e02bead3805da1300137d8c5 Mon Sep 17 00:00:00 2001 From: oc Date: Sat, 30 Dec 2017 14:28:21 +0800 Subject: [PATCH 21/25] Add Point' --- libs/core.js | 38 ++++++++++++++++- libs/enemys.js | 30 ++++++++++++- libs/events.js | 95 +++++++++++++++++++++++++++++------------- libs/floors/sample2.js | 1 + 更新说明.txt | 4 +- 5 files changed, 133 insertions(+), 35 deletions(-) diff --git a/libs/core.js b/libs/core.js index 502a5130..a16345c3 100644 --- a/libs/core.js +++ b/libs/core.js @@ -1700,6 +1700,27 @@ core.prototype.changeFloor = function (floorId, stair, heroLoc, time, callback) core.statusBar.floor.style.fontStyle = 'italic'; else core.statusBar.floor.style.fontStyle = 'normal'; + // 不存在事件时,更改画面色调 + if (core.status.event.id == null) { + // 默认画面色调 + if (core.isset(core.floors[floorId].color)) { + var color = core.floors[floorId].color; + + // 直接变色 + var nowR = parseInt(color[0]), nowG = parseInt(color[1]), nowB = parseInt(color[2]); + var toRGB = "#"+((1<<24)+(nowR<<16)+(nowG<<8)+nowB).toString(16).slice(1); + core.dom.curtain.style.background = toRGB; + if (core.isset(color[3])) + core.dom.curtain.style.opacity = color[3]; + else core.dom.curtain.style.opacity=1; + core.status.curtainColor = color; + } + else { + core.dom.curtain.style.background = "#000000"; + core.dom.curtain.style.opacity = 0; + } + } + core.drawMap(floorId, function () { setTimeout(function() { core.mapChangeAnimate('hide', time/4, function () { @@ -1904,7 +1925,7 @@ core.prototype.drawAutotile = function (floorId, canvas, autotileMaps, left, top } var isAutotile = function(x, y) { - if (x<0 || x>12 || y<0 || y>12) return 0; + if (x<0 || x>12 || y<0 || y>12) return 1; return autotileMaps[13*x+y]==autotileId?1:0; } for (var xx=0;xx<13;xx++) { @@ -2634,7 +2655,8 @@ core.prototype.snipe = function (snipes) { } core.prototype.setFg = function(color, time, callback) { - time = time || 750; + if (!core.isset(time)) time=750; + if (time<=0) time=0; if (!core.isset(core.status.curtainColor)) { core.status.curtainColor = [0,0,0,0]; @@ -2649,6 +2671,18 @@ core.prototype.setFg = function(color, time, callback) { if (color[3]<0) color[3]=0; if (color[3]>1) color[3]=1; + + if (time==0) { + // 直接变色 + var nowR = parseInt(color[0]), nowG = parseInt(color[1]), nowB = parseInt(color[2]); + var toRGB = "#"+((1<<24)+(nowR<<16)+(nowG<<8)+nowB).toString(16).slice(1); + core.dom.curtain.style.background = toRGB; + core.dom.curtain.style.opacity = color[3]; + core.status.curtainColor = color; + if (core.isset(callback)) callback(); + return; + } + var step=0; var changeAnimate = setInterval(function() { step++; diff --git a/libs/enemys.js b/libs/enemys.js index 95a19585..b2bc18fa 100644 --- a/libs/enemys.js +++ b/libs/enemys.js @@ -5,7 +5,7 @@ function enemys() { enemys.prototype.init = function () { // 怪物属性初始化定义: this.enemys = { - 'greenSlime': {'name': '绿头怪', 'hp': 100, 'atk': 120, 'def': 0, 'money': 1, 'experience': 1, 'special': 0}, + 'greenSlime': {'name': '绿头怪', 'hp': 100, 'atk': 120, 'def': 0, 'money': 1, 'experience': 1, 'special': 0, 'point': 2}, 'redSlime': {'name': '红头怪', 'hp': 0, 'atk': 0, 'def': 0, 'money': 0, 'experience': 0, 'special': 0}, 'blackSlime': {'name': '青头怪', 'hp': 0, 'atk': 0, 'def': 0, 'money': 0, 'experience': 0, 'special': 0}, 'slimelord': {'name': '怪王', 'hp': 100, 'atk': 120, 'def': 0, 'money': 10, 'experience': 0, 'special': 9}, @@ -106,6 +106,34 @@ enemys.prototype.getSpecialText = function (enemyId) { return text.join(" "); } +////// 获得每个属性的文字提示 ////// +enemys.prototype.getSpecialHint = function (enemy, special) { + switch (special) { + case 1: return "怪物首先攻击"; + case 2: return "怪物无视勇士的魔防"; + case 3: return "勇士每回合最多只能对怪物造成1点伤害"; + case 4: return "怪物每回合攻击2次"; + case 5: return "怪物每回合攻击3次"; + case 6: return "怪物每回合攻击4次"; + case 7: return "战斗前,怪物附加角色防御的"+parseInt(100*core.values.breakArmor)+"%作为伤害"; + case 8: return "战斗时,怪物每回合附加角色攻击的"+parseInt(100*core.values.counterAttack)+"%作为伤害,无视角色防御"; + case 9: return "战斗前,怪物附加勇士魔防的"+core.values.purify+"倍作为伤害"; + case 10: return "怪物的攻防和勇士攻防相等"; + case 11: return "战斗前,怪物首先吸取角色的"+parseInt(100*enemy.value)+"%生命作为伤害"; + case 12: return "战斗后,勇士陷入中毒状态,每一步损失生命"+core.values.poisonDamage+"点"; + case 13: return "战斗后,勇士陷入衰弱状态,攻防暂时下降"+core.values.weakValue+"点"; + case 14: return "战斗后,勇士陷入诅咒状态,战斗无法获得金币和经验"; + case 15: return "经过怪物周围"+(enemy.range||1)+"格时自动减生命"+enemy.damage+"点"; + case 16: return "经过两只相同的怪物中间,勇士生命值变成一半"; + case 17: return "战斗前,怪物附加之前积累的仇恨值作为伤害;战斗后,释放一半的仇恨值。(每杀死一个怪物获得"+core.values.hatred+"点仇恨值)"; + case 18: return "经过怪物的十字领域时自动减生命"+enemy.value+"点,同时怪物后退一格"; + case 19: return "战斗后勇士的生命值变成1"; + case 20: return "勇士无法打败怪物,除非拥有十字架"; + default: break; + } + return "" +} + enemys.prototype.getDamage = function (monsterId) { var monster = core.material.enemys[monsterId]; var hero_atk = core.status.hero.atk, hero_def = core.status.hero.def, hero_mdef = core.status.hero.mdef; diff --git a/libs/events.js b/libs/events.js index e82bfc8e..b7a906c8 100644 --- a/libs/events.js +++ b/libs/events.js @@ -410,7 +410,12 @@ events.prototype.doAction = function() { ////// 往当前事件列表之前添加一个或多个事件 ////// events.prototype.insertAction = function (action) { - core.unshift(core.status.event.data.list, action) + if (core.status.event.id == null) { + this.doEvents(action); + } + else { + core.unshift(core.status.event.data.list, action) + } } ////// 打开商店 ////// @@ -517,6 +522,30 @@ events.prototype.useItem = function(itemId) { else core.drawTip("当前无法使用"+core.material.items[itemId].name); } +////// 加点 ////// +events.prototype.addPoint = function (enemy) { + var point = enemy.point; + if (!core.isset(point) || point<=0) return []; + + // 加点,返回一个choices事件 + return [ + {"type": "choices", + "choices": [ + {"text": "生命+"+(200*point), "action": [ + {"type": "setValue", "name": "status:hp", "value": "status:hp+"+(200*point)} + ]}, + {"text": "攻击+"+(1*point), "action": [ + {"type": "setValue", "name": "status:atk", "value": "status:atk+"+(1*point)} + ]}, + {"text": "防御+"+(2*point), "action": [ + {"type": "setValue", "name": "status:def", "value": "status:def+"+(2*point)} + ]}, + ] + } + ]; + +} + /****** 打完怪物 ******/ events.prototype.afterBattle = function(enemyId,x,y,callback) { @@ -548,49 +577,55 @@ events.prototype.afterBattle = function(enemyId,x,y,callback) { core.setFlag('hatred', core.getFlag('hatred',0)+core.values.hatred); core.updateStatusBar(); + + // 事件的处理 + var todo = []; + // 如果不为阻击,且该点存在,且有事件 + if (!core.enemys.hasSpecial(special, 18) && core.isset(x) && core.isset(y)) { + var event = core.floors[core.status.floorId].afterBattle[x+","+y]; + if (core.isset(event)) { + // 插入事件 + core.unshift(todo, event); + } + } + // 如果有加点 + var point = core.material.enemys[enemyId].point; + if (core.isset(point) && point>0) { + core.unshift(todo, core.events.addPoint(core.material.enemys[enemyId])); + } + + // 如果事件不为空,将其插入 + if (todo.length>0) { + this.insertAction(todo); + } + // 如果已有事件正在处理中 - if (core.status.lockControl) { - if (core.isset(callback)) callback(); - return; - } - - // 阻击:不处理任何事件 - if (core.enemys.hasSpecial(special, 18)) { - if (core.isset(callback)) callback(); - return; - } - - // 检查处理后的事件。 - var event = core.floors[core.status.floorId].afterBattle[x+","+y]; - if (core.isset(event)) { - core.events.doEvents(event, x, y, callback); - } - //继续行走 - else { + if (core.status.event.id == null) { core.continueAutomaticRoute(); } if (core.isset(callback)) callback(); + } /****** 开完门 ******/ events.prototype.afterOpenDoor = function(doorId,x,y,callback) { - // 如果已有事件正在处理中 - if (core.status.lockControl) { - if (core.isset(callback)) callback(); - return; + var todo = []; + if (core.isset(x) && core.isset(y)) { + var event = core.floors[core.status.floorId].afterOpenDoor[x+","+y]; + if (core.isset(event)) { + core.unshift(todo, event); + } } - // 检查处理后的事件。 - var event = core.floors[core.status.floorId].afterOpenDoor[x+","+y]; - if (core.isset(event)) { - core.events.doEvents(event, x, y, callback); + if (todo.length>0) { + this.insertAction(todo); } - //继续行走 - else { + + if (core.status.event.id == null) { core.continueAutomaticRoute(); - if (core.isset(callback)) callback(); } + if (core.isset(callback)) callback(); } /****** 经过路障 ******/ diff --git a/libs/floors/sample2.js b/libs/floors/sample2.js index 32d227ff..0dcff5ab 100644 --- a/libs/floors/sample2.js +++ b/libs/floors/sample2.js @@ -8,6 +8,7 @@ main.floors.sample2 = { "canFlyTo": false, // 该楼能否被楼传器飞到(不能的话在该楼也不允许使用楼传器) "canUseQuickShop": true, // 该层是否允许使用快捷商店 "defaultGround": "snowGround", // 默认地面的图块ID(terrains中) + "color": [255,0,0,0.3], // 可以设置该层的默认背景色调(RGBA);本项可省略 "map": [ // 地图数据,需要是13x13,建议使用地图生成器来生成 [5, 5, 5, 5, 5, 5, 87, 5, 5, 5, 5, 5, 5], [5, 4, 4, 4, 4, 1, 0, 1, 4, 4, 4, 4, 5], diff --git a/更新说明.txt b/更新说明.txt index f3e8c2a5..589d35c7 100644 --- a/更新说明.txt +++ b/更新说明.txt @@ -1,6 +1,6 @@ 全键盘操作 √ 经验升级(进阶) √ -增加阻击、自爆、无敌属性 √ +增加阻击等属性;属性显示;加点; √ 九宫格领域、大范围领域 √ Ctrl快速跳过对话 √ 增加负伤 √ @@ -9,4 +9,4 @@ Ctrl快速跳过对话 √ 支持多个Autotile同时存在 √ 直接内嵌了诸多默认的terrains素材 √ 自动定位到上次存/读档位置 √ -修改setFg的实现方法 √ \ No newline at end of file +每一层可以默认色调 √ From c0d67d431c5f5f3e444860748a7a7860b9aec540 Mon Sep 17 00:00:00 2001 From: oc Date: Sat, 30 Dec 2017 15:38:54 +0800 Subject: [PATCH 22/25] =?UTF-8?q?N=E8=BF=9E=E5=87=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- libs/enemys.js | 25 +++++++++++++------------ libs/ui.js | 2 +- 更新说明.txt | 2 +- 3 files changed, 15 insertions(+), 14 deletions(-) diff --git a/libs/enemys.js b/libs/enemys.js index b2bc18fa..2b54da9a 100644 --- a/libs/enemys.js +++ b/libs/enemys.js @@ -81,14 +81,15 @@ enemys.prototype.hasSpecial = function (special, test) { enemys.prototype.getSpecialText = function (enemyId) { if (enemyId == undefined) return ""; - var special = this.enemys[enemyId].special; + var enemy = this.enemys[enemyId]; + var special = enemy.special; var text = []; if (this.hasSpecial(special, 1)) text.push("先攻"); if (this.hasSpecial(special, 2)) text.push("魔攻"); if (this.hasSpecial(special, 3)) text.push("坚固"); if (this.hasSpecial(special, 4)) text.push("2连击"); if (this.hasSpecial(special, 5)) text.push("3连击"); - if (this.hasSpecial(special, 6)) text.push("4连击"); + if (this.hasSpecial(special, 6)) text.push((enemy.n||4)+"连击"); if (this.hasSpecial(special, 7)) text.push("破甲"); if (this.hasSpecial(special, 8)) text.push("反击"); if (this.hasSpecial(special, 9)) text.push("净化"); @@ -114,7 +115,7 @@ enemys.prototype.getSpecialHint = function (enemy, special) { case 3: return "勇士每回合最多只能对怪物造成1点伤害"; case 4: return "怪物每回合攻击2次"; case 5: return "怪物每回合攻击3次"; - case 6: return "怪物每回合攻击4次"; + case 6: return "怪物每回合攻击"+(enemy.n||4)+"次"; case 7: return "战斗前,怪物附加角色防御的"+parseInt(100*core.values.breakArmor)+"%作为伤害"; case 8: return "战斗时,怪物每回合附加角色攻击的"+parseInt(100*core.values.counterAttack)+"%作为伤害,无视角色防御"; case 9: return "战斗前,怪物附加勇士魔防的"+core.values.purify+"倍作为伤害"; @@ -138,7 +139,7 @@ enemys.prototype.getDamage = function (monsterId) { var monster = core.material.enemys[monsterId]; var hero_atk = core.status.hero.atk, hero_def = core.status.hero.def, hero_mdef = core.status.hero.mdef; var mon_hp = monster.hp, mon_atk = monster.atk, mon_def = monster.def, mon_special = monster.special; - var damage = this.calDamage(hero_atk, hero_def, hero_mdef, mon_hp, mon_atk, mon_def, mon_special); + var damage = this.calDamage(hero_atk, hero_def, hero_mdef, mon_hp, mon_atk, mon_def, mon_special, monster.n); if (damage == 999999999) return damage; return damage + this.getExtraDamage(monster); } @@ -161,12 +162,12 @@ enemys.prototype.getCritical = function (monsterId) { var monster = core.material.enemys[monsterId]; if (this.hasSpecial(monster.special, 3) || this.hasSpecial(monster.special, 10)) return "???"; var last = this.calDamage(core.status.hero.atk, core.status.hero.def, core.status.hero.mdef, - monster.hp, monster.atk, monster.def, monster.special); + monster.hp, monster.atk, monster.def, monster.special, monster.n); if (last <= 0) return 0; for (var i = core.status.hero.atk + 1; i <= monster.hp + monster.def; i++) { var damage = this.calDamage(i, core.status.hero.def, core.status.hero.mdef, - monster.hp, monster.atk, monster.def, monster.special); + monster.hp, monster.atk, monster.def, monster.special, monster.n); if (damage < last) return i - core.status.hero.atk; last = damage; @@ -181,25 +182,25 @@ enemys.prototype.getCriticalDamage = function (monsterId) { if (c <= 0) return 0; var monster = core.material.enemys[monsterId]; var last = this.calDamage(core.status.hero.atk, core.status.hero.def, core.status.hero.mdef, - monster.hp, monster.atk, monster.def, monster.special); + monster.hp, monster.atk, monster.def, monster.special, monster.n); if (last == 999999999) return '???'; return last - this.calDamage(core.status.hero.atk + c, core.status.hero.def, core.status.hero.mdef, - monster.hp, monster.atk, monster.def, monster.special); + monster.hp, monster.atk, monster.def, monster.special, monster.n); } // 1防减伤计算 enemys.prototype.getDefDamage = function (monsterId) { var monster = core.material.enemys[monsterId]; var nowDamage = this.calDamage(core.status.hero.atk, core.status.hero.def, core.status.hero.mdef, - monster.hp, monster.atk, monster.def, monster.special); + monster.hp, monster.atk, monster.def, monster.special, monster.n); var nextDamage = this.calDamage(core.status.hero.atk, core.status.hero.def + 1, core.status.hero.mdef, - monster.hp, monster.atk, monster.def, monster.special); + monster.hp, monster.atk, monster.def, monster.special, monster.n); if (nowDamage == 999999999 || nextDamage == 999999999) return "???"; return nowDamage - nextDamage; } -enemys.prototype.calDamage = function (hero_atk, hero_def, hero_mdef, mon_hp, mon_atk, mon_def, mon_special) { +enemys.prototype.calDamage = function (hero_atk, hero_def, hero_mdef, mon_hp, mon_atk, mon_def, mon_special, n) { if (this.hasSpecial(mon_special, 20) && !core.hasItem("cross")) // 如果是无敌属性,且勇士未持有十字架 return 999999999; // 返回无限大 @@ -221,7 +222,7 @@ enemys.prototype.calDamage = function (hero_atk, hero_def, hero_mdef, mon_hp, mo if (this.hasSpecial(mon_special, 4)) per_damage *= 2; if (this.hasSpecial(mon_special, 5)) per_damage *= 3; - if (this.hasSpecial(mon_special, 6)) per_damage *= 4; + if (this.hasSpecial(mon_special, 6)) per_damage *= (n||4); var counterDamage = 0; // 反击 diff --git a/libs/ui.js b/libs/ui.js index bbb85c16..314ddbf2 100644 --- a/libs/ui.js +++ b/libs/ui.js @@ -405,7 +405,7 @@ ui.prototype.drawBattleAnimate = function(monsterId, callback) { var turns = 2; if (core.enemys.hasSpecial(mon_special, 4)) turns=3; if (core.enemys.hasSpecial(mon_special, 5)) turns=4; - if (core.enemys.hasSpecial(mon_special, 6)) turns=5; + if (core.enemys.hasSpecial(mon_special, 6)) turns=1+(monster.n||4); // 初始伤害 diff --git a/更新说明.txt b/更新说明.txt index 589d35c7..83a62ff8 100644 --- a/更新说明.txt +++ b/更新说明.txt @@ -1,6 +1,6 @@ 全键盘操作 √ 经验升级(进阶) √ -增加阻击等属性;属性显示;加点; √ +增加阻击、多连击等属性;属性显示;加点; √ 九宫格领域、大范围领域 √ Ctrl快速跳过对话 √ 增加负伤 √ From 9ecccf35de795ac80f90a305c232431b89880b58 Mon Sep 17 00:00:00 2001 From: oc Date: Sat, 30 Dec 2017 15:58:42 +0800 Subject: [PATCH 23/25] =?UTF-8?q?N=E8=BF=9E=E5=87=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- libs/enemys.js | 14 +++++++++----- libs/events.js | 4 ++-- libs/items.js | 2 +- libs/ui.js | 14 +++++++------- 4 files changed, 19 insertions(+), 15 deletions(-) diff --git a/libs/enemys.js b/libs/enemys.js index 2b54da9a..a5c970fe 100644 --- a/libs/enemys.js +++ b/libs/enemys.js @@ -5,10 +5,10 @@ function enemys() { enemys.prototype.init = function () { // 怪物属性初始化定义: this.enemys = { - 'greenSlime': {'name': '绿头怪', 'hp': 100, 'atk': 120, 'def': 0, 'money': 1, 'experience': 1, 'special': 0, 'point': 2}, + 'greenSlime': {'name': '绿头怪', 'hp': 100, 'atk': 120, 'def': 0, 'money': 1, 'experience': 1, 'special': [1,5,7,8]}, 'redSlime': {'name': '红头怪', 'hp': 0, 'atk': 0, 'def': 0, 'money': 0, 'experience': 0, 'special': 0}, 'blackSlime': {'name': '青头怪', 'hp': 0, 'atk': 0, 'def': 0, 'money': 0, 'experience': 0, 'special': 0}, - 'slimelord': {'name': '怪王', 'hp': 100, 'atk': 120, 'def': 0, 'money': 10, 'experience': 0, 'special': 9}, + 'slimelord': {'name': '怪王', 'hp': 100, 'atk': 120, 'def': 0, 'money': 10, 'experience': 0, 'special': [1,9]}, 'bat': {'name': '小蝙蝠', 'hp': 100, 'atk': 120, 'def': 0, 'money': 2, 'experience': 0, 'special': 1}, 'bigBat': {'name': '大蝙蝠', 'hp': 0, 'atk': 0, 'def': 0, 'money': 0, 'experience': 0, 'special': 0}, 'redBat': {'name': '红蝙蝠', 'hp': 100, 'atk': 120, 'def': 0, 'money': 5, 'experience': 0, 'special': 4}, @@ -58,7 +58,7 @@ enemys.prototype.init = function () { 'badPrincess': {'name': '痛苦魔女', 'hp': 0, 'atk': 0, 'def': 0, 'money': 0, 'experience': 0, 'special': 0}, 'badFairy': {'name': '黑暗仙子', 'hp': 0, 'atk': 0, 'def': 0, 'money': 0, 'experience': 0, 'special': 0}, 'grayPriest': {'name': '中级法师', 'hp': 0, 'atk': 0, 'def': 0, 'money': 0, 'experience': 0, 'special': 0}, - 'redSwordsman': {'name': '剑王', 'hp': 100, 'atk': 120, 'def': 0, 'money': 7, 'experience': 0, 'special': 6}, + 'redSwordsman': {'name': '剑王', 'hp': 100, 'atk': 120, 'def': 0, 'money': 7, 'experience': 0, 'special': 6, 'n': 8}, // 多连击需要在后面指定n代表是几连击 'whiteGhost': {'name': '水银战士', 'hp': 0, 'atk': 0, 'def': 0, 'money': 0, 'experience': 0, 'special': 0}, 'poisonZombie': {'name': '绿兽人', 'hp': 100, 'atk': 120, 'def': 0, 'money': 13, 'experience': 0, 'special': 12}, 'magicDragon': {'name': '魔龙', 'hp': 0, 'atk': 0, 'def': 0, 'money': 0, 'experience': 0, 'special': 0}, @@ -104,7 +104,7 @@ enemys.prototype.getSpecialText = function (enemyId) { if (this.hasSpecial(special, 18)) text.push("阻击"); if (this.hasSpecial(special, 19)) text.push("自爆"); if (this.hasSpecial(special, 20)) text.push("无敌"); - return text.join(" "); + return text; } ////// 获得每个属性的文字提示 ////// @@ -262,6 +262,10 @@ enemys.prototype.getCurrentEnemys = function () { mon_def=core.status.hero.def; } + var specialText = core.enemys.getSpecialText(monsterId); + if (specialText.length>=3) specialText = "多属性..."; + else specialText = specialText.join(" "); + enemys.push({ 'id': monsterId, 'name': monster.name, @@ -270,7 +274,7 @@ enemys.prototype.getCurrentEnemys = function () { 'def': mon_def, 'money': monster.money, 'experience': monster.experience, - 'special': core.enemys.getSpecialText(monsterId), + 'special': specialText, 'damage': this.getDamage(monsterId), 'critical': this.getCritical(monsterId), 'criticalDamage': this.getCriticalDamage(monsterId), diff --git a/libs/events.js b/libs/events.js index b7a906c8..452a4f1b 100644 --- a/libs/events.js +++ b/libs/events.js @@ -805,11 +805,11 @@ events.prototype.keyUpAction = function (keycode) { events.prototype.clickBook = function(x,y) { // 上一页 if ((x == 3 || x == 4) && y == 12) { - core.ui.drawEnemyBook(core.status.event.data - 1); + core.ui.drawEnemyBook(core.status.event.data - 6); } // 下一页 if ((x == 8 || x == 9) && y == 12) { - core.ui.drawEnemyBook(core.status.event.data + 1); + core.ui.drawEnemyBook(core.status.event.data + 6); } // 返回 if (x>=10 && x<=12 && y==12) { diff --git a/libs/items.js b/libs/items.js index 449d2980..ae21b209 100644 --- a/libs/items.js +++ b/libs/items.js @@ -147,7 +147,7 @@ items.prototype.useItem = function (itemId) { if (!this.canUseItem(itemId)) return; var itemCls = core.material.items[itemId].cls; - if (itemId=='book') core.ui.drawEnemyBook(1); + if (itemId=='book') core.ui.drawEnemyBook(0); if (itemId=='fly') core.ui.drawFly(core.status.hero.flyRange.indexOf(core.status.floorId)); if (itemId == 'earthquake' || itemId == 'bomb' || itemId == 'pickaxe' || itemId=='icePickaxe' || itemId == 'snow' || itemId == 'hammer' || itemId=='bigKey') { diff --git a/libs/ui.js b/libs/ui.js index 314ddbf2..4659a055 100644 --- a/libs/ui.js +++ b/libs/ui.js @@ -423,7 +423,7 @@ ui.prototype.drawBattleAnimate = function(monsterId, callback) { hero_mdef=0; } - var specialText = core.enemys.getSpecialText(monsterId); + var specialTexts = core.enemys.getSpecialText(monsterId); var background = core.canvas.ui.createPattern(core.material.ground, "repeat"); @@ -466,7 +466,6 @@ ui.prototype.drawBattleAnimate = function(monsterId, callback) { core.canvas.ui.textAlign='center'; core.fillText('ui', core.status.hero.name, left+margin+boxWidth/2, top+margin+heroHeight+40, '#FFD700', 'bold 22px Verdana'); core.fillText('ui', "怪物", left+right-margin-boxWidth/2, top+margin+32+40); - var specialTexts = specialText.split(" "); for (var i=0, j=0; i=enemys.length) index=enemys.length-1; var perpage = 6; + var page=parseInt(index/perpage)+1; var totalPage = parseInt((enemys.length - 1) / perpage) + 1; - if (page < 1) page = 1; - if (page > totalPage) page = totalPage; - core.status.event.data = page; + core.status.event.data = index; var start = (page - 1) * perpage, end = Math.min(page * perpage, enemys.length); enemys = enemys.slice(start, end); From f2bfa7cd8414e40d420eb10d58f765637f33c43c Mon Sep 17 00:00:00 2001 From: ckcz123 Date: Sat, 30 Dec 2017 17:25:39 +0800 Subject: [PATCH 24/25] Update Enemy Detail --- libs/enemys.js | 52 ++++++++++++++++++++++++--------------- libs/events.js | 27 +++++++++++++++++++-- libs/ui.js | 66 ++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 123 insertions(+), 22 deletions(-) diff --git a/libs/enemys.js b/libs/enemys.js index a5c970fe..759b505a 100644 --- a/libs/enemys.js +++ b/libs/enemys.js @@ -109,27 +109,39 @@ enemys.prototype.getSpecialText = function (enemyId) { ////// 获得每个属性的文字提示 ////// enemys.prototype.getSpecialHint = function (enemy, special) { + if (!core.isset(special)) { + var hints = []; + for (var i=1;i<100;i++) { + if (this.hasSpecial(enemy.special, i)) { + var hint=this.getSpecialHint(enemy, i); + if (hint!='') + hints.push(hint); + } + } + return hints; + } + switch (special) { - case 1: return "怪物首先攻击"; - case 2: return "怪物无视勇士的魔防"; - case 3: return "勇士每回合最多只能对怪物造成1点伤害"; - case 4: return "怪物每回合攻击2次"; - case 5: return "怪物每回合攻击3次"; - case 6: return "怪物每回合攻击"+(enemy.n||4)+"次"; - case 7: return "战斗前,怪物附加角色防御的"+parseInt(100*core.values.breakArmor)+"%作为伤害"; - case 8: return "战斗时,怪物每回合附加角色攻击的"+parseInt(100*core.values.counterAttack)+"%作为伤害,无视角色防御"; - case 9: return "战斗前,怪物附加勇士魔防的"+core.values.purify+"倍作为伤害"; - case 10: return "怪物的攻防和勇士攻防相等"; - case 11: return "战斗前,怪物首先吸取角色的"+parseInt(100*enemy.value)+"%生命作为伤害"; - case 12: return "战斗后,勇士陷入中毒状态,每一步损失生命"+core.values.poisonDamage+"点"; - case 13: return "战斗后,勇士陷入衰弱状态,攻防暂时下降"+core.values.weakValue+"点"; - case 14: return "战斗后,勇士陷入诅咒状态,战斗无法获得金币和经验"; - case 15: return "经过怪物周围"+(enemy.range||1)+"格时自动减生命"+enemy.damage+"点"; - case 16: return "经过两只相同的怪物中间,勇士生命值变成一半"; - case 17: return "战斗前,怪物附加之前积累的仇恨值作为伤害;战斗后,释放一半的仇恨值。(每杀死一个怪物获得"+core.values.hatred+"点仇恨值)"; - case 18: return "经过怪物的十字领域时自动减生命"+enemy.value+"点,同时怪物后退一格"; - case 19: return "战斗后勇士的生命值变成1"; - case 20: return "勇士无法打败怪物,除非拥有十字架"; + case 1: return "先攻:怪物首先攻击"; + case 2: return "魔攻:怪物无视勇士的魔防"; + case 3: return "坚固:勇士每回合最多只能对怪物造成1点伤害"; + case 4: return "2连击:怪物每回合攻击2次"; + case 5: return "3连击:怪物每回合攻击3次"; + case 6: return (enemy.n||4)+"连击: 怪物每回合攻击"+(enemy.n||4)+"次"; + case 7: return "破甲:战斗前,怪物附加角色防御的"+parseInt(100*core.values.breakArmor)+"%作为伤害"; + case 8: return "反击:战斗时,怪物每回合附加角色攻击的"+parseInt(100*core.values.counterAttack)+"%作为伤害,无视角色防御"; + case 9: return "净化:战斗前,怪物附加勇士魔防的"+core.values.purify+"倍作为伤害"; + case 10: return "模仿:怪物的攻防和勇士攻防相等"; + case 11: return "吸血:战斗前,怪物首先吸取角色的"+parseInt(100*enemy.value)+"%生命作为伤害"; + case 12: return "中毒:战斗后,勇士陷入中毒状态,每一步损失生命"+core.values.poisonDamage+"点"; + case 13: return "衰弱:战斗后,勇士陷入衰弱状态,攻防暂时下降"+core.values.weakValue+"点"; + case 14: return "诅咒:战斗后,勇士陷入诅咒状态,战斗无法获得金币和经验"; + case 15: return "领域:经过怪物周围"+(enemy.range||1)+"格时自动减生命"+enemy.damage+"点"; + case 16: return "夹击:经过两只相同的怪物中间,勇士生命值变成一半"; + case 17: return "仇恨:战斗前,怪物附加之前积累的仇恨值作为伤害;战斗后,释放一半的仇恨值。(每杀死一个怪物获得"+core.values.hatred+"点仇恨值)"; + case 18: return "阻击:经过怪物的十字领域时自动减生命"+enemy.value+"点,同时怪物后退一格"; + case 19: return "自爆:战斗后勇士的生命值变成1"; + case 20: return "无敌:勇士无法打败怪物,除非拥有十字架"; default: break; } return "" diff --git a/libs/events.js b/libs/events.js index 452a4f1b..38cda26c 100644 --- a/libs/events.js +++ b/libs/events.js @@ -806,21 +806,37 @@ events.prototype.clickBook = function(x,y) { // 上一页 if ((x == 3 || x == 4) && y == 12) { core.ui.drawEnemyBook(core.status.event.data - 6); + return; } // 下一页 if ((x == 8 || x == 9) && y == 12) { core.ui.drawEnemyBook(core.status.event.data + 6); + return; } // 返回 if (x>=10 && x<=12 && y==12) { core.ui.closePanel(true); + return; + } + // 怪物信息 + // var index = parseInt(y/2); + var data = core.status.event.data; + if (core.isset(data) && y<12) { + var page=parseInt(data/6); + var index=6*page+parseInt(y/2); + core.ui.drawEnemyBook(index); + core.ui.drawEnemyDetail(index); } return; } events.prototype.keyDownBook = function (keycode) { - if (keycode==37 || keycode==38) core.ui.drawEnemyBook(core.status.event.data - 1); - else if (keycode==39 || keycode==40) core.ui.drawEnemyBook(core.status.event.data + 1); + if (keycode==37) core.ui.drawEnemyBook(core.status.event.data-6); + if (keycode==38) core.ui.drawEnemyBook(core.status.event.data-1); + if (keycode==39) core.ui.drawEnemyBook(core.status.event.data+6); + if (keycode==40) core.ui.drawEnemyBook(core.status.event.data+1); + if (keycode==33) core.ui.drawEnemyBook(core.status.event.data-6); + if (keycode==34) core.ui.drawEnemyBook(core.status.event.data+6); return; } @@ -829,6 +845,13 @@ events.prototype.keyUpBook = function (keycode) { core.ui.closePanel(true); return; } + if (keycode==13 || keycode==32 || keycode==67) { + var data=core.status.event.data; + if (core.isset(data)) { + this.clickBook(6, 2*(data%6)); + } + return; + } } events.prototype.clickFly = function(x,y) { diff --git a/libs/ui.js b/libs/ui.js index 4659a055..0c0e60b3 100644 --- a/libs/ui.js +++ b/libs/ui.js @@ -835,11 +835,77 @@ ui.prototype.drawEnemyBook = function (index) { core.fillText('ui', '1防', 335, 62 * i + 68, '#DDDDDD', '13px Verdana'); core.fillText('ui', enemy.defDamage, 365, 62 * i + 68, '#DDDDDD', 'bold 13px Verdana'); + if (index == start+i) { + core.strokeRect('ui', 10, 62 * i + 13, 416-10*2, 62, '#FFD700'); + } + } core.setBoxAnimate(); this.drawPagination(page, totalPage); } +ui.prototype.drawEnemyDetail = function (index) { + var enemys = core.enemys.getCurrentEnemys(); + if (enemys.length==0) return; + if (index<0) index=0; + if (index>=enemys.length) index=enemys.length-1; + + var enemy = enemys[index]; + var enemyId=enemy.id; + var hints=core.enemys.getSpecialHint(core.enemys.getEnemys(enemyId)); + + if (hints.length==0) { + core.drawTip("该怪物无特殊属性!"); + return; + } + var content=hints.join("\n"); + + core.status.event.id = 'book-detail'; + clearInterval(core.interval.tipAnimate); + + core.clearMap('data', 0, 0, 416, 416); + core.setOpacity('data', 1); + + var left=10, right=416-2*left; + var content_left = left + 25; + + var validWidth = right-(content_left-left)-13; + var contents = core.splitLines("data", content, validWidth, '16px Verdana'); + + var height = 416 - 10 - Math.min(416-24*(contents.length+1)-65, 250); + var top = (416-height)/2, bottom = height; + + // var left = 97, top = 64, right = 416 - 2 * left, bottom = 416 - 2 * top; + core.setAlpha('data', 0.9); + core.fillRect('data', left, top, right, bottom, '#000000'); + core.setAlpha('data', 1); + core.strokeRect('data', left - 1, top - 1, right + 1, bottom + 1, '#FFFFFF', 2); + + // 名称 + core.canvas.data.textAlign = "left"; + + core.fillText('data', enemy.name, content_left, top + 30, '#FFD700', 'bold 22px Verdana'); + var content_top = top + 57; + + for (var i=0;i=0) { + var x1 = text.substring(0, index+1); + core.fillText('data', x1, content_left, content_top, '#FF6A6A', 'bold 16px Verdana'); + var len=core.canvas.data.measureText(x1).width; + core.fillText('data', text.substring(index+1), content_left+len, content_top, '#FFFFFF', '16px Verdana'); + } + else { + core.fillText('data', contents[i], content_left, content_top, '#FFFFFF', '16px Verdana'); + } + content_top+=24; + } + + core.fillText('data', '<点击任意位置继续>', 270, top+height-13, '#CCCCCC', '13px Verdana'); +} + /** * 绘制楼传器 * @param page From 2d9278f8f68fe9b269b14ae545ac03f67f572815 Mon Sep 17 00:00:00 2001 From: ckcz123 Date: Sat, 30 Dec 2017 18:05:21 +0800 Subject: [PATCH 25/25] Monster Detail --- libs/core.js | 12 +++++++++++- libs/enemys.js | 2 +- libs/events.js | 9 ++++++++- libs/ui.js | 2 +- 4 files changed, 21 insertions(+), 4 deletions(-) diff --git a/libs/core.js b/libs/core.js index a16345c3..e572fe5b 100644 --- a/libs/core.js +++ b/libs/core.js @@ -614,6 +614,10 @@ core.prototype.keyUp = function(keyCode) { core.events.keyUpBook(keyCode); return; } + if (core.status.event.id=='book-detail' && (keyCode==13 || keyCode==32 || keyCode==67)) { + core.events.clickBookDetail(); + return; + } if (core.status.event.id=='fly') { core.events.keyUpFly(keyCode); return; @@ -856,6 +860,12 @@ core.prototype.onclick = function (x, y, stepPostfix) { return; } + // 怪物详细信息 + if (core.status.event.id == 'book-detail') { + core.events.clickBookDetail(x,y); + return; + } + // 楼层飞行器 if (core.status.event.id == 'fly') { core.events.clickFly(x,y); @@ -2081,7 +2091,7 @@ core.prototype.nearStair = function() { core.prototype.enemyExists = function (x, y, id,floorId) { var block = core.getBlock(x,y,floorId); if (block==null) return false; - return block.block.event.cls=='enemys' && block.block.event.id==id; + return block.block.event.cls=='enemys' && (core.isset(id)?block.block.event.id==id:true); } core.prototype.getBlock = function (x, y, floorId, needEnable) { diff --git a/libs/enemys.js b/libs/enemys.js index 759b505a..f9e29705 100644 --- a/libs/enemys.js +++ b/libs/enemys.js @@ -136,7 +136,7 @@ enemys.prototype.getSpecialHint = function (enemy, special) { case 12: return "中毒:战斗后,勇士陷入中毒状态,每一步损失生命"+core.values.poisonDamage+"点"; case 13: return "衰弱:战斗后,勇士陷入衰弱状态,攻防暂时下降"+core.values.weakValue+"点"; case 14: return "诅咒:战斗后,勇士陷入诅咒状态,战斗无法获得金币和经验"; - case 15: return "领域:经过怪物周围"+(enemy.range||1)+"格时自动减生命"+enemy.damage+"点"; + case 15: return "领域:经过怪物周围"+(enemy.range||1)+"格时自动减生命"+enemy.value+"点"; case 16: return "夹击:经过两只相同的怪物中间,勇士生命值变成一半"; case 17: return "仇恨:战斗前,怪物附加之前积累的仇恨值作为伤害;战斗后,释放一半的仇恨值。(每杀死一个怪物获得"+core.values.hatred+"点仇恨值)"; case 18: return "阻击:经过怪物的十字领域时自动减生命"+enemy.value+"点,同时怪物后退一格"; diff --git a/libs/events.js b/libs/events.js index 38cda26c..cd866e90 100644 --- a/libs/events.js +++ b/libs/events.js @@ -825,7 +825,7 @@ events.prototype.clickBook = function(x,y) { var page=parseInt(data/6); var index=6*page+parseInt(y/2); core.ui.drawEnemyBook(index); - core.ui.drawEnemyDetail(index); + core.ui.drawBookDetail(index); } return; } @@ -854,6 +854,13 @@ events.prototype.keyUpBook = function (keycode) { } } +events.prototype.clickBookDetail = function (x,y) { + core.clearMap('data', 0, 0, 416, 416); + + core.status.event.id = 'book'; + +} + events.prototype.clickFly = function(x,y) { if ((x==10 || x==11) && y==9) core.ui.drawFly(core.status.event.data-1); if ((x==10 || x==11) && y==5) core.ui.drawFly(core.status.event.data+1); diff --git a/libs/ui.js b/libs/ui.js index 0c0e60b3..f9480f9c 100644 --- a/libs/ui.js +++ b/libs/ui.js @@ -844,7 +844,7 @@ ui.prototype.drawEnemyBook = function (index) { this.drawPagination(page, totalPage); } -ui.prototype.drawEnemyDetail = function (index) { +ui.prototype.drawBookDetail = function (index) { var enemys = core.enemys.getCurrentEnemys(); if (enemys.length==0) return; if (index<0) index=0;