node menu add classify

This commit is contained in:
zhandouxiaojiji committed 2020-10-15 11:28:58 +08:00
1 parent 78aec1afb1
commit 31d986c5d2
3 files changed
+56 -8

No files matched your search

+36 -4
View File
@@ -167,18 +167,50 @@ export default class AppMenu {
} }
private createNodeMenu() { private createNodeMenu() {
const nodeItems: MenuItemConstructorOptions[] = []; const typeItems: MenuItemConstructorOptions[] = [];
const map: { [key: string]: MenuItemConstructorOptions } = {}
for (let t of this.settings.nodeTypes) {
let item: MenuItemConstructorOptions = {
id: t.type,
label: `${t.type}(${t.desc})`,
submenu: [],
};
typeItems.push(item);
map[t.type] = item;
}
const other: MenuItemConstructorOptions = {
id: 'other',
label: "其它",
submenu: [],
};
var hasOther = false;
for (let node of this.settings.nodeConfig) { for (let node of this.settings.nodeConfig) {
nodeItems.push({ const item: MenuItemConstructorOptions = {
label: `${node.name}(${node.desc})`, label: `${node.name}(${node.desc})`,
click: () => { click: () => {
console.log("create node", node.name); console.log("create node", node.name);
} }
}) }
let typeItem = map[node.type];
if(!typeItem) {
typeItem = other;
hasOther = true;
}
if (typeItem.submenu instanceof Menu) {
console.log("typeItem.submenu error", typeItem);
} else {
typeItem.submenu.push(item);
}
} }
if(hasOther) {
typeItems.push(other);
}
return new MenuItem({ return new MenuItem({
label: "新建节点", label: "新建节点",
submenu: nodeItems submenu: typeItems
}); });
} }
} }
+19 -3
View File
@@ -1,18 +1,30 @@
import * as fs from 'fs'; import * as fs from 'fs';
const settingPath = 'settings.json'; export interface BehaviorNodeType {
const sampleNodeConfig = 'sample-node-config.json' type: string;
desc?: string;
}
export interface SettingsModel { export interface SettingsModel {
recentWorkspaces?: string[]; recentWorkspaces?: string[];
recentFiles?: string[]; recentFiles?: string[];
nodeConfigPath?: string; // 节点配置路径 nodeConfigPath?: string; // 节点配置路径
nodeTypes?: BehaviorNodeType[];
} }
const settingPath = 'settings.json';
const sampleNodeConfig = 'sample-node-config.json';
const sampleNodeTypes: BehaviorNodeType[] = [
{ type: "Composite", desc: "复合节点" },
{ type: "Decorator", desc: "修饰节点" },
{ type: "Condition", desc: "条件节点" },
{ type: "Action", desc: "行为节点" },
]
export default class Settings { export default class Settings {
private settings: SettingsModel; private settings: SettingsModel;
constructor() { constructor() {
if(fs.existsSync(settingPath)) { if (fs.existsSync(settingPath)) {
const str = fs.readFileSync(settingPath, 'utf8'); const str = fs.readFileSync(settingPath, 'utf8');
this.settings = JSON.parse(str); this.settings = JSON.parse(str);
} else { } else {
@@ -20,6 +32,7 @@ export default class Settings {
recentWorkspaces: [], recentWorkspaces: [],
recentFiles: [], recentFiles: [],
nodeConfigPath: sampleNodeConfig, nodeConfigPath: sampleNodeConfig,
nodeTypes: sampleNodeTypes,
}; };
this.save(); this.save();
} }
@@ -38,6 +51,9 @@ export default class Settings {
const str = fs.readFileSync(this.nodeConfigPath, 'utf8'); const str = fs.readFileSync(this.nodeConfigPath, 'utf8');
return JSON.parse(str); return JSON.parse(str);
} }
get nodeTypes() {
return this.settings.nodeTypes;
}
set(config: SettingsModel) { set(config: SettingsModel) {
this.settings = { this.settings = {
+1 -1
View File
@@ -1 +1 @@
[{"desc":"BOSS对话","input":["{对象}?"],"doc":"+ 使用event_level表中的事件ID(事件逻辑见事件表)\n","args":[{"desc":"事件ID","type":"int","name":"event_id"}],"name":"BossTalk"},{"desc":"获取自己的单位","output":["{单位}"],"name":"GetSelfAvatar"},{"desc":"炮手被动","args":[{"desc":"间隔","type":"int","name":"lock"},{"desc":"排除技能id","type":"int?","name":"ex1"},{"desc":"排除技能id","type":"int?","name":"ex2"},{"desc":"排除技能id","type":"int?","name":"ex3"},{"desc":"排除技能id","type":"int?","name":"ex4"},{"desc":"排除技能id","type":"int?","name":"ex5"}],"name":"Passive1010200"},{"desc":"获取单位数量","output":["数量(int)"],"args":[{"desc":"阵营1\/2","type":"int?","name":"camp"},{"desc":"角色","type":"boolean?","name":"role"},{"desc":"怪物","type":"boolean?","name":"monster"},{"desc":"子弹","type":"boolean?","name":"bullet"},{"desc":"机器人","type":"boolean?","name":"robot"}],"doc":"+ 默认全地图\n","name":"GetAvatarCount"},{"desc":"始终返回失败","doc":"+ 只能有一个子节点,多个仅执行第一个\n+ 不管子节点是否成功都返回失败\n","name":"AlwaysFail"},{"desc":"复活","name":"Realive"},{"desc":"加怒气点","input":["{作用目标}?"],"doc":"+ 是正常的怒气产消,会用于正常逻辑的怒气消耗\n+ 默认目标为自己\n+ 仅使用一次,是指本次释放技能所有被勾选“仅使用一次”的addAp节点最多加一次\n","args":[{"desc":"点数","type":"int","name":"add"},{"desc":"是否只加一次","type":"boolean?","name":"once"}],"name":"AddAp"},{"desc":"比较公共血量(千分比)","args":[{"desc":">","type":"int?","name":"gt"},{"desc":">=","type":"int?","name":"ge"},{"desc":"==","type":"int?","name":"eq"},{"desc":"<=","type":"int?","name":"le"},{"desc":"<","type":"int?","name":"lt"}],"doc":"+ 直接针对地图中的公共血量\n","name":"CmpShareHp"},{"desc":"查找敌人","output":["目标单位"],"args":[{"desc":"x","type":"int?","name":"x"},{"desc":"y","type":"int?","name":"y"},{"desc":"宽","type":"lua?","name":"w"},{"desc":"高","type":"lua?","name":"h"},{"desc":"查找类型","type":"string?","name":"type"},{"desc":"怪物类型","type":"int?","name":"monster_type"},{"desc":"以子弹为中心","type":"boolean?","name":"bullet"},{"desc":"忽略碰撞体积","type":"boolean?","name":"no_collision"},{"desc":"考虑自身体积","type":"boolean?","name":"self_collision"},{"desc":"距离优先","type":"boolean?","name":"dis_priority"}],"doc":"+ 返回单目标,判定优先级:威胁值最高,当威胁值相等时选最近那一个\n+ 没找到返回失败\n","name":"FindEnemy"},{"desc":"放范围内权重最大的技能","input":["{目标}"],"doc":"+ 当多个技能都可以满足释放条件时,按权重释放,被动技能不参与\n","output":["{技能id}"],"name":"LaunchSkillWithWeight"},{"desc":"设置朝向","args":[{"desc":"反向","type":"boolean?","name":"anti"},{"desc":"指定朝向","type":"int?","name":"face"}],"doc":"+ 1为右,-1为左\n+ 指定朝向优先\n","name":"SetFace"},{"desc":"随机移动","args":[{"desc":"只向前随机","type":"boolean?","name":"face"},{"desc":"范围","type":"int?","name":"range"}],"doc":"+ 无法移动返回失败\n+ 移动过程中返回正在运行状态,达到目的地返回成功\n","name":"MoveRandom"},{"desc":"贝塞尔曲线运动","input":["[路点]","{作用单位}"],"doc":"+ 子弹专用运动曲线,人物带测\n+ 飞行过程返回正在运行,抵达返回成功,前端假象,后端瞬移,最好不要在飞行过程做碰撞\n+ 所输入路点少于两个返回失败\n","args":[{"desc":"时间","type":"int","name":"time"},{"desc":"子弹","type":"boolean?","name":"bullet"}],"name":"BezierCurve"},{"desc":"正在待机","name":"IsIdle"},{"desc":"获取范围内怪物数量","output":["数量(int)"],"args":[{"desc":"怪物id","type":"int?","name":"monsterid"},{"desc":"x","type":"int?","name":"x"},{"desc":"y","type":"int?","name":"y"},{"desc":"宽","type":"lua?","name":"w"},{"desc":"高","type":"lua?","name":"h"},{"desc":"以子弹为中心","type":"boolean?","name":"bullet"},{"desc":"忽略碰撞体积","type":"boolean?","name":"no_collision"}],"name":"GetMonsterCountInRange"},{"desc":"否为主角","input":["{对象}"],"name":"IsRole"},{"desc":"获取buff时间","output":["帧数(int)"],"args":[{"desc":"首层id","type":"int?","name":"buffid"}],"doc":"+ 获取BUFF当前剩余时间\n+ 当同ID的BUFF同时存在不止一个时,按最大层数的BUFF的结果\n","name":"GetBuffTime"},{"desc":"自增","input":["变量"],"doc":"+ 所输入变量为空,返回失败\n+ 变量稳定加1\n","args":[{"desc":"值","type":"lua?","name":"add"}],"name":"AddValue"},{"desc":"怪物寻敌(读配置警戒范围)","output":["[{目标}]"],"args":[{"desc":"查找类型","type":"string?","name":"type"},{"desc":"忽略碰撞体积","type":"boolean?","name":"no_collision"},{"desc":"考虑自身体积","type":"boolean?","Line truncated [{"input":["{作用目标}?"],"name":"AddAp","type":"Action","doc":"+ 是正常的怒气产消,会用于正常逻辑的怒气消耗\n+ 默认目标为自己\n+ 仅使用一次,是指本次释放技能所有被勾选“仅使用一次”的addAp节点最多加一次\n","args":[{"name":"add","type":"int","desc":"点数"},{"name":"once","type":"boolean?","desc":"是否只加一次"}],"desc":"加怒气点"},{"name":"AddSkillLevel","type":"Action","doc":"+ 战斗过程增加的技能等级,可增可减\n+ 没有携带该技能时返回失败\n+ 技能等级最高可达上限,最低到1\n","args":[{"name":"skillid","type":"int","desc":"skillid"},{"name":"add","type":"lua","desc":"增加等级"}],"desc":"增加技能等级"},{"input":["变量"],"name":"AddValue","type":"Action","doc":"+ 所输入变量为空,返回失败\n+ 变量稳定加1\n","args":[{"name":"add","type":"lua?","desc":"值"}],"desc":"自增"},{"name":"AlwaysFail","type":"Decorator","doc":"+ 只能有一个子节点,多个仅执行第一个\n+ 不管子节点是否成功都返回失败\n","desc":"始终返回失败"},{"name":"AlwaysSuccess","type":"Decorator","doc":"+ 只能有一个子节点,多个仅执行第一个\n+ 不管子节点是否成功都返回成功\n","desc":"始终返回成功"},{"input":["[数组]"],"name":"ArrayRandomOne","type":"Action","doc":"+ 输入数组为空,输出变量为空\n","output":["{随机值}"],"desc":"数组随机取一值"},{"input":["[路点]","{作用单位}"],"name":"BezierCurve","type":"Action","doc":"+ 子弹专用运动曲线,人物带测\n+ 飞行过程返回正在运行,抵达返回成功,前端假象,后端瞬移,最好不要在飞行过程做碰撞\n+ 所输入路点少于两个返回失败\n","args":[{"name":"time","type":"int","desc":"时间"},{"name":"bullet","type":"boolean?","desc":"子弹"}],"desc":"贝塞尔曲线运动"},{"input":["{对象}?"],"name":"BossTalk","type":"Action","doc":"+ 使用event_level表中的事件ID(事件逻辑见事件表)\n","args":[{"name":"event_id","type":"int","desc":"事件ID"}],"desc":"BOSS对话"},{"input":["{目标}"],"name":"Break","type":"Action","doc":"+ 没有目标、怪物不可控、霸体返回失败\n+ 打断对方所有正在运行技能,会打断行为树中的LockAction(会打断被动、不会打断AI)\n+ 禁止移动(lockAction)被打断会进入待机状态\n","args":[{"name":"time","type":"lua?","desc":"时间(帧)"},{"name":"gravity","type":"boolean?","desc":"禁止重力"},{"name":"move","type":"boolean?","desc":"禁止移动"},{"name":"jump","type":"boolean?","desc":"禁止跳跃"},{"name":"face","type":"boolean?","desc":"禁止转向"},{"name":"skill1","type":"boolean?","desc":"禁止普攻"},{"name":"skill2","type":"boolean?","desc":"禁止自动技能"},{"name":"skill3","type":"boolean?","desc":"禁止主动技能"},{"name":"skill4","type":"boolean?","desc":"禁止二段跳"},{"name":"ap","type":"boolean?","desc":"无法回怒"}],"desc":"打断并设置新状态"},{"name":"BulletDie","type":"Action","doc":"+ 子弹专用,非子弹返回失败\n","desc":"子弹销毁"},{"input":["{跟随目标}"],"name":"BulletFollow","type":"Action","doc":"+ 不能在跟随过程做碰撞检测\n+ 后端为时间到时瞬移至跟随目标(本质上无实际无移动过程)【无延迟情况下强制抵达】\n+ 跟随过程返回正在运行,到达后返回成功,无目标返回失败\n","args":[{"name":"time","type":"int","desc":"时间"},{"name":"vx","type":"int?","desc":"x初速度"},{"name":"vy","type":"int?","desc":"y初速度"}],"desc":"子弹跟随"},{"input":["{目标单位}"],"name":"CanHitBack","type":"Condition","doc":"+ 目标是主角、可击退的怪物(配表)且不处于霸体状态(目前不包括机器人与召唤物)则返回成功\n+ 其他情况或没有目标时返回失败\n","desc":"是否可以击退"},{"name":"CanLaunch","type":"Condition","doc":"# 返回失败的情况:\n+ 没有携带该技能(配表)\n+ 处于CD状态\n+ 所释放技能的类型处于lockAction状态\n+ 被动技能\n+ 怒气技能需求怒气不足\n","args":[{"name":"skillid","type":"int","desc":"技能id"}],"desc":"技能是否可释放"},{"name":"CanNormalAttack","type":"Condition","doc":"+ 判定该单位所携带的所有普攻技能是否可释放\n+ 失败条件跟CanLaunch相同\n","desc":"是否可释放普通攻击"},{"input":["{目标}"],"name":"ChangeAiVars","type":"Action","doc":"+ 改变指定单位的AI行为树的变量,无目标时返回失败\n+ 变量是即时修改,若选择立即执行则强制该行为树再次执行(需要处理重复执行问题)\n","args":[{"name":"now","type":"boolean?","desc":"立即执行"}],"desc":"修改AI行为树变量"},{"name":"ChangeBulletPath","type":"Action","doc":"+ 子弹轨迹在前端与后端中存在偏差,不要做过于浮夸的轨迹与碰撞\n+ 子弹专用,其他地方返回失败\n","args":[{"name":"vx","type":"int?","desc":"x初速度"},{"name"Line truncated