diff --git a/libs/items.js b/libs/items.js index d4288779..811a15e0 100644 --- a/libs/items.js +++ b/libs/items.js @@ -26,37 +26,53 @@ items.prototype.getItems = function () { return items; } +///// 根据道具id,返回属性名:属性值的键值对 +items.prototype.getItemEffectValue = function (itemId, ratio) { + let effectObj = {}; + const itemEffectEvent = core.material.items[itemId].itemEffectEvent; + if (!itemEffectEvent) return effectObj; + const value = itemEffectEvent.value; + if (!ratio && ratio !== 0) { + ratio = core.status.thisMap.ratio; + if (!ratio && ratio !== 0) { + ratio = 1; + } + } + for (let statusName in value) { + let statusValue, needRatio; + const effect = value[statusName]; + if (statusName.endsWith(':o')) { + needRatio = true; + statusName = statusName.slice(0, -2); + } + if (core.status.hero.hasOwnProperty(statusName)) { + for (var i = 0; i < itemNum; ++i) { + try { + statusValue = eval(effect); + } + catch (e) { + console.error(e); + } + if (needRatio) statusValue *= ratio; + effectObj[statusName] = statusValue; + } + } + } + return effectObj; +} + + ////// “即捡即用类”道具的使用效果 ////// items.prototype.getItemEffect = function (itemId, itemNum) { const itemCls = core.material.items[itemId].cls; // 消耗品 if (itemCls === 'items') { const curr_hp = core.status.hero.hp; - const itemEffectEvent = core.material.items[itemId].itemEffectEvent; - if (itemEffectEvent) { - const { value } = itemEffectEvent; - for (let statusName in value) { - let statusValue, ratio, needRatio; - const effect = value[statusName]; - if (statusName.endsWith(':o')) { - needRatio = true; - statusName = statusName.slice(0, -2); - } - ratio = core.status.thisMap.ratio || 1; - if (core.status.hero.hasOwnProperty(statusName)) { - for (var i = 0; i < itemNum; ++i) { - try { - statusValue = eval(effect); - } - catch (e) { - console.error(e); - } - if (needRatio) statusValue *= ratio; - core.addStatus(statusName, statusValue); - } - } - } + const effectObj = this.getItemEffectValue(itemId); + for (let statusName in effectObj) { + if (effectObj.hasOwnProperty(statusName)) core.addStatus(statusName, effectObj[statusName]); } + const itemEffect = core.material.items[itemId].itemEffect; if (itemEffect) { try { diff --git a/libs/maps.js b/libs/maps.js index c6995949..681c856f 100644 --- a/libs/maps.js +++ b/libs/maps.js @@ -1874,22 +1874,17 @@ maps.prototype._drawThumbnail_drawToTarget = function (floorId, options) { } else { // 只绘制可见窗口 - // drawSize:默认为1,楼传和SL界面单独判定,意义不明,有待研究 - const drawSize = options.drawSize || 1; - const [pw, ph] = [core.__PIXELS__, core.__PIXELS__], - [hw, hh] = [core.__HALF_SIZE__, core.__HALF_SIZE__], - [W, H] = [core.__SIZE__, core.__SIZE__], - [w, h] = [core.__PIXELS__ * drawSize, core.__PIXELS__ * drawSize]; + const pxs = core.__PIXELS__; if (options.v2) { - if (options.noHD) core.drawImage(ctx, tempCanvas.canvas, 0, 0, pw, ph, x, y, w, h); - else core.drawImage(ctx, tempCanvas.canvas, 0, 0, pw * scale, ph * scale, x, y, w, h); + if (options.noHD) core.drawImage(ctx, tempCanvas.canvas, 0, 0, pxs, pxs, x, y, size, size); + else core.drawImage(ctx, tempCanvas.canvas, 0, 0, pxs * scale, pxs * scale, x, y, size, size); } else { - const offsetX = core.clamp(centerX - hw, 0, width - W), - offsetY = core.clamp(centerY - hh, 0, height - H); + const offsetX = core.clamp(centerX - core.__HALF_SIZE__, 0, width - core.__SIZE__), + offsetY = core.clamp(centerY - core.__HALF_SIZE__, 0, height - core.__SIZE__); if (options.noHD) { - core.drawImage(ctx, tempCanvas.canvas, offsetX * 32, offsetY * 32, pw, ph, x, y, w, h); + core.drawImage(ctx, tempCanvas.canvas, offsetX * 32, offsetY * 32, pxs, pxs, x, y, size, size); } else { - core.drawImage(ctx, tempCanvas.canvas, offsetX * 32 * scale, offsetY * 32 * scale, pw * scale, ph * scale, x, y, w, h); + core.drawImage(ctx, tempCanvas.canvas, offsetX * 32 * scale, offsetY * 32 * scale, pxs * scale, pxs * scale, x, y, size, size); } } } diff --git a/libs/ui.js b/libs/ui.js index 0a8fc7d5..5ca53c49 100644 --- a/libs/ui.js +++ b/libs/ui.js @@ -2578,8 +2578,7 @@ ui.prototype.drawFly = function (page) { } var size = this.PIXEL - 143; core.strokeRect('ui', 20, 100, size, size, '#FFFFFF', 2); - core.drawThumbnail(floorId, null, { ctx: 'ui', x: 20, y: 100, size: size, damage: true, drawSize: 0.6 }); - // 好像是无法理解的魔数,有待将来研究及优化 + core.drawThumbnail(floorId, null, { ctx: 'ui', x: 20, y: 100, size: size, damage: true }); } ////// 绘制中心对称飞行器 @@ -3094,7 +3093,6 @@ ui.prototype._drawSLPanel_drawRecord = function (title, data, x, y, size, cho, h core.drawThumbnail(data.floorId, map.blocks, { heroLoc: data.hero.loc, heroIcon: data.hero.image, flags: data.hero.flags, ctx: 'ui', x: x - size / 2, y: y + 15, size: size, centerX: data.hero.loc.x, centerY: data.hero.loc.y, noHD: true, - drawSize: 0.285, // 完全无法理解的魔数 }); if (core.isPlaying() && core.getFlag("hard") != data.hero.flags.hard) { core.fillRect('ui', x - size / 2, y + 15, size, size, [0, 0, 0, 0.4]); @@ -3318,27 +3316,12 @@ ui.prototype._drawStatistics_items = function (floorId, floor, id, obj) { core.setFlag("__statistics__", true); var ratio = core.status.thisMap.ratio; core.status.thisMap.ratio = core.clone(core.status.maps[floorId].ratio); - const itemInfo = core.material.items[id]; - if (itemInfo.hasOwnProperty('itemEffectEvent') && itemInfo.itemEffectEvent.hasOwnProperty('value')) { - const values = itemInfo.itemEffectEvent.value; - for (let statusName in values) { - const getStatusValue = values[statusName]; - let needRatio, statusValue; - if (statusName.endsWith(':o')) { - needRatio = true; - statusName = statusName.slice(0, -2); - } - if (core.status.hero.hasOwnProperty(statusName)) { - try { - statusValue = eval(getStatusValue); - } catch (error) { - console.log(error); - } - if (needRatio) statusValue *= ratio; - core.addStatus(statusName, statusValue); - } - } + + const effectObj = core.items.getItemEffectValue(itemId, ratio); + for (let statusName in effectObj) { + if (effectObj.hasOwnProperty(statusName)) core.addStatus(statusName, effectObj[statusName]); } + try { eval(core.material.items[id].itemEffect); } catch (e) { } core.status.thisMap.ratio = ratio; diff --git a/runtime.d.ts b/runtime.d.ts index df1ab19e..f703954a 100644 --- a/runtime.d.ts +++ b/runtime.d.ts @@ -1517,7 +1517,7 @@ interface enemys { getEnemys(): any /** 获得所有特殊属性定义 */ - getSpecials():[number, string | ((enemy: Enemy) => string), string | ((enemy: Enemy) => string), + getSpecials(): [number, string | ((enemy: Enemy) => string), string | ((enemy: Enemy) => string), string | [number, number, number, number?], number?][] /** 获得所有特殊属性的颜色 */ @@ -1570,7 +1570,7 @@ interface maps { [x: string]: any } } - + /** * 根据图块id得到数字(地图矩阵中的值) * @example core.getNumberById('yellowWall'); // 1 @@ -2067,6 +2067,14 @@ interface loader { /** @file items.js 主要负责一切和道具相关的内容。 */ interface items { + /** + * 获得给定ratio下(不填默认当前地图倍率)该即捡即用类的道具获得时勇士属性的增加效果 + * @example core.getItemEffectValue('redGem',1) // 获得倍率为1时红宝石增加的属性值 + * @param itemId 道具id + * @param ratio 倍率,不填默认当前地图倍率 + */ + getItemEffectValue(itemId: string, ratio?: number): { [key: string]: number } + /** * 即捡即用类的道具获得时的效果 * @example core.getItemEffect('redPotion', 10) // 执行获得10瓶红血的效果 @@ -3042,4 +3050,4 @@ interface Main { declare let core: CoreMixin declare let flags: { [x: string]: any } -declare let hero : CoreMixin['status']['hero'] \ No newline at end of file +declare let hero: CoreMixin['status']['hero'] \ No newline at end of file diff --git a/toolBar1.md b/toolBar1.md new file mode 100644 index 00000000..374b4156 --- /dev/null +++ b/toolBar1.md @@ -0,0 +1,292 @@ + 'icons': { + 'floor': 0, + 'name': null, + 'lv': 1, + 'hpmax': 2, + 'hp': 3, + 'atk': 4, + 'def': 5, + 'mdef': 6, + 'money': 7, + 'exp': 8, + 'up': 9, + 'book': 10, + 'fly': 11, + 'toolbox': 12, + 'keyboard': 13, + 'shop': 14, + 'save': 15, + 'load': 16, + 'settings': 17, + 'play': 18, + 'pause': 19, + 'stop': 20, + 'speedDown': 21, + 'speedUp': 22, + 'rewind': 23, + 'equipbox': 24, + 'mana': 25, + 'skill': 26, + 'btn1': 27, + 'btn2': 28, + 'btn3': 29, + 'btn4': 30, + 'btn5': 31, + 'btn6': 32, + 'btn7': 33, + 'btn8': 34 + }, + + ```html +
+ + + + + + + + + + + + + + + + + +

+
+ ``` + +```js +control.prototype._resize_toolBar = function (obj) { + // toolBar console.log(obj); + var toolBar = core.dom.toolBar; + if (core.domStyle.isVertical) { + toolBar.style.left = 0; + toolBar.style.right = ""; + toolBar.style.width = obj.outerSize + "px"; + toolBar.style.top = obj.statusBarHeightInVertical + obj.outerSize + "px"; + toolBar.style.height = obj.toolbarHeightInVertical + "px"; + toolBar.style.background = obj.globalAttribute.toolsBackground; + } + else { + if (obj.extendToolbar) { + toolBar.style.left = ""; + toolBar.style.right = 0; + toolBar.style.width = obj.outerSize + "px"; + toolBar.style.top = obj.outerSize + "px"; + toolBar.style.height = obj.TOOLBAR_HEIGHT * core.domStyle.scale + obj.BORDER + "px"; + toolBar.style.background = obj.globalAttribute.toolsBackground; + } else { + toolBar.style.left = 0; + toolBar.style.right = ""; + toolBar.style.width = obj.BAR_WIDTH * core.domStyle.scale + obj.BORDER + "px"; + toolBar.style.top = 0.718 * obj.outerSize + "px"; + toolBar.style.height = 0.281 * obj.outerSize + "px"; + toolBar.style.background = 'transparent'; + } + } + toolBar.style.borderLeft = obj.border; + toolBar.style.borderRight = toolBar.style.borderBottom = core.domStyle.isVertical || obj.extendToolbar ? obj.border : ''; + toolBar.style.fontSize = 16 * core.domStyle.scale + "px"; + + if (!core.domStyle.showStatusBar && !core.domStyle.isVertical && !obj.extendToolbar) { + toolBar.style.display = 'none'; + } else { + toolBar.style.display = 'block'; + } +} +``` +目测为控制toolBar形状的关键函数! +resize函数很关键 +```js +control.prototype.resize = function () { + if (main.mode == 'editor') return; + var clientWidth = main.dom.body.clientWidth, clientHeight = main.dom.body.clientHeight; + var CANVAS_WIDTH = core.__PIXELS__, BAR_WIDTH = Math.round(core.__PIXELS__ * 0.31); + var BORDER = 3; + var extendToolbar = core.flags.extendToolbar; + + var horizontalMaxRatio = (clientHeight - 2 * BORDER - (extendToolbar ? BORDER : 0)) / (CANVAS_WIDTH + (extendToolbar ? 38 : 0)); + + if (clientWidth - 3 * BORDER >= CANVAS_WIDTH + BAR_WIDTH || (clientWidth > clientHeight && horizontalMaxRatio < 1)) { + // 横屏 + core.domStyle.isVertical = false; + + core.domStyle.availableScale = []; + [1, 1.25, 1.5, 1.75, 2, 2.25, 2.5].forEach(function (v) { + if (clientWidth - 3 * BORDER >= v * (CANVAS_WIDTH + BAR_WIDTH) && horizontalMaxRatio >= v) { + core.domStyle.availableScale.push(v); + } + }); + if (core.domStyle.availableScale.indexOf(core.domStyle.scale) < 0) { + core.domStyle.scale = Math.min(1, horizontalMaxRatio); + } + } + else { + // 竖屏 + core.domStyle.isVertical = true; + core.domStyle.scale = Math.min((clientWidth - 2 * BORDER) / CANVAS_WIDTH); + core.domStyle.availableScale = []; + extendToolbar = false; + } + + var statusDisplayArr = this._shouldDisplayStatus(), count = statusDisplayArr.length; + var statusCanvas = core.flags.statusCanvas, statusCanvasRows = core.values.statusCanvasRowsOnMobile || 3; + var col = statusCanvas ? statusCanvasRows : Math.ceil(count / 3); + if (col > 5) { + if (statusCanvas) alert("自绘状态栏的在竖屏下的行数应不超过5!"); + else alert("当前状态栏数目(" + count + ")大于15,请调整到不超过15以避免手机端出现显示问题。"); + } + var globalAttribute = core.status.globalAttribute || core.initStatus.globalAttribute; + + var obj = { + clientWidth: clientWidth, + clientHeight: clientHeight, + CANVAS_WIDTH: CANVAS_WIDTH, + BORDER: BORDER, + BAR_WIDTH: BAR_WIDTH, + TOOLBAR_HEIGHT: 38, + outerSize: CANVAS_WIDTH * core.domStyle.scale + 2 * BORDER, + globalAttribute: globalAttribute, + border: '3px ' + core.arrayToRGBA(globalAttribute.borderColor) + ' solid', + statusDisplayArr: statusDisplayArr, + count: count, + col: col, + statusBarHeightInVertical: core.domStyle.isVertical ? (32 * col + 6) * core.domStyle.scale + 2 * BORDER : 0, + toolbarHeightInVertical: core.domStyle.isVertical ? 38 * core.domStyle.scale + 2 * BORDER : 0, + extendToolbar: extendToolbar, + is15x15: core.__SIZE__ == 15 + }; + + this._doResize(obj); + this.setToolbarButton(); + core.updateStatusBar(); +} +``` + +```js +////// 工具栏界面时的点击操作 ////// +actions.prototype._clickToolbox + +``` +疑似看的是event.id 神人设计 + +尝试修改,改动总结 +```js +// # main.js + this.statusBar = { + 'image': { + 'floor': document.getElementById('img-floor'), + 'name': document.getElementById('img-name'), + 'lv': document.getElementById('img-lv'), + 'hpmax': document.getElementById('img-hpmax'), + 'hp': document.getElementById("img-hp"), + 'mana': document.getElementById("img-mana"), + 'atk': document.getElementById("img-atk"), + 'def': document.getElementById("img-def"), + 'mdef': document.getElementById("img-mdef"), + 'money': document.getElementById("img-money"), + 'exp': document.getElementById("img-exp"), + 'up': document.getElementById("img-up"), + 'skill': document.getElementById('img-skill'), + 'book': document.getElementById("img-book"), + 'fly': document.getElementById("img-fly"), + 'toolbox': document.getElementById("img-toolbox"), + 'keyboard': document.getElementById("img-keyboard"), + 'shop': document.getElementById('img-shop'), + 'save': document.getElementById("img-save"), + 'load': document.getElementById("img-load"), + 'settings': document.getElementById("img-settings"), + 'btn1': document.getElementById("img-btn1"), + 'btn2': document.getElementById("img-btn2"), + 'btn3': document.getElementById("img-btn3"), + 'btn4': document.getElementById("img-btn4"), + 'btn5': document.getElementById("img-btn5"), + 'btn6': document.getElementById("img-btn6"), + 'btn7': document.getElementById("img-btn7"), + 'btn8': document.getElementById("img-btn8"), + 'slime': document.getElementById('img-slime'), // 增加 + }, + //... this.statsBar.image中添加slime + + 'icons': { + 'floor': 0, + 'name': null, + 'lv': 1, + 'hpmax': 2, + 'hp': 3, + 'atk': 4, + 'def': 5, + 'mdef': 6, + 'money': 7, + 'exp': 8, + 'up': 9, + 'book': 10, + 'fly': 11, + 'toolbox': 12, + 'keyboard': 13, + 'shop': 14, + 'save': 15, + 'load': 16, + 'settings': 17, + 'play': 18, + 'pause': 19, + 'stop': 20, + 'speedDown': 21, + 'speedUp': 22, + 'rewind': 23, + 'equipbox': 24, + 'mana': 25, + 'skill': 26, + 'btn1': 27, + 'btn2': 28, + 'btn3': 29, + 'btn4': 30, + 'btn5': 31, + 'btn6': 32, + 'btn7': 33, + 'btn8': 34, + 'slime': 35, // 增加 + }, + //... this.statsBar.icon中添加slime 会自动采用该列第35个图片作为相应的icon + } + + main.statusBar.image.slime.onclick = function (e) { + e.stopPropagation(); + console.log(1); + }; + //... 添加slime的点击事件 +``` + + +那么元素img-slime从哪来呢? +答案是index.html +```js +
+ + + + + + + + + + + + + + + + + +

+
+``` + +controls中的函数_updateStatusBar_setToolboxIcon也很重要,该函数调控进/出录像模式的图标变化 +setToolbarButton 改变工具栏为按钮1-8 \ No newline at end of file