修改装备属性

This commit is contained in:
ckcz123 2021-07-24 21:33:12 +08:00
parent ead6e596f7
commit ceffe0d3b5
9 changed files with 105 additions and 8 deletions

View File

@ -1320,6 +1320,16 @@ index: 套装编号,自然数
removeItem: fn(itemId?: string, itemNum?: number)
删除某个物品
setEquip: fn(equipId: string, valueType: string, name: string, value: ?, operator?: string, prefix?: string)
设置某个装备的属性并计入存档
例如core.setEquip('sword1', 'value', 'atk', 300, '+='); // 设置铁剑的攻击力数值再加300
equipId: 装备id
valueType: 增幅类型只能是value数值或percentage百分比
name: 要修改的属性名称如atk
value: 要修改到的属性数值
operator: 操作符,可选,如+=表示在原始值上增加
prefix: 独立开关前缀,一般不需要
setItem: fn(itemId: string, itemNum?: number)
设置某种道具的持有量
例如core.setItem('yellowKey', 3) // 设置黄钥匙为3把

View File

@ -2212,6 +2212,10 @@ var terndefs_f6783a0a_522d_417e_8407_94c67b692e50 = [
"!doc": "暂停背景音乐的播放",
"!type": "fn()"
},
"setBgmSpeed": {
"!doc": "设置背景音乐的播放速度和音调<br/>speed: 播放速度必须为30-300中间的值。100为正常速度。<br/>usePitch: 是否同时改变音调(部分设备可能不支持)",
"!type": "fn(speed: number, usePitch?: bool)"
},
"setReplaySpeed": {
"!doc": "设置播放速度",
"!type": "fn(speed: number)"
@ -2709,6 +2713,10 @@ var terndefs_f6783a0a_522d_417e_8407_94c67b692e50 = [
"canEquip": {
"!doc": "检查能否穿上某件装备<br/>例如core.canEquip('sword5', true) // 主角可以装备神圣剑吗,如果不能会有提示<br/>equipId: 装备id<br/>hint: 无法穿上时是否提示(比如是因为未持有还是别的什么原因)<br/>返回值true表示可以穿上false表示无法穿上",
"!type": "fn(equipId: string, hint?: bool) -> bool"
},
"setEquip": {
"!doc": "设置某个装备的属性并计入存档<br/>例如core.setEquip('sword1', 'value', 'atk', 300, '+='); // 设置铁剑的攻击力数值再加300<br/>equipId: 装备id<br/>valueType: 增幅类型只能是value数值或percentage百分比<br/>name: 要修改的属性名称如atk<br/>value: 要修改到的属性数值<br/>operator: 操作符,可选,如+=表示在原始值上增加<br/>prefix: 独立开关前缀,一般不需要",
"!type": "fn(equipId: string, valueType: string, name: string, value: ?, operator?: string, prefix?: string)"
}
},
"utils": {

View File

@ -752,6 +752,7 @@ action
| setEnemyOnPoint_s
| resetEnemyOnPoint_s
| moveEnemyOnPoint_s
| setEquip_s
| setFloor_s
| setGlobalAttribute_s
| setGlobalValue_s
@ -1149,6 +1150,25 @@ return code;
*/;
setEquip_s
: '设置装备属性' ':' '装备ID' IdString EquipValueType_List '的' EvalString AssignOperator_List expression Newline
/* setEquip_s
tooltip : setEquip设置某个怪物的属性
helpUrl : /_docs/#/instruction
default : ["sword1", "value", "atk", "="]
allEquips : ['IdString_0']
colour : this.dataColor
EquipValueType_List_0 = EquipValueType_List_0 == 'percentage' ? ', "valueType": "percentage"' : ', "valueType": "value"';
if (AssignOperator_List_0 && AssignOperator_List_0 != '=') {
AssignOperator_List_0 = ', "operator": "' + AssignOperator_List_0 + '"';
} else AssignOperator_List_0 = '';
var code = '{"type": "setEquip", "id": "'+IdString_0+'"'+EquipValueType_List_0+', "name": "'+EvalString_0+'"'+AssignOperator_List_0+', "value": "'+expression_0+'"},\n';
return code;
*/;
setEnemyOnPoint_s
: '设置某点怪物属性' ':' 'x' PosString? ',' 'y' PosString? '楼层' IdString? '的' EnemyId_List AssignOperator_List expression Newline
@ -1904,7 +1924,7 @@ tooltip : loadEquip: 装上装备
helpUrl : /_docs/#/instruction
colour : this.dataColor
default : ["sword1"]
allItems : ['IdString_0']
allEquips : ['IdString_0']
var code = '{"type": "loadEquip", "id": "'+IdString_0+'"},\n';
return code;
*/;
@ -3826,6 +3846,10 @@ NextXY_List
: '横坐标'|'纵坐标'
/*NextXY_List ['nextX','nextY']*/;
EquipValueType_List
: '数值项'|'百分比项'
/*EquipValueType_List ['value','percentage']*/;
Colour
: 'sdeirughvuiyasdeb'+ //为了被识别为复杂词法规则
;

View File

@ -707,6 +707,10 @@ ActionParser.prototype.parseAction = function() {
this.next = MotaActionBlocks['moveEnemyOnPoint_s'].xmlText([
data.from[0], data.from[1], data.to[0], data.to[1], data.floorId||'',this.next]);
break;
case "setEquip":
this.next = MotaActionBlocks['setEquip_s'].xmlText([
MotaActionFunctions.replaceToName_token(data.id), data.valueType||'value', data.name, data["operator"]||'=', this.expandEvalBlock([data.value]), this.next]);
break;
case "setFloor":
this.next = MotaActionBlocks['setFloor_s'].xmlText([
data.name, data.floorId||null, JSON.stringify(data.value), this.next]);

View File

@ -669,14 +669,18 @@ editor_blockly = function () {
namesObj.allEnemys = Object.keys(core.material.enemys);
if (MotaActionFunctions && !MotaActionFunctions.disableReplace) {
namesObj.allEnemys = namesObj.allEnemys.concat(MotaActionFunctions.pattern.replaceEnemyList.map(function (x) {
return x[1];
}))
return x[1];
}))
}
namesObj.allItems = Object.keys(core.material.items);
namesObj.allEquips = namesObj.allItems.filter(function (one) { return core.material.items[one].cls == 'equips' });
if (MotaActionFunctions && !MotaActionFunctions.disableReplace) {
namesObj.allItems = namesObj.allItems.concat(MotaActionFunctions.pattern.replaceItemList.map(function (x) {
return x[1];
}))
return x[1];
}))
namesObj.allEquips = namesObj.allEquips.concat(MotaActionFunctions.pattern.replaceItemList.map(function (x) {
return x[1];
}))
}
namesObj.allAnimates = Object.keys(core.material.animates)
.concat(Object.keys(main.nameMap).filter(function (one) {return core.material.animates[main.nameMap[one]];}));
@ -710,7 +714,7 @@ editor_blockly = function () {
// 对音效进行补全
// 对全局商店进行补全
// 对楼层名进行补全
for(var ii=0,names;names=['allIds','allEnemys','allItems','allImages','allAnimates','allBgms','allSounds','allShops','allFloorIds','allDoors','allEvents'][ii];ii++){
for(var ii=0,names;names=['allIds','allEnemys','allItems','allEquips','allImages','allAnimates','allBgms','allSounds','allShops','allFloorIds','allDoors','allEvents'][ii];ii++){
if (MotaActionBlocks[type][names] && eval(MotaActionBlocks[type][names]).indexOf(name)!==-1) {
return filter(namesObj[names], content);
}

View File

@ -124,6 +124,7 @@ editor_blocklyconfig=(function(){
MotaActionBlocks['setEnemyOnPoint_s'].xmlText(),
MotaActionBlocks['resetEnemyOnPoint_s'].xmlText(),
MotaActionBlocks['moveEnemyOnPoint_s'].xmlText(),
MotaActionBlocks['setEquip_s'].xmlText(),
MotaActionBlocks['setFloor_s'].xmlText(),
MotaActionBlocks['setGlobalAttribute_s'].xmlText(),
MotaActionBlocks['setGlobalValue_s'].xmlText(),

View File

@ -1208,7 +1208,7 @@ events.prototype.__precompile_getArray = function () {
"closeDoor", "battle", "trigger", "insert", "setEnemyOnPoint", "resetEnemyOnPoint"
];
var values = [
"setValue", "setEnemy", "setFloor", "setGlobalValue",
"setValue", "setEnemy", "setEnemyOnPoint", "setEquip", "setFloor", "setGlobalValue",
];
var uievents = [
"clearMap", "fillText", "fillBoldText", "fillRect", "strokeRect", "fillEllipse", "strokeEllipse",
@ -1795,6 +1795,11 @@ events.prototype._action_moveEnemyOnPoint = function (data, x, y, prefix) {
core.doAction();
}
events.prototype._action_setEquip = function (data, x, y, prefix) {
core.setEquip(data.id, data.valueType, data.name, data.value, data.operator, prefix);
core.doAction();
}
events.prototype._action_setFloor = function (data, x, y, prefix) {
this.setFloorInfo(data.name, data.value, data.floorId, prefix);
core.doAction();

View File

@ -16,7 +16,14 @@ items.prototype._init = function () {
////// 获得所有道具 //////
items.prototype.getItems = function () {
return core.clone(this.items);
var items = core.clone(this.items);
var equipInfo = core.getFlag('equipInfo');
if (equipInfo) {
for (var id in equipInfo) {
items[id].equip = core.clone(equipInfo[id]);
}
}
return items;
}
////// “即捡即用类”道具的使用效果 //////
@ -404,3 +411,25 @@ items.prototype.quickLoadEquip = function (index) {
core.drawTip("成功换上" + index + "号套装");
}
////// 设置装备属性 //////
items.prototype.setEquip = function (equipId, valueType, name, value, operator, prefix) {
var equip = core.material.items[equipId];
if (!equip || equip.cls != 'equips') return;
var equipInfo = equip.equip || {};
if (!equipInfo[valueType]) equipInfo[valueType] = {};
var toEquipInfo = core.clone(equipInfo);
toEquipInfo[valueType][name] = core.events._updateValueByOperator(core.calValue(value, prefix), equipInfo[valueType][name], operator);
// 如果是穿上状态,则还需要直接修改当前数值
if (core.hasEquip(equipId)) {
// 设置一个临时装备,然后模拟换装操作
var tempId = 'temp:' + equipId;
core.material.items[tempId] = {'cls': 'equips', 'equip': core.clone(toEquipInfo)};
this._loadEquipEffect(tempId, equipId);
delete core.material.items[tempId];
core.updateStatusBar();
}
equip.equip = core.clone(toEquipInfo);
flags.equipInfo = flags.equipInfo || {};
flags.equipInfo[equipId] = core.clone(toEquipInfo);
}

12
runtime.d.ts vendored
View File

@ -2032,6 +2032,18 @@ declare class items {
/** 根据类型获得一个可用的装备孔 */
getEquipTypeByName(name?: string): void
/**
*
* @example core.setEquip('sword1', 'value', 'atk', 300, '+='); // 设置铁剑的攻击力数值再加300
* @param equipId id
* @param valueType valuepercentage
* @param name atk
* @param value
* @param operator +=
* @param prefix
*/
setEquip(equipId: string, valueType: string, name: string, value: any, operator?: string, prefix?: string): void
}
/** @file ui.js 主要用来进行UI窗口的绘制如对话框、怪物手册、楼传器、存读档界面等等。*/