diff --git a/_server/CodeMirror/defs.js b/_server/CodeMirror/defs.js index 6f4ce688..783376a8 100644 --- a/_server/CodeMirror/defs.js +++ b/_server/CodeMirror/defs.js @@ -2608,6 +2608,10 @@ var terndefs_f6783a0a_522d_417e_8407_94c67b692e50 = [ "!doc": "静默增减某种道具的持有量 不会更新游戏画面或是显示提示
例如:core.addItem('yellowKey', -2) // 没收两把黄钥匙
itemId: 道具id
itemNum: 增加量,负数表示没收", "!type": "fn(itemId: string, itemNum?: number)" }, + "getDisplayItemsInToolbox": { + "!doc": "获得所有应该在道具栏显示的某个类型道具", + "!type": "fn(cls: string) -> [string]" + }, "unloadEquip": { "!doc": "脱下某个类型的装备
例如:core.unloadEquip(1) // 卸下盾牌,无回调
equipType: 装备类型编号,自然数
callback: 卸下装备后的回调函数", "!type": "fn(equipType: number, callback?: fn())" diff --git a/_server/table/plugins.comment.js b/_server/table/plugins.comment.js index b968d3fe..e19c11ff 100644 --- a/_server/table/plugins.comment.js +++ b/_server/table/plugins.comment.js @@ -69,6 +69,12 @@ var plugins_comment_c456ea59_6018_45ef_8bcc_211a24c627dc = { "_range": "typeof(thiseval)=='string' || thiseval==null", "_data": "楼传可以跳过楼层" }, + "itemCategory": { + "_leaf": true, + "_type": "textarea", + "_range": "typeof(thiseval)=='string' || thiseval==null", + "_data": "物品分类插件" + }, "smoothCamera": { "_leaf": true, "_type": "textarea", diff --git a/libs/actions.js b/libs/actions.js index ff02f1a2..1d25fc3a 100644 --- a/libs/actions.js +++ b/libs/actions.js @@ -1346,10 +1346,8 @@ actions.prototype._keyUpQuickShop = function (keycode) { ////// 工具栏界面时的点击操作 ////// actions.prototype._clickToolbox = function (x, y) { - var tools = Object.keys(core.status.hero.items.tools) - .filter(function (id) { return !core.material.items[id].hideInToolbox; }).sort(); - var constants = Object.keys(core.status.hero.items.constants) - .filter(function (id) { return !core.material.items[id].hideInToolbox; }).sort(); + var tools = core.getDisplayItemsInToolbox('tools'), + constants = core.getDisplayItemsInToolbox('constants'); // 装备栏 if (x >= this.LAST - 2 && y == 0) { @@ -1402,10 +1400,8 @@ actions.prototype._clickToolbox = function (x, y) { ////// 选择工具栏界面中某个Index后的操作 ////// actions.prototype._clickToolboxIndex = function (index) { - var tools = Object.keys(core.status.hero.items.tools) - .filter(function (id) { return !core.material.items[id].hideInToolbox; }).sort(); - var constants = Object.keys(core.status.hero.items.constants) - .filter(function (id) { return !core.material.items[id].hideInToolbox; }).sort(); + var tools = core.getDisplayItemsInToolbox('tools'), + constants = core.getDisplayItemsInToolbox('constants'); var items = null; var select; @@ -1435,10 +1431,8 @@ actions.prototype._keyDownToolbox = function (keycode) { var last_index = this.LAST - 1; - var tools = Object.keys(core.status.hero.items.tools) - .filter(function (id) { return !core.material.items[id].hideInToolbox; }).sort(); - var constants = Object.keys(core.status.hero.items.constants) - .filter(function (id) { return !core.material.items[id].hideInToolbox; }).sort(); + var tools = core.getDisplayItemsInToolbox('tools'), + constants = core.getDisplayItemsInToolbox('constants'); var index = core.status.event.selection; var toolsPage = core.status.event.data.toolsPage; var constantsPage = core.status.event.data.constantsPage; diff --git a/libs/control.js b/libs/control.js index 0b282363..66506bd3 100644 --- a/libs/control.js +++ b/libs/control.js @@ -1486,10 +1486,8 @@ control.prototype._replayAction_item = function (action) { core.useItem(itemId, false, core.replay); return true; } - var tools = Object.keys(core.status.hero.items.tools) - .filter(function (id) { return !core.material.items[id].hideInToolbox; }).sort(); - var constants = Object.keys(core.status.hero.items.constants) - .filter(function (id) { return !core.material.items[id].hideInToolbox; }).sort(); + var tools = core.getDisplayItemsInToolbox('tools'), + constants = core.getDisplayItemsInToolbox('constants'); var index, per = core.__SIZE__-1; if ((index=tools.indexOf(itemId))>=0) { core.status.event.data = {"toolsPage": Math.floor(index/per)+1, "constantsPage":1}; diff --git a/libs/items.js b/libs/items.js index b54db525..cd736bfc 100644 --- a/libs/items.js +++ b/libs/items.js @@ -207,6 +207,12 @@ items.prototype.removeItem = function (itemId, itemNum) { return true; } +////// 获得所有应该在道具栏显示的某个类型道具 ////// +items.prototype.getDisplayItemsInToolbox = function (cls) { + return Object.keys(core.status.hero.items[cls]) + .filter(function (id) { return !core.material.items[id].hideInToolbox; }).sort(); +} + // ---------- 装备相关 ------------ // items.prototype.getEquipTypeByName = function (name) { diff --git a/libs/ui.js b/libs/ui.js index d3971e30..ec01ef98 100644 --- a/libs/ui.js +++ b/libs/ui.js @@ -2382,10 +2382,8 @@ ui.prototype._drawToolbox_getInfo = function (index) { if (!core.status.event.data || core.status.event.data.toolsPage == null) core.status.event.data = {"toolsPage":1, "constantsPage":1, "selectId":null} // 获取物品列表 - var tools = Object.keys(core.status.hero.items.tools) - .filter(function (id) { return !core.material.items[id].hideInToolbox; }).sort(); - var constants = Object.keys(core.status.hero.items.constants) - .filter(function (id) { return !core.material.items[id].hideInToolbox; }).sort(); + var tools = core.getDisplayItemsInToolbox('tools'), + constants = core.getDisplayItemsInToolbox('constants'); // 处理页数 var toolsPage = core.status.event.data.toolsPage; var constantsPage = core.status.event.data.constantsPage; diff --git a/project/plugins.js b/project/plugins.js index 0b11ff7e..eb067be2 100644 --- a/project/plugins.js +++ b/project/plugins.js @@ -1235,6 +1235,144 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 = } +}, + "itemCategory": function () { + // 物品分类插件。此插件允许你对消耗道具和永久道具进行分类,比如标记「宝物类」「剧情道具」「药品」等等。 + // 使用方法: + // 1. 启用本插件 + // 2. 在下方数组中定义全部的物品分类类型 + // 3. 点击道具的【配置表格】,找到“【道具】相关的表格配置”,然后在【道具描述】之后仿照增加道具的分类: + /* + "category": { + "_leaf": true, + "_type": "textarea", + "_string": true, + "_data": "道具分类" + }, + */ + // (你也可以选择使用下拉框的方式定义每个道具的分类,写法参见上面的cls) + // 然后刷新编辑器,就可以对每个物品进行分类了 + + // 是否开启本插件,默认禁用;将此改成 true 将启用本插件。 + var __enable = false; + if (!__enable) return; + + // 在这里定义所有的道具分类类型,一行一个 + var categories = [ + "宝物类", + "辅助类", + "技能类", + "剧情道具", + "增益道具", + ]; + // 当前选中的道具类别 + var currentCategory = null; + + // 重写 core.ui.drawToolbox 以绘制分类类别 + var _drawToolbox = core.ui.drawToolbox; + core.ui.drawToolbox = function (index) { + _drawToolbox.call(this, index); + core.setTextAlign('ui', 'left'); + core.fillText('ui', '类别[E]:' + (currentCategory || "全部"), 15, this.PIXEL - 13); + } + + // 获得所有应该在道具栏显示的某个类型道具 + core.items.getDisplayItemsInToolbox = function (cls) { + // 检查类别 + return Object.keys(core.status.hero.items[cls]) + .filter(function (id) { + return !core.material.items[id].hideInToolbox && + (currentCategory == null || core.material.items[id].category == currentCategory); + }).sort(); + } + + // 注入道具栏的点击事件(点击类别) + var _clickToolbox = core.actions._clickToolbox; + core.actions._clickToolbox = function (x, y) { + if (x >= 0 && x <= this.HSIZE - 4 && y == this.LAST) { + drawToolboxCategory(); + return; + } + return _clickToolbox.call(core.actions, x, y); + } + + // 注入道具栏的按键事件(E键) + var _keyUpToolbox = core.actions._keyUpToolbox; + core.actions._keyUpToolbox = function (keyCode) { + if (keyCode == 69) { + // 按E键则打开分类类别选择 + drawToolboxCategory(); + return; + } + return _keyUpToolbox.call(core.actions, keyCode); + } + + // ------ 以下为选择道具分类的相关代码 ------ // + + // 关闭窗口时清除分类选择项 + var _closePanel = core.ui.closePanel; + core.ui.closePanel = function () { + currentCategory = null; + _closePanel.call(core.ui); + } + + // 弹出菜单以选择具体哪个分类 + // 直接使用 core.drawChoices 进行绘制 + var drawToolboxCategory = function () { + if (core.status.event.id != 'toolbox') return; + var selection = categories.indexOf(currentCategory) + 1; + core.ui.closePanel(); + core.status.event.id = 'toolbox-category'; + core.status.event.selection = selection; + core.lockControl(); + // 给第一项插入「全部」 + core.drawChoices('请选择道具类别', ["全部"].concat(categories)); + } + + // 选择某一项 + var _selectCategory = function (index) { + core.ui.closePanel(); + if (index <= 0 || index > categories.length) currentCategory = null; + else currentCategory = categories[index - 1]; + core.openToolbox(); + } + + var _clickToolBoxCategory = function (x, y) { + if (!core.status.lockControl || core.status.event.id != 'toolbox-category') return false; + + if (x < core.actions.CHOICES_LEFT || x > core.actions.CHOICES_RIGHT) return false; + var choices = core.status.event.ui.choices; + var topIndex = core.actions.HSIZE - parseInt((choices.length - 1) / 2) + (core.status.event.ui.offset || 0); + if (y >= topIndex && y < topIndex + choices.length) { + _selectCategory(y - topIndex); + } + return true; + } + + // 注入点击事件 + core.registerAction('onclick', 'toolbox-category', _clickToolBoxCategory, 100); + + // 注入光标跟随事件 + core.registerAction('onmove', 'toolbox-category', function (x, y) { + if (!core.status.lockControl || core.status.event.id != 'toolbox-category') return false; + core.actions._onMoveChoices(x, y); + return true; + }, 100); + + // 注入键盘光标事件 + core.registerAction('keyDown', 'toolbox-category', function (keyCode) { + if (!core.status.lockControl || core.status.event.id != 'toolbox-category') return false; + core.actions._keyDownChoices(keyCode); + return true; + }, 100); + + // 注入键盘按键事件 + core.registerAction('keyUp', 'toolbox-category', function (keyCode) { + if (!core.status.lockControl || core.status.event.id != 'toolbox-category') return false; + core.actions._selectChoices(core.status.event.ui.choices.length, keyCode, _clickToolBoxCategory); + return true; + }, 100); + }, "smoothCamera": function () { // 此插件开启后,大地图的瞬间移动将开启平滑镜头移动,避免突兀感 diff --git a/runtime.d.ts b/runtime.d.ts index 875e67e5..1420d1da 100644 --- a/runtime.d.ts +++ b/runtime.d.ts @@ -1928,6 +1928,9 @@ declare class items { */ addItem(itemId: string, itemNum?: number): void + /** 获得所有应该在道具栏显示的某个类型道具 */ + getDisplayItemsInToolbox(cls: string): string[] + /** * 判定某件装备的类型 * @example core.getEquipTypeById('shield5') // 1(盾牌)