forked from 0xABAD/behavior_tree
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathbehaviorTreeGenerateJava.js
More file actions
129 lines (122 loc) · 3.56 KB
/
behaviorTreeGenerateJava.js
File metadata and controls
129 lines (122 loc) · 3.56 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
function generateJava(tree, team_number, tree_name) {
let result = `/* Tree ${tree_name} for ${team_number} generated by http://behaviortrees.ftcteams.com */`
indent = 0;
result += `\npackage org.firstinspires.ftc.teamcode.ftc${team_number}.BehaviorTrees.Trees;`
result += "\n" + generateImports(tree, team_number);
result += `\n\n\npublic class ${tree_name} {`;
result += '\n public static Node root(){';
result += generateNode(2, tree.root, true);
result += "\n }\n}"
result += "\n\n/* TREE"
result += generateTree(0, tree.root);
result += "\n */";
return result;
}
function generateImports(tree, team_number) {
let notIncluded = false;
var seen = {}
let result = `\nimport com.ftcteams.behaviortrees.Node;`;
for (let node of tree.nodes) {
if (seen.hasOwnProperty(node[0])) {
continue;
}
seen[node[0]] = true;
result += `\nimport com.ftcteams.behaviortrees.${node[0]};`;
}
for (let node of tree.actions) {
if (seen.hasOwnProperty(node[0])) {
continue;
}
seen[node[0]] = true;
result += `\nimport org.firstinspires.ftc.teamcode.ftc${team_number}.BehaviorTrees.Actions.${node[0]};`;
}
for (let node of tree.conditions) {
if (seen.hasOwnProperty(node[0])) {
continue;
}
seen[node[0]] = true;
result += `\nimport org.firstinspires.ftc.teamcode.ftc${team_number}.BehaviorTrees.Conditions.${node[0]};`;
if (node[1][0].hasNot && !notIncluded) {
result += `\nimport com.ftcteams.behaviortrees.Not;`;
notIncluded = true;
}
}
return result;
}
function generateNode(indent, node, root = false) {
let result = "\n" + " ".repeat(indent * 3);
let firstChild = true;
if (root) {
result += "return ";
}
if (node instanceof Action) {
result += `new ${node.name}()`;
} else if (node instanceof Condition) {
if (node.hasNot) {
result += `new Not(new ${node.name}(true))`;
} else {
result += `new ${node.name}()`;
}
} else if (node instanceof Sequence) {
result += `new Sequence(`;
for (let child of node.children) {
if (!firstChild) {
result += ",";
} else {
firstChild = false;
}
result += generateNode(indent + 1, child);
}
result += ")";
} else if (node instanceof Parallel) {
result += `new Parallel(${node.children.length},`;
for (let child of node.children) {
if (!firstChild) {
result += ",";
} else {
firstChild = false;
}
result += generateNode(indent + 1, child);
}
result += ")";
} else if (node instanceof Fallback) {
result += "new Fallback(";
for (let child of node.children) {
if (!firstChild) {
result += ",";
} else {
firstChild = false;
}
result += generateNode(indent + 1, child);
}
result += ")";
}
if (root) {
result += ";";
}
return result;
}
function generateTree(indent, node) {
let result = "\n" + "| ".repeat(indent);
if (node instanceof Action) {
result += `[${node.name}]`;
} else if (node instanceof Condition) {
result += `(${node.name})`;
} else if (node instanceof Sequence) {
result += `->`;
for (let child of node.children) {
result += generateTree(indent + 1, child);
}
} else if (node instanceof Parallel) {
result += `=${node.children.length}`;
for (let child of node.children) {
result += generateTree(indent + 1, child);
}
} else if (node instanceof Fallback) {
result += "?";
for (let child of node.children) {
result += generateTree(indent + 1, child);
}
}
return result;
}