diff --git a/_server/MotaAction.g4 b/_server/MotaAction.g4 index cdb905c3..bf089962 100644 --- a/_server/MotaAction.g4 +++ b/_server/MotaAction.g4 @@ -2428,20 +2428,21 @@ return code; */; choicesContext - : '子选项' EvalString '图标' IdString? '颜色' ColorString? Colour '出现条件' EvalString? BGNL? Newline action+ + : '子选项' EvalString '图标' IdString? '颜色' ColorString? Colour '启用条件' EvalString? '出现条件' EvalString? BGNL? Newline action+ /* choicesContext tooltip : 选项的选择 helpUrl : /_docs/#/instruction -default : ["提示文字:红钥匙","","",""] +default : ["提示文字:红钥匙","","","",""] allIds : ['IdString_0'] colour : this.subColor ColorString_0 = ColorString_0 ? (', "color": ['+ColorString_0+']') : ''; -EvalString_1 = EvalString_1 && (', "condition": "'+EvalString_1+'"') +EvalString_1 = EvalString_1 && (', "need": "'+EvalString_1+'"'); +EvalString_2 = EvalString_2 && (', "condition": "'+EvalString_2+'"'); IdString_0 = IdString_0?(', "icon": "'+IdString_0+'"'):''; var collapsed=block.isCollapsed()?', "_collapsed": true':''; -var code = '{"text": "'+EvalString_0+'"'+IdString_0+ColorString_0+EvalString_1+collapsed+', "action": [\n'+action_0+']},\n'; +var code = '{"text": "'+EvalString_0+'"'+IdString_0+ColorString_0+EvalString_1+EvalString_2+collapsed+', "action": [\n'+action_0+']},\n'; return code; */; diff --git a/_server/MotaActionParser.js b/_server/MotaActionParser.js index 7b8774d6..06ea0f0d 100644 --- a/_server/MotaActionParser.js +++ b/_server/MotaActionParser.js @@ -689,7 +689,7 @@ ActionParser.prototype.parseAction = function() { for(var ii=data.choices.length-1,choice;choice=data.choices[ii];ii--) { choice.color = this.Colour(choice.color); text_choices=MotaActionFunctions.xmlText('choicesContext', [ - choice.text,choice.icon,choice.color,'rgba('+choice.color+')',choice.condition||'',this.insertActionList(choice.action),text_choices], + choice.text,choice.icon,choice.color,'rgba('+choice.color+')',choice.need||'',choice.condition||'',this.insertActionList(choice.action),text_choices], /* isShadow */false, /*comment*/ null, /*collapsed*/ choice._collapsed); } if (!this.isset(data.text)) data.text = ''; diff --git a/_server/editor_blocklyconfig.js b/_server/editor_blocklyconfig.js index 15f90b7c..ddbee57b 100644 --- a/_server/editor_blocklyconfig.js +++ b/_server/editor_blocklyconfig.js @@ -108,7 +108,7 @@ editor_blocklyconfig=(function(){ MotaActionBlocks['confirm_s'].xmlText(), MotaActionBlocks['choices_s'].xmlText([ '选择剑或者盾','流浪者','man',0,MotaActionBlocks['choicesContext'].xmlText([ - '剑','','',null,'',MotaActionFunctions.actionParser.parseList([{"type": "openDoor", "loc": [3,3]}]), + '剑','','',null,'','',MotaActionFunctions.actionParser.parseList([{"type": "openDoor", "loc": [3,3]}]), ]) ]), ], diff --git a/libs/actions.js b/libs/actions.js index 90752d90..6de7112d 100644 --- a/libs/actions.js +++ b/libs/actions.js @@ -974,10 +974,15 @@ actions.prototype._clickAction = function (x, y) { if (x >= this.CHOICES_LEFT && x <= this.CHOICES_RIGHT) { var topIndex = this.HSIZE - parseInt((choices.length - 1) / 2) + (core.status.event.ui.offset || 0); if (y >= topIndex && y < topIndex + choices.length) { + var choice = choices[y - topIndex]; + if (choice.need != null && choice.need != '' && !core.calValue(choice.need)) { + core.drawTip("无法选择此项"); + return; + } clearTimeout(core.status.event.interval); // 选择 core.status.route.push("choices:" + (y - topIndex)); - core.insertAction(choices[y - topIndex].action); + core.insertAction(choice.action); core.doAction(); } } diff --git a/libs/events.js b/libs/events.js index c0bf4b80..4e2cf5da 100644 --- a/libs/events.js +++ b/libs/events.js @@ -1866,7 +1866,13 @@ events.prototype._action_choices = function (data, x, y, prefix) { setTimeout(function () { core.status.route.push("choices:"+index); if (index != 'none') { - core.insertAction(data.choices[index].action); + // 检查 + var choice = data.choices[index]; + if (choice.need != null && choice.need != '' && !core.calValue(choice.need)) { + // 无法选择此项:直接忽略 + } else { + core.insertAction(choice.action); + } } core.doAction(); }, core.status.replay.speed == 24 ? 1 : 750 / Math.max(1, core.status.replay.speed)); diff --git a/libs/ui.js b/libs/ui.js index 7aeb4019..909c22e7 100644 --- a/libs/ui.js +++ b/libs/ui.js @@ -1659,6 +1659,7 @@ ui.prototype._drawChoices_drawChoices = function (choices, isWindowSkin, hPos, v core.setFont('ui', this._buildFont(17, true)); for (var i = 0; i < choices.length; i++) { var color = core.arrayToRGBA(choices[i].color || core.status.textAttribute.text); + if (choices[i].need != null && choices[i].need != '' && !core.calValue(choices[i].need)) color = '#999999'; core.setFillStyle('ui', color); var offset = this.HPIXEL; if (choices[i].icon) {