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(盾牌)