diff --git a/_docs/event.md b/_docs/event.md index a84cc3d8..86f93c9e 100644 --- a/_docs/event.md +++ b/_docs/event.md @@ -1316,13 +1316,11 @@ async可选,如果为true则会异步执行(即不等待当前事件执行 ### pauseBgm:暂停背景音乐 使用`{"type": "pauseBgm"}`可以暂停背景音乐的播放。 - ### loadBgm:预加载一个背景音乐 使用loadBgm可以预加载一个背景音乐。 diff --git a/_server/blockly/MotaAction.g4 b/_server/blockly/MotaAction.g4 index fafa1bb7..df4cf03e 100644 --- a/_server/blockly/MotaAction.g4 +++ b/_server/blockly/MotaAction.g4 @@ -5,7 +5,7 @@ grammar MotaAction; //事件 事件编辑器入口之一 event_m - : '事件' BGNL? Newline '覆盖触发器' Bool '启用' Bool '通行状态' B_0_List '动画' Bool '显伤' Bool BGNL? Newline action+ BEND + : '事件' BGNL? Newline '覆盖触发器' Bool '启用' Bool '通行状态' B_0_List '显伤' Bool BGNL? Newline action+ BEND /* event_m @@ -17,11 +17,10 @@ var code = { 'trigger': Bool_0?'action':null, 'enable': Bool_1, 'noPass': B_0_List_0, - 'animate': Bool_2, - 'displayDamage': Bool_3, + 'displayDamage': Bool_2, 'data': 'data_asdfefw' } -if (!Bool_0 && Bool_1 && (B_0_List_0===null) && Bool_2 && Bool_3) code = 'data_asdfefw'; +if (!Bool_0 && Bool_1 && (B_0_List_0===null) && Bool_2) code = 'data_asdfefw'; code=JSON.stringify(code,null,2).split('"data_asdfefw"').join('[\n'+action_0+']\n'); return code; */; @@ -1994,7 +1993,7 @@ ActionParser.prototype.parse = function (obj,type) { if(typeof(obj)===typeof('')) obj={'data':[obj]}; if(obj instanceof Array) obj={'data':obj}; return MotaActionBlocks['event_m'].xmlText([ - obj.trigger==='action',obj.enable,obj.noPass,obj.animate,obj.displayDamage,this.parseList(obj.data) + obj.trigger==='action',obj.enable,obj.noPass,obj.displayDamage,this.parseList(obj.data) ]); case 'changeFloor': diff --git a/_server/comment.js b/_server/comment.js index 72474062..cdf576e4 100644 --- a/_server/comment.js +++ b/_server/comment.js @@ -263,6 +263,12 @@ var comment_c456ea59_6018_45ef_8bcc_211a24c627dc = "_range": "thiseval==null||(thiseval instanceof Array)", "_data": "该图块的不可入方向\n可以在这里定义不能朝哪个方向进入该图块,可以达到悬崖之类的效果\n例如 [\"down\"] 代表不能从该图块的上方点朝向下进入此图块\n此值对背景层、事件层、前景层上的图块均有效" }, + "animate": { + "_leaf": true, + "_type": "textarea", + "_range": "thiseval==~~thiseval||thiseval==null", + "_data": "该图块的全局动画帧数。\n如果此项为null,则对于除了npc48外,使用素材默认帧数;npc48默认是1帧(即静止)。" + }, "faceIds": { "_leaf": true, "_type": "textarea", diff --git a/libs/control.js b/libs/control.js index 8ed2e550..e30dfe85 100644 --- a/libs/control.js +++ b/libs/control.js @@ -2639,7 +2639,7 @@ control.prototype.unLockControl = function () { } ////// 播放背景音乐 ////// -control.prototype.playBgm = function (bgm) { +control.prototype.playBgm = function (bgm, startTime) { if (main.mode!='play')return; // 音频不存在 if (!core.isset(core.material.bgms[bgm])) return; @@ -2657,14 +2657,6 @@ control.prototype.playBgm = function (bgm) { } this.setMusicBtn(); - /* - // 延迟播放 - if (core.material.bgms[bgm] == 'loading') { - core.material.bgms[bgm] = 'starting'; - return; - } - */ - try { // 缓存BGM core.loader.loadBgm(bgm); @@ -2678,7 +2670,7 @@ control.prototype.playBgm = function (bgm) { } // 播放当前BGM core.material.bgms[bgm].volume = core.musicStatus.volume; - core.material.bgms[bgm].currentTime = 0; + core.material.bgms[bgm].currentTime = startTime || 0; core.material.bgms[bgm].play(); core.musicStatus.playingBgm = bgm; core.musicStatus.lastBgm = bgm; diff --git a/libs/events.js b/libs/events.js index 5f572ffb..5ed17252 100644 --- a/libs/events.js +++ b/libs/events.js @@ -962,8 +962,7 @@ events.prototype.doAction = function() { this.doAction(); break case "loadBgm": - if (core.platform.isPC) - core.loadBgm(data.name); + core.loadBgm(data.name); this.doAction(); break; case "freeBgm": diff --git a/libs/items.js b/libs/items.js index 92160199..1834cdb3 100644 --- a/libs/items.js +++ b/libs/items.js @@ -64,6 +64,7 @@ items.prototype.getItemEffectTip = function(itemId) { items.prototype._useItemEffect = function (itemId) { if (itemId in this.useItemEffect) { try { + var ratio = parseInt(core.status.thisMap.item_ratio) || 1; eval(this.useItemEffect[itemId]); } catch (e) { @@ -171,7 +172,7 @@ items.prototype.setItem = function (itemId, itemNum) { ////// 删除某个物品 ////// items.prototype.removeItem = function (itemId, itemNum) { if (!core.isset(core.status.hero)) return null; - itemNum = itemNum || 1; + if (!core.isset(itemNum)) itemNum = 1; if (!core.hasItem(itemId)) return false; var itemCls = core.material.items[itemId].cls; core.status.hero.items[itemCls][itemId]-=itemNum; @@ -186,7 +187,7 @@ items.prototype.removeItem = function (itemId, itemNum) { ////// 增加某个物品的个数 ////// items.prototype.addItem = function (itemId, itemNum) { if (!core.isset(core.status.hero)) return null; - itemNum = itemNum || 1; + if (!core.isset(itemNum)) itemNum = 1; var itemData = core.material.items[itemId]; var itemCls = itemData.cls; if (itemCls == 'items') return; diff --git a/libs/loader.js b/libs/loader.js index 2a41dcf8..7fc1f393 100644 --- a/libs/loader.js +++ b/libs/loader.js @@ -254,6 +254,11 @@ loader.prototype.freeBgm = function (name) { }, 3000); } +loader.prototype._preloadBgm = function (bgm) { + bgm.volume = 0; + bgm.play(); +} + loader.prototype.loadBgm = function (name) { if (!core.isset(core.material.bgms[name])) return; // 如果没开启音乐,则不预加载 @@ -265,7 +270,8 @@ loader.prototype.loadBgm = function (name) { } else { // 预加载BGM - core.material.bgms[name].load(); + this._preloadBgm(core.material.bgms[name]); + // core.material.bgms[name].load(); // 清理尾巴 if (core.musicStatus.cachedBgms.length == core.musicStatus.cachedBgmCount) { this.freeBgm(core.musicStatus.cachedBgms.pop()); diff --git a/libs/maps.js b/libs/maps.js index 77b316dd..70179b5a 100644 --- a/libs/maps.js +++ b/libs/maps.js @@ -98,6 +98,19 @@ maps.prototype.initBlock = function (x, y, id) { return tmp; } +maps.prototype._getAnimateFrames = function (cls, useOriginValue) { + if (cls=='enemys' || cls=='npcs') { + return 2; + } + if (cls == 'animates' || cls == 'enemy48') { + return 4; + } + if (cls == 'npc48') { + return useOriginValue? 4 : 1; + } + return 1; +} + ////// 添加一些信息到block上 ////// maps.prototype.addInfo = function (block) { if (core.isset(block.event)) { @@ -113,12 +126,7 @@ maps.prototype.addInfo = function (block) { } } if (!core.isset(block.event.animate)) { - if (block.event.cls=='enemys' || block.event.cls=='npcs') { - block.event.animate = 2; - } - if (block.event.cls == 'animates' || block.event.cls == 'enemy48' || block.event.cls == 'npc48') { - block.event.animate = 4; - } + block.event.animate = this._getAnimateFrames(block.event.cls, false); } block.event.height = 32; if (block.event.cls == 'enemy48' || block.event.cls == 'npc48') @@ -1057,7 +1065,7 @@ maps.prototype.moveBlock = function(x,y,steps,time,keep,callback) { destY += core.utils.scan[t].y; }); - var animateValue = block.event.animate || 1, animateCurrent = isTileset?bx:0, animateTime = 0; + var animateValue = this._getAnimateFrames(block.event.cls, true), animateCurrent = isTileset?bx:0, animateTime = 0; var blockCanvas = this.__initBlockCanvas(block, height, x, y); var headCanvas = blockCanvas.headCanvas, bodyCanvas = blockCanvas.bodyCanvas, damageCanvas = blockCanvas.damageCanvas; var opacity = 1; diff --git a/libs/ui.js b/libs/ui.js index f083ddae..a89adab7 100644 --- a/libs/ui.js +++ b/libs/ui.js @@ -349,20 +349,18 @@ ui.prototype.getTitleAndIcon = function (content) { var id=null, name=null, image=null, icon=null, iconHeight=32, animate=null; var getInfo = function (v) { - ["enemy48", "enemys", "npc48", "npcs"].forEach(function (x) { - if (core.isset(core.material.icons[x][v])) { - image = core.material.images[x]; - icon = core.material.icons[x][v]; - if (x.indexOf("48")>=0) { - iconHeight = 48; - animate = 4; - } - else { - iconHeight = 32; - animate = 2; - } + var number = core.maps.getNumberById(v); + if (number>0) { + var block = core.maps.initBlock(0,0,number); + core.maps.addInfo(block); + if (core.isset(block.event)) { + var cls = block.event.cls; + image = core.material.images[cls]; + icon = core.material.icons[cls][v]; + iconHeight = block.event.height; + animate = block.event.animate; } - }); + } }; if (content.indexOf("\t[")==0 || content.indexOf("\\t[")==0) {