Add color maps
This commit is contained in:
parent
a8eb444991
commit
721abd6a8f
|
@ -195,6 +195,12 @@ The "$" is populated with an object's children. $.sword.damage will properly get
|
||||||
|
|
||||||
To access the entity's owner, it is through _. For example, the human can access the orc via _.Orc.
|
To access the entity's owner, it is through _. For example, the human can access the orc via _.Orc.
|
||||||
|
|
||||||
|
## The REPL
|
||||||
|
|
||||||
|
The REPL lets you poke around in the game. The first accessible item is the Primum. Everything else must be child to it. When an object is selected, its children are accessible in a more friendly way. You can do commands as if you "are" that object.
|
||||||
|
|
||||||
|
The ur-type of the object is always shown in purple. If it has no type, there is nothing shown.
|
||||||
|
|
||||||
## Entities
|
## Entities
|
||||||
Entities are things that exist in the game world.
|
Entities are things that exist in the game world.
|
||||||
|
|
||||||
|
|
|
@ -42,11 +42,9 @@ var descriptors = {};
|
||||||
Object.deepfreeze = function(obj)
|
Object.deepfreeze = function(obj)
|
||||||
{
|
{
|
||||||
for (var key in obj) {
|
for (var key in obj) {
|
||||||
if (typeof obj[key] === 'object') {
|
if (typeof obj[key] === 'object')
|
||||||
Object.freeze(obj[key]);
|
|
||||||
Object.deepfreeze(obj[key]);
|
Object.deepfreeze(obj[key]);
|
||||||
}
|
}
|
||||||
}
|
|
||||||
Object.freeze(obj);
|
Object.freeze(obj);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -109,10 +109,6 @@ var editor = {
|
||||||
|
|
||||||
},
|
},
|
||||||
|
|
||||||
save_prototypes() {
|
|
||||||
save_gameobjects_as_prototypes();
|
|
||||||
},
|
|
||||||
|
|
||||||
/* Save the selected object as a new prototype, extending the chain */
|
/* Save the selected object as a new prototype, extending the chain */
|
||||||
save_proto_as(name) {
|
save_proto_as(name) {
|
||||||
if (name in gameobjects) {
|
if (name in gameobjects) {
|
||||||
|
@ -139,7 +135,8 @@ var editor = {
|
||||||
save_type_as(name) {
|
save_type_as(name) {
|
||||||
if (name in gameobjects) {
|
if (name in gameobjects) {
|
||||||
Log.info("Already an object with name '" + name + "'. Choose another one.");
|
Log.info("Already an object with name '" + name + "'. Choose another one.");
|
||||||
return;
|
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
var newp = this.selectlist[0].__proto__.__proto__.clone(name);
|
var newp = this.selectlist[0].__proto__.__proto__.clone(name);
|
||||||
|
@ -455,6 +452,7 @@ var editor = {
|
||||||
}
|
}
|
||||||
|
|
||||||
this.edit_level = Primum.spawn(ur.arena);
|
this.edit_level = Primum.spawn(ur.arena);
|
||||||
|
this.edit_level.toString = function() { return "desktop"; };
|
||||||
editor.edit_level.selectable = false;
|
editor.edit_level.selectable = false;
|
||||||
},
|
},
|
||||||
|
|
||||||
|
@ -484,30 +482,27 @@ var editor = {
|
||||||
Debug.point(world2screen(this.cursor), 2, Color.green);
|
Debug.point(world2screen(this.cursor), 2, Color.green);
|
||||||
|
|
||||||
if (this.comp_info && this.sel_comp) {
|
if (this.comp_info && this.sel_comp) {
|
||||||
GUI.text(Input.print_pawn_kbm(this.sel_comp), [100,700],1);
|
GUI.text(Input.print_pawn_kbm(this.sel_comp,false), [100,700],1);
|
||||||
}
|
}
|
||||||
|
|
||||||
GUI.text("0,0", world2screen([0,0]));
|
GUI.text("0,0", world2screen([0,0]));
|
||||||
|
|
||||||
var clvl = this.edit_level;
|
var clvl = this.edit_level;
|
||||||
|
var lvlcolorsample = 1;
|
||||||
var ypos = 200;
|
var ypos = 200;
|
||||||
var lvlcolor = Color.white;
|
|
||||||
while (clvl) {
|
while (clvl) {
|
||||||
var lvlstr = clvl.file ? clvl.file : "NEW ENTITY";
|
var lvlstr = clvl.toString();
|
||||||
if (clvl.unique)
|
if (clvl.dirty)
|
||||||
lvlstr += "#";
|
|
||||||
else if (clvl.dirty)
|
|
||||||
lvlstr += "*";
|
lvlstr += "*";
|
||||||
GUI.text(lvlstr, [0, ypos], 1, lvlcolor);
|
GUI.text(lvlstr, [0, ypos], 1, ColorMap.Inferno.sample(lvlcolorsample));
|
||||||
|
lvlcolorsample -= 0.1;
|
||||||
lvlcolor = Color.gray;
|
|
||||||
|
|
||||||
clvl = clvl.level;
|
clvl = clvl.level;
|
||||||
if (clvl) {
|
if (clvl) {
|
||||||
GUI.text("^^^^^^", [0,ypos+5],1);
|
GUI.text("^^^^^^", [0,ypos-15],1);
|
||||||
ypos += 5;
|
ypos -= 15;
|
||||||
}
|
}
|
||||||
ypos += 15;
|
ypos -= 5;
|
||||||
}
|
}
|
||||||
|
|
||||||
this.edit_level.objects.forEach(function(x) {
|
this.edit_level.objects.forEach(function(x) {
|
||||||
|
@ -522,11 +517,8 @@ var editor = {
|
||||||
|
|
||||||
this.selectlist.forEach(function(x) {
|
this.selectlist.forEach(function(x) {
|
||||||
var color = x.color ? x.color : Color.white;
|
var color = x.color ? x.color : Color.white;
|
||||||
var ojson = JSON.parse(JSON.stringify(x));
|
|
||||||
delete ojson.pos;
|
|
||||||
delete ojson.angle;
|
|
||||||
var sname = x.ur.toString();
|
var sname = x.ur.toString();
|
||||||
if (!ojson.empty)
|
if (!x.save_obj().empty)
|
||||||
x.dirty = true;
|
x.dirty = true;
|
||||||
else
|
else
|
||||||
x.dirty = false;
|
x.dirty = false;
|
||||||
|
@ -709,7 +701,6 @@ editor.inputs['C-a'] = function() {
|
||||||
if (!editor.selectlist.empty) { editor.unselect(); return; }
|
if (!editor.selectlist.empty) { editor.unselect(); return; }
|
||||||
editor.unselect();
|
editor.unselect();
|
||||||
editor.selectlist = editor.edit_level.objects.slice();
|
editor.selectlist = editor.edit_level.objects.slice();
|
||||||
Log.warn("C-a pressed.");
|
|
||||||
};
|
};
|
||||||
editor.inputs['C-a'].doc = "Select all objects.";
|
editor.inputs['C-a'].doc = "Select all objects.";
|
||||||
|
|
||||||
|
@ -724,7 +715,7 @@ editor.inputs['h'] = function() {
|
||||||
};
|
};
|
||||||
editor.inputs['h'].doc = "Toggle object hidden.";
|
editor.inputs['h'].doc = "Toggle object hidden.";
|
||||||
|
|
||||||
editor.inputs['C-h'] = function() { Game.objects.forEach(function(x) { x.visible = true; }); };
|
editor.inputs['C-h'] = function() { Primum.objects.forEach(function(x) { x.visible = true; }); };
|
||||||
editor.inputs['C-h'].doc = "Unhide all objects.";
|
editor.inputs['C-h'].doc = "Unhide all objects.";
|
||||||
|
|
||||||
editor.inputs['C-e'] = function() { editor.openpanel(assetexplorer); };
|
editor.inputs['C-e'] = function() { editor.openpanel(assetexplorer); };
|
||||||
|
@ -736,7 +727,6 @@ editor.inputs['C-l'].doc = "Open list of spawned entities.";
|
||||||
editor.inputs['C-i'] = function() {
|
editor.inputs['C-i'] = function() {
|
||||||
if (editor.selectlist.length !== 1) return;
|
if (editor.selectlist.length !== 1) return;
|
||||||
objectexplorer.obj = editor.selectlist[0];
|
objectexplorer.obj = editor.selectlist[0];
|
||||||
objectexplorer.on_close = editor.save_prototypes;
|
|
||||||
editor.openpanel(objectexplorer);
|
editor.openpanel(objectexplorer);
|
||||||
};
|
};
|
||||||
editor.inputs['C-i'].doc = "Open the object explorer for a selected object.";
|
editor.inputs['C-i'].doc = "Open the object explorer for a selected object.";
|
||||||
|
@ -749,14 +739,6 @@ editor.inputs['C-d'] = function() {
|
||||||
};
|
};
|
||||||
editor.inputs['C-d'].doc = "Duplicate all selected objects.";
|
editor.inputs['C-d'].doc = "Duplicate all selected objects.";
|
||||||
|
|
||||||
editor.inputs.f3 = function() {
|
|
||||||
|
|
||||||
editor.selectlist.forEach(function(x) {
|
|
||||||
Log.say(JSON.stringify(x,null,2));
|
|
||||||
// x.components.forEach(function(x) { Log.say(JSON.stringify(x,null,2)); Log.say(JSON.stringify(x.ur,null,2));});
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
editor.inputs['C-m'] = function() {
|
editor.inputs['C-m'] = function() {
|
||||||
if (editor.sel_comp) {
|
if (editor.sel_comp) {
|
||||||
if (editor.sel_comp.flipy)
|
if (editor.sel_comp.flipy)
|
||||||
|
@ -794,15 +776,13 @@ editor.inputs.f.doc = "Find the selected objects.";
|
||||||
|
|
||||||
editor.inputs['C-f'] = function() {
|
editor.inputs['C-f'] = function() {
|
||||||
if (editor.selectlist.length !== 1) return;
|
if (editor.selectlist.length !== 1) return;
|
||||||
if (!editor.selectlist[0].file) return;
|
|
||||||
editor.edit_level = editor.selectlist[0];
|
editor.edit_level = editor.selectlist[0];
|
||||||
editor.unselect();
|
editor.unselect();
|
||||||
editor.reset_undos();
|
|
||||||
editor.curlvl = editor.edit_level.save();
|
|
||||||
};
|
};
|
||||||
editor.inputs['C-f'].doc = "Tunnel into the selected level object to edit it.";
|
editor.inputs['C-f'].doc = "Tunnel into the selected level object to edit it.";
|
||||||
|
|
||||||
editor.inputs['C-S-f'] = function() {
|
editor.inputs['C-F'] = function() {
|
||||||
if (!editor.edit_level.level) return;
|
if (!editor.edit_level.level) return;
|
||||||
|
|
||||||
editor.edit_level = editor.edit_level.level;
|
editor.edit_level = editor.edit_level.level;
|
||||||
|
@ -812,7 +792,7 @@ editor.inputs['C-S-f'] = function() {
|
||||||
editor.edit_level.filejson = editor.edit_level.save();
|
editor.edit_level.filejson = editor.edit_level.save();
|
||||||
editor.edit_level.check_dirty();
|
editor.edit_level.check_dirty();
|
||||||
};
|
};
|
||||||
editor.inputs['C-S-f'].doc = "Tunnel out of the level you are editing, saving it in the process.";
|
editor.inputs['C-F'].doc = "Tunnel out of the level you are editing, saving it in the process.";
|
||||||
|
|
||||||
editor.inputs['C-r'] = function() { editor.selectlist.forEach(function(x) { x.angle = -x.angle; }); };
|
editor.inputs['C-r'] = function() { editor.selectlist.forEach(function(x) { x.angle = -x.angle; }); };
|
||||||
editor.inputs['C-r'].doc = "Negate the selected's angle.";
|
editor.inputs['C-r'].doc = "Negate the selected's angle.";
|
||||||
|
@ -896,6 +876,7 @@ editor.inputs.escape = function() { editor.openpanel(quitpanel); }
|
||||||
editor.inputs.escape.doc = "Quit editor.";
|
editor.inputs.escape.doc = "Quit editor.";
|
||||||
|
|
||||||
editor.inputs['C-s'] = function() {
|
editor.inputs['C-s'] = function() {
|
||||||
|
|
||||||
if (editor.edit_level.level) {
|
if (editor.edit_level.level) {
|
||||||
if (!editor.edit_level.unique)
|
if (!editor.edit_level.unique)
|
||||||
editor.save_current();
|
editor.save_current();
|
||||||
|
@ -911,10 +892,10 @@ editor.inputs['C-s'] = function() {
|
||||||
};
|
};
|
||||||
editor.inputs['C-s'].doc = "Save selected.";
|
editor.inputs['C-s'].doc = "Save selected.";
|
||||||
|
|
||||||
editor.inputs['C-S-s'] = function() {
|
editor.inputs['C-S'] = function() {
|
||||||
editor.openpanel(saveaspanel);
|
editor.openpanel(saveaspanel);
|
||||||
};
|
};
|
||||||
editor.inputs['C-S-s'].doc = "Save selected as.";
|
editor.inputs['C-S'].doc = "Save selected as.";
|
||||||
|
|
||||||
editor.inputs['C-z'] = function() { editor.undo(); };
|
editor.inputs['C-z'] = function() { editor.undo(); };
|
||||||
editor.inputs['C-z'].doc = "Undo the last change made.";
|
editor.inputs['C-z'].doc = "Undo the last change made.";
|
||||||
|
@ -940,14 +921,14 @@ editor.inputs['C-n'] = function() {
|
||||||
editor.inputs['C-n'].doc = "Open a new level.";
|
editor.inputs['C-n'].doc = "Open a new level.";
|
||||||
|
|
||||||
editor.inputs['C-o'] = function() {
|
editor.inputs['C-o'] = function() {
|
||||||
if (editor.edit_level.dirty()) {
|
/* if (editor.edit_level.dirty) {
|
||||||
editor.openpanel(gen_notify("Level is changed. Are you sure you want to close it?", function() {
|
editor.openpanel(gen_notify("Level is changed. Are you sure you want to close it?", function() {
|
||||||
editor.clear_level();
|
editor.clear_level();
|
||||||
editor.openpanel(openlevelpanel);
|
editor.openpanel(openlevelpanel);
|
||||||
}.bind(editor)));
|
}.bind(editor)));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
editor.openpanel(openlevelpanel);
|
editor.openpanel(openlevelpanel);
|
||||||
};
|
};
|
||||||
editor.inputs['C-o'].doc = "Open a level.";
|
editor.inputs['C-o'].doc = "Open a level.";
|
||||||
|
@ -1502,6 +1483,7 @@ var replpanel = Object.copy(inputpanel, {
|
||||||
ecode += `var ${key} = editor.selectlist[0].$['${key}'];`;
|
ecode += `var ${key} = editor.selectlist[0].$['${key}'];`;
|
||||||
|
|
||||||
ecode += this.value;
|
ecode += this.value;
|
||||||
|
Log.say(this.value);
|
||||||
this.value = "";
|
this.value = "";
|
||||||
var ret = eval(ecode);
|
var ret = eval(ecode);
|
||||||
if (ret) Log.say(ret);
|
if (ret) Log.say(ret);
|
||||||
|
|
|
@ -83,6 +83,84 @@ Color.Apple = {
|
||||||
|
|
||||||
Object.deepfreeze(Color);
|
Object.deepfreeze(Color);
|
||||||
|
|
||||||
|
var ColorMap = {};
|
||||||
|
ColorMap.makemap = function(map)
|
||||||
|
{
|
||||||
|
var newmap = Object.create(ColorMap);
|
||||||
|
Object.assign(newmap, map);
|
||||||
|
return newmap;
|
||||||
|
}
|
||||||
|
ColorMap.Jet = ColorMap.makemap({
|
||||||
|
0: [0,0,131],
|
||||||
|
0.125: [0,60,170],
|
||||||
|
0.375: [5,255,255],
|
||||||
|
0.625: [255,255,0],
|
||||||
|
0.875: [250,0,0],
|
||||||
|
1: [128,0,0]
|
||||||
|
});
|
||||||
|
|
||||||
|
ColorMap.BlueRed = ColorMap.makemap({
|
||||||
|
0: [0,0,255],
|
||||||
|
1: [255,0,0]
|
||||||
|
});
|
||||||
|
|
||||||
|
ColorMap.Inferno = ColorMap.makemap({
|
||||||
|
0:[0,0,4],
|
||||||
|
0.13: [31,12,72],
|
||||||
|
0.25: [85,15,109],
|
||||||
|
0.38: [136,34,106],
|
||||||
|
0.5: [186,54,85],
|
||||||
|
0.63: [227,89,51],
|
||||||
|
0.75: [249,140,10],
|
||||||
|
0.88: [249,201,50],
|
||||||
|
1: [252,255,164]
|
||||||
|
});
|
||||||
|
|
||||||
|
ColorMap.Bathymetry = ColorMap.makemap({
|
||||||
|
0: [40,26,44],
|
||||||
|
0.13: [59.49,90],
|
||||||
|
0.25: [64,76,139],
|
||||||
|
0.38: [63,110,151],
|
||||||
|
0.5: [72,142,158],
|
||||||
|
0.63: [85,174,163],
|
||||||
|
0.75: [120,206,163],
|
||||||
|
0.88: [187,230,172],
|
||||||
|
1: [253,254,204]
|
||||||
|
});
|
||||||
|
|
||||||
|
ColorMap.Viridis = ColorMap.makemap({
|
||||||
|
0: [68,1,84],
|
||||||
|
0.13: [71,44,122],
|
||||||
|
0.25: [59,81,139],
|
||||||
|
0.38: [44,113,142],
|
||||||
|
0.5: [33,144,141],
|
||||||
|
0.63: [39,173,129],
|
||||||
|
0.75: [92,200,99],
|
||||||
|
0.88: [170,220,50],
|
||||||
|
1: [253,231,37]
|
||||||
|
});
|
||||||
|
|
||||||
|
ColorMap.sample = function(t, map)
|
||||||
|
{
|
||||||
|
map ??= this;
|
||||||
|
if (t < 0) return map[0];
|
||||||
|
if (t > 1) return map[1];
|
||||||
|
|
||||||
|
var lastkey = 0;
|
||||||
|
for (var key of Object.keys(map).sort()) {
|
||||||
|
if (t < key) {
|
||||||
|
var b = map[key];
|
||||||
|
var a = map[lastkey];
|
||||||
|
var tt = (key - lastkey) * t;
|
||||||
|
return a.lerp(b, tt);
|
||||||
|
}
|
||||||
|
lastkey = key;
|
||||||
|
}
|
||||||
|
return map[1];
|
||||||
|
}
|
||||||
|
|
||||||
|
Object.freeze(ColorMap);
|
||||||
|
|
||||||
function bb2wh(bb) {
|
function bb2wh(bb) {
|
||||||
return [bb.r-bb.l, bb.t-bb.b];
|
return [bb.r-bb.l, bb.t-bb.b];
|
||||||
};
|
};
|
||||||
|
@ -623,6 +701,7 @@ var preprimum = {};
|
||||||
preprimum.add_child = function() {};
|
preprimum.add_child = function() {};
|
||||||
var World = gameobject.make(gameobject.ur, preprimum);
|
var World = gameobject.make(gameobject.ur, preprimum);
|
||||||
var Primum = World;
|
var Primum = World;
|
||||||
|
Primum.toString = function() { return "Primum"; };
|
||||||
Primum.selectable = false;
|
Primum.selectable = false;
|
||||||
World.reparent = function(parent) { Log.warn("Cannot reparent the Primum."); }
|
World.reparent = function(parent) { Log.warn("Cannot reparent the Primum."); }
|
||||||
World.unparent = function() { Log.warn("The Primum has no parent, always."); }
|
World.unparent = function() { Log.warn("The Primum has no parent, always."); }
|
||||||
|
|
|
@ -13,6 +13,7 @@ function grab_from_points(pos, points, slop) {
|
||||||
var gameobject = {
|
var gameobject = {
|
||||||
save: true,
|
save: true,
|
||||||
selectable: true,
|
selectable: true,
|
||||||
|
ed_locked: false,
|
||||||
|
|
||||||
layer_nuke() {
|
layer_nuke() {
|
||||||
Nuke.label("Collision layer");
|
Nuke.label("Collision layer");
|
||||||
|
@ -29,8 +30,6 @@ var gameobject = {
|
||||||
this.draw_layer = Nuke.radio(i, this.draw_layer, i);
|
this.draw_layer = Nuke.radio(i, this.draw_layer, i);
|
||||||
},
|
},
|
||||||
|
|
||||||
ed_locked: false,
|
|
||||||
|
|
||||||
_visible: true,
|
_visible: true,
|
||||||
get visible(){ return this._visible; },
|
get visible(){ return this._visible; },
|
||||||
set visible(x) {
|
set visible(x) {
|
||||||
|
@ -40,6 +39,8 @@ var gameobject = {
|
||||||
this.components[key].visible = x;
|
this.components[key].visible = x;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
for (var key in this.$)
|
||||||
|
this.$[key].visible = x;
|
||||||
},
|
},
|
||||||
|
|
||||||
phys_nuke() {
|
phys_nuke() {
|
||||||
|
@ -93,11 +94,20 @@ var gameobject = {
|
||||||
return bb.t-bb.b;
|
return bb.t-bb.b;
|
||||||
},
|
},
|
||||||
|
|
||||||
stop() {},
|
save_obj() {
|
||||||
|
var json = JSON.stringify(this);
|
||||||
|
if (!json) return {};
|
||||||
|
var o = JSON.parse(json);
|
||||||
|
delete o.pos;
|
||||||
|
delete o.angle;
|
||||||
|
return o;
|
||||||
|
},
|
||||||
|
|
||||||
/* Make a unique object the same as its prototype */
|
/* Make a unique object the same as its prototype */
|
||||||
revert() {
|
revert() {
|
||||||
// unmerge(this, this.prop_obj());
|
var save = this.save_obj();
|
||||||
|
for (var key in save)
|
||||||
|
this[key] = this.ur[key];
|
||||||
},
|
},
|
||||||
|
|
||||||
gui() {
|
gui() {
|
||||||
|
@ -225,7 +235,6 @@ var gameobject = {
|
||||||
disable() { this.components.forEach(function(x) { x.disable(); });},
|
disable() { this.components.forEach(function(x) { x.disable(); });},
|
||||||
enable() { this.components.forEach(function(x) { x.enable(); });},
|
enable() { this.components.forEach(function(x) { x.enable(); });},
|
||||||
sync() { },
|
sync() { },
|
||||||
dirty() { return false; },
|
|
||||||
|
|
||||||
spawn(ur) {
|
spawn(ur) {
|
||||||
if (typeof ur === 'string')
|
if (typeof ur === 'string')
|
||||||
|
@ -330,7 +339,6 @@ var gameobject = {
|
||||||
if ('ur' in p) {
|
if ('ur' in p) {
|
||||||
obj[prop] = obj.spawn(prototypes.get_ur(p.ur));
|
obj[prop] = obj.spawn(prototypes.get_ur(p.ur));
|
||||||
obj.$[prop] = obj[prop];
|
obj.$[prop] = obj[prop];
|
||||||
// Object.assign(obj[prop], p);
|
|
||||||
} else if ('make' in p) {
|
} else if ('make' in p) {
|
||||||
obj[prop] = p.make(obj.body);
|
obj[prop] = p.make(obj.body);
|
||||||
obj.components[prop] = obj[prop];
|
obj.components[prop] = obj[prop];
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
var GUI = {
|
var GUI = {
|
||||||
text(str, pos, size, color, wrap) {
|
text(str, pos, size, color, wrap) {
|
||||||
size = size ? size : 1;
|
size = size ? size : 1;
|
||||||
|
|
||||||
color = color ? color : [255,255,255,255];
|
color = color ? color : [255,255,255,255];
|
||||||
wrap = wrap ? wrap : -1;
|
wrap = wrap ? wrap : -1;
|
||||||
|
|
||||||
|
|
|
@ -65,6 +65,7 @@ Input.print_pawn_kbm = function(pawn) {
|
||||||
if (!('inputs' in pawn)) return;
|
if (!('inputs' in pawn)) return;
|
||||||
var str = "";
|
var str = "";
|
||||||
for (var key in pawn.inputs) {
|
for (var key in pawn.inputs) {
|
||||||
|
if (!pawn.inputs[key].doc) continue;
|
||||||
str += `${key} | ${pawn.inputs[key].doc}\n`;
|
str += `${key} | ${pawn.inputs[key].doc}\n`;
|
||||||
}
|
}
|
||||||
return str;
|
return str;
|
||||||
|
|
Loading…
Reference in a new issue