From 6ad4fd3ee8f8693503e67b1480046e6941af6c6f Mon Sep 17 00:00:00 2001 From: John Alanbrook Date: Thu, 24 Aug 2023 21:22:52 +0000 Subject: [PATCH] Editor and debug controls more uniform, with docstrings [8d85349744c4d40a] --- source/engine/debug/debugdraw.c | 5 +- source/engine/yugine.c | 6 +- source/scripts/components.js | 9 +- source/scripts/debug.js | 89 ++--- source/scripts/diff.js | 5 +- source/scripts/editor.js | 660 +++++++++++++++----------------- source/scripts/engine.js | 38 +- 7 files changed, 395 insertions(+), 417 deletions(-) diff --git a/source/engine/debug/debugdraw.c b/source/engine/debug/debugdraw.c index 46062c2..cdddcce 100644 --- a/source/engine/debug/debugdraw.c +++ b/source/engine/debug/debugdraw.c @@ -107,7 +107,6 @@ void debug_flush(HMM_Mat4 *view) .ptr = point_b, .size = sizeof(struct point_vertex)*point_c}); sg_draw(point_sc,point_c,1); - YughWarn("DREW %d POINTS", point_c); } if (line_c != 0) { @@ -573,11 +572,9 @@ void draw_arrow(struct cpVect start, struct cpVect end, struct rgba color, int c void draw_grid(int width, int span, struct rgba color) { cpVect offset = cam_pos(); - offset = cpvmult(offset, 1/cam_zoom()); offset.x -= mainwin->width/2; offset.y -= mainwin->height/2; -// offset.x += span/2; - offset.y += span/2; + offset = cpvmult(offset, 1/cam_zoom()); sg_apply_pipeline(grid_pipe); sg_apply_bindings(&grid_bind); diff --git a/source/engine/yugine.c b/source/engine/yugine.c index ec737ee..6b7d570 100644 --- a/source/engine/yugine.c +++ b/source/engine/yugine.c @@ -233,10 +233,10 @@ int main(int argc, char **args) { //double wait = fmax(0, renderMS - elapsed); nuke_input_begin(); - if (sim_playing()) +// if (sim_playing()) input_poll(fmax(0, renderMS-elapsed)); - else - input_poll(1000); +// else +// input_poll(1000); window_all_handle_events(); nuke_input_end(); diff --git a/source/scripts/components.js b/source/scripts/components.js index d6b59cd..c8ef3b9 100644 --- a/source/scripts/components.js +++ b/source/scripts/components.js @@ -30,6 +30,7 @@ var sprite = clone(component, { pos: [0,0], get visible() { return this.enabled; }, set visible(x) { this.enabled = x; }, + set asset(str) { this.path = str; Log.warn(`SET ${str} ON THE SPRITE`); this.sync();}, angle: 0, rect: {s0:0, s1: 1, t0: 0, t1: 1}, @@ -68,7 +69,9 @@ var sprite = clone(component, { sprite.obscure('boundingbox'); return sprite; }, - + + input_kp9_pressed() { this.pos = [0,0]; }, + input_kp8_pressed() { this.pos = [-0.5, 0]; }, input_kp7_pressed() { this.pos = [-1,0]; }, input_kp6_pressed() { this.pos = [0,-0.5]; }, input_kp5_pressed() { this.pos = [-0.5,-0.5]; }, @@ -247,9 +250,7 @@ var collider2d = clone(component, { set sensor(x) { cmd(18,this.shape,x); }, get sensor() { return cmd(21,this.shape); }, set enabled(x) { cmd(22,this.shape,x); }, - get enabled() { - Log.warn("getting enabled"); - return cmd(23,this.shape); } + get enabled() { return cmd(23,this.shape); } }, }); diff --git a/source/scripts/debug.js b/source/scripts/debug.js index d0d1526..34bdf8b 100644 --- a/source/scripts/debug.js +++ b/source/scripts/debug.js @@ -98,12 +98,12 @@ var Debug = { Game.objects.forEach(function(x) { GUI.text(x.fullpath(), world2screen(x.pos).add([0,32]), 1, [84,110,255]); }); -/* - gui_text(sim_playing() ? "PLAYING" - : sim_paused() ? + + gui_text(Game.playing() ? "PLAYING" + : Game.paused() ? "PAUSED" : "STOPPED", [0, 0], 1); -*/ + }, }; @@ -222,54 +222,41 @@ var Nuke = { Object.defineProperty(Nuke, "curwin", {enumerable:false}); Object.defineProperty(Nuke, "defaultrect", {enumerable:false}); -var DebugControls = { - input_f1_pressed() { - Debug.draw_phys(!Debug.phys_drawing); - }, - - input_f3_pressed() { - Debug.draw_bb = !Debug.draw_bb; - }, - - input_f5_pressed() { - if (Game.paused()) - Game.play(); - else - Game.pause(); - }, - - input_f6_pressed() { - if (Game.paused()) - Game.step(); - }, - - /* Toggle physics */ - input_f7_pressed() { - - }, - - input_1_pressed() { - if (!Keys.alt()) return; - Render.normal(); - }, - - input_2_pressed() { - if (!Keys.alt()) return; - Render.wireframe(); - }, - - input_f10_pressed() { Time.timescale = 0.1; }, - input_f10_released() { Time.timescale = 1.0; }, - input_f12_pressed() { - GUI.defaults.debug = !GUI.defaults.debug; - }, - - - input_f4_pressed() { - Debug.draw_names = !Debug.draw_names; - Debug.draw_gizmos = !Debug.draw_gizmos; - }, +var DebugControls = {}; +DebugControls.inputs = {}; +DebugControls.inputs.f1 = function () { Debug.draw_phys(!Debug.phys_drawing); }; +DebugControls.inputs.f1.doc = "Draw physics debugging aids."; +DebugControls.inputs.f3 = function() { Debug.draw_bb = !Debug.draw_bb; }; +DebugControls.inputs.f3.doc = "Toggle drawing bounding boxes."; +DebugControls.inputs.f4 = function() { + Debug.draw_names = !Debug.draw_names; + Debug.draw_gizmos = !Debug.draw_gizmos; }; +DebugControls.inputs.f4.doc = "Toggle drawing gizmos and names of objects."; +DebugControls.inputs.f10 = function() { Time.timescale = 0.1; }; +DebugControls.inputs.f10.doc = "Toggle timescale to 1/10."; +DebugControls.inputs.f10.released = function () { Time.timescale = 1.0; Log.warn("SET TIMESCALE");}; +DebugControls.inputs.f12 = function() { GUI.defaults.debug = !GUI.defaults.debug; Log.warn("GUI toggle debug");}; +DebugControls.inputs.f12.doc = "Toggle drawing GUI debugging aids."; + +DebugControls.inputs.f5 = function() { + if (Game.paused()) + Game.play(); + else + Game.pause(); +}; +DebugControls.inputs.f5.doc = "Pause or play game simulation." + +DebugControls.inputs.f6 = function() { + if (Game.paused()) + Game.step(); +}; +DebugControls.inputs.f6.doc = "Do one step through game while paused."; + +DebugControls.inputs['M-1'] = Render.normal; +Render.normal.doc = "Render mode for enabling all shaders and lighting effects."; +DebugControls.inputs['M-2'] = Render.wireframe; +Render.wireframe.doc = "Render mode to see wireframes of all models."; var Time = { set timescale(x) { cmd(3, x); }, diff --git a/source/scripts/diff.js b/source/scripts/diff.js index 4f67bc8..cbfe867 100644 --- a/source/scripts/diff.js +++ b/source/scripts/diff.js @@ -55,11 +55,14 @@ function complete_assign(target, source) { function dainty_assign(target, source) { for (var key in source) { + if (typeof source[key] === 'function') { target[key] = source[key]; continue; } - if (!(key in target)) continue; + if (!Object.hasOwn(target, key)) continue; + if (!Object.getOwnPropertyDescriptor(target, key).writable) continue; + if (Array.isArray(target[key])) target[key] = source[key]; else if (typeof target[key] === 'object') diff --git a/source/scripts/editor.js b/source/scripts/editor.js index 59fc47a..6c5c137 100644 --- a/source/scripts/editor.js +++ b/source/scripts/editor.js @@ -17,6 +17,7 @@ Yugine.view_camera(editor_camera); var editor_config = { grid_size: 100, + grid_color: [99, 255, 128, 100], }; var configs = { @@ -34,7 +35,6 @@ var editor = { moveoffset: [0,0], startrot: 0, rotoffset: 0, - obj_panel: false, camera: editor_camera, edit_level: {}, /* The current level that is being edited */ working_layer: -1, @@ -84,23 +84,6 @@ var editor = { } }, - input_i_pressed() { - if (!Keys.ctrl()) return; - - this.openpanel(levellistpanel, true); - }, - - input_y_pressed() { - if (Keys.ctrl()) { - if (this.selectlist.length !== 1) return; - objectexplorer.obj = this.selectlist[0]; - objectexplorer.on_close = this.save_prototypes; - this.openpanel(objectexplorer); - } else if (Keys.alt()) { - this.openpanel(protoexplorer); - } - }, - try_select() { /* nullify true if it should set selected to null if it doesn't find an object */ var go = physics.pos_query(screen2world(Mouse.pos)); return this.do_select(go); @@ -127,51 +110,6 @@ var editor = { curpanel: null, - input_o_pressed() { - if (this.sel_comp) return; - - if (Keys.ctrl() && Keys.alt()) { - if (this.selectlist.length === 1 && this.selectlist[0].file) { - if (this.edit_level.dirty) return; - this.load(this.selectlist[0].file); - } - - return; - } - - if (Keys.ctrl() && Keys.shift()) { - if (!this.edit_level.dirty) - this.load_prev(); - - return; - } - - if (Keys.ctrl()) { - if (this.check_level_nested()) { - Log.warn("Nested level ..."); - return; - } - - if (this.edit_level.dirty) { - this.openpanel(gen_notify("Level is changed. Are you sure you want to close it?", function() { - this.clear_level(); - this.openpanel(openlevelpanel); - }.bind(this))); - return; - } - - this.openpanel(openlevelpanel); - return; - } - - if (Keys.alt()) { - this.openpanel(addlevelpanel); - return; - } - - this.obj_panel = !this.obj_panel; - }, - check_level_nested() { if (this.edit_level.level) { this.openpanel(gen_notify("Can't close a nested level. Save up to the root before continuing.")); @@ -184,27 +122,6 @@ var editor = { levellist: false, programmode: false, - input_l_pressed() { - if (this.sel_comp) return; - if (Keys.ctrl()) { - texteditor.on_close = function() { editor.edit_level.script = texteditor.value;}; - texteditor.input_s_pressed = function() { - if (!Keys.ctrl()) return; - editor.edit_level.script = texteditor.value; - editor.save_current(); - texteditor.startbuffer = texteditor.value.slice(); - }; - - this.openpanel(texteditor); - if (!this.edit_level.script) - this.edit_level.script = ""; - texteditor.value = this.edit_level.script; - texteditor.start(); - } else if (Keys.alt()) { - this.programmode = !this.programmode; - } - }, - delete_empty_reviver(key, val) { if (typeof val === 'object' && val.empty) return undefined; @@ -212,46 +129,6 @@ var editor = { return val; }, - - input_minus_pressed() { - if (this.sel_comp) return; - - if (!this.selectlist.empty) { - this.selectlist.forEach(function(x) { x.draw_layer--; }); - return; - } - - if (this.working_layer > -1) - this.working_layer--; - }, - - input_plus_pressed() { - if (this.sel_comp) return; - - if (!this.selectlist.empty) { - this.selectlist.forEach(x => x.draw_layer++); - return; - } - - if (this.working_layer < 4) - this.working_layer++; - }, - - input_p_pressed() { - if (Keys.ctrl()) { - if (Keys.shift()) { - /* Save prototype as */ - if (this.selectlist.length !== 1) return; - this.openpanel(saveprototypeas); - return; - } - else { - this.save_proto(); - } - } else if (Keys.alt()) - this.openpanel(prefabpanel); - }, - save_proto() { if (this.selectlist.length !== 1) return; Log.warn(`Saving prototype ${this.selectlist[0].toString()}`); @@ -334,11 +211,6 @@ var editor = { this.save_proto(); }, - /* Makes it so only these objects are editable */ - focus_objects(objs) { - - }, - dup_objects(x) { var objs = x.slice(); var duped = []; @@ -363,13 +235,6 @@ var editor = { return duped.flat(); }, - input_d_pressed() { - if (!Keys.ctrl() || this.selectlist.length === 0) return; - var duped = this.dup_objects(this.selectlist); - this.unselect(); - this.selectlist = duped; - }, - sel_start: [], input_lmouse_pressed() { @@ -560,19 +425,6 @@ var editor = { sel_comp: null, - input_m_pressed() { - if (this.sel_comp) return; - if (Keys.ctrl()) { - this.selectlist.forEach(function(x) { - x.flipy = !x.flipy; - }); - } else - this.selectlist.forEach(function(x) { - x.flipx = !x.flipx; - }); - - }, - input_u_pressed() { if (Keys.ctrl()) { this.selectlist.forEach(function(x) { @@ -589,10 +441,6 @@ var editor = { comp_info: false, - input_q_pressed() { - this.comp_info = !this.comp_info; - }, - brush_obj: null, input_b_pressed() { @@ -654,36 +502,6 @@ var editor = { this.camera.zoom = zoom*1.3; }, - input_f_pressed() { - if (!Keys.ctrl()) { - if (this.selectlist.length === 0) return; - var bb = this.selectlist[0].boundingbox; - this.selectlist.forEach(function(obj) { bb = bb_expand(bb, obj.boundingbox); }); - this.zoom_to_bb(bb); - - return; - } - - if (Keys.shift()) { - if (!this.edit_level.level) return; - - this.edit_level = this.edit_level.level; - this.unselect(); - this.reset_undos(); - this.curlvl = this.edit_level.save(); - this.edit_level.filejson = this.edit_level.save(); - this.edit_level.check_dirty(); - } else { - if (this.selectlist.length === 1) { - if (!this.selectlist[0].file) return; - this.edit_level = this.selectlist[0]; - this.unselect(); - this.reset_undos(); - this.curlvl = this.edit_level.save(); - } - } - }, - input_rmouse_down() { if (Keys.ctrl() && Keys.alt()) this.camera.zoom = this.z_start * (1 + (Mouse.pos[1] - this.mousejoy[1])/500); @@ -809,35 +627,6 @@ var editor = { Register.unregister_obj(this); }, - input_f5_pressed() { - /* Start debug.lvl */ - if (!sim_playing()) { - this.start_play_ed(); - Level.loadlevel("debug_start.lvl"); - } - }, - - input_f6_pressed() { - /* Start game.lvl */ - if (!sim_playing()) { - this.start_play_ed(); -// Level.loadlevel( - /* Load level of what was being edited */ - } - }, - - input_f7_pressed() { - /* Start current level */ - if (!sim_playing()) { - this.start_play_ed(); - Level.loadlevel("game.lvl"); - } - }, - - input_escape_pressed() { - this.openpanel(quitpanel); - }, - moveoffsets: [], input_g_pressed() { @@ -915,45 +704,6 @@ var editor = { this.curpanels = this.curpanels.filter(function(x) { return x.on; }); }, - input_s_pressed() { - if (Keys.ctrl()) { - if (Keys.shift()) { - this.openpanel(saveaspanel); - return; - } - - if (this.edit_level.level) { - if (!this.edit_level.unique) - this.save_current(); - - this.selectlist = []; - this.selectlist.push(this.edit_level); - this.edit_level = this.edit_level.level; - - return; - } - - this.save_current(); - return; - } - - var offf = this.cursor ? this.cursor : this.selected_com; - this.scaleoffset = Vector.length(Mouse.worldpos.sub(offf)); - - if (this.sel_comp) { - if (!('scale' in this.sel_comp)) return; - this.startscales = []; - this.startscales.push(this.sel_comp.scale); - return; - } - - this.selectlist.forEach(function(x, i) { - this.startscales[i] = x.scale; - if (this.cursor) - this.startoffs[i] = x.pos.sub(this.cursor); - }, this); - }, - input_s_down() { if (!this.scaleoffset) return; var offf = this.cursor ? this.cursor : this.selected_com; @@ -981,35 +731,6 @@ var editor = { startpos: [], startoffs: [], - input_r_pressed() { - this.startrots = []; - - if (Keys.ctrl()) { - this.selectlist.forEach(function(x) { - x.angle = -x.angle; - }); - return; - } - - if (this.sel_comp && 'angle' in this.sel_comp) { - var relpos = screen2world(Mouse.pos).sub(this.sel_comp.gameobject.pos); - this.startoffset = Math.atan2(relpos.y, relpos.x); - this.startrot = this.sel_comp.angle; - - return; - } - - var offf = this.cursor ? this.cursor : this.selected_com; - var relpos = screen2world(Mouse.pos).sub(offf); - this.startoffset = Math.atan2(relpos[1], relpos[0]); - - this.selectlist.forEach(function(x, i) { - this.startrots[i] = x.angle; - this.startpos[i] = x.pos; - this.startoffs[i] = x.pos.sub(offf); - }, this); - }, - input_r_down() { if (this.sel_comp && 'angle' in this.sel_comp) { if (!('angle' in this.sel_comp)) return; @@ -1141,15 +862,6 @@ var editor = { this.restore_level(this.filesnap); }, - input_z_pressed() { - if (Keys.ctrl()) { - if (Keys.shift()) - this.redo(); - else - this.undo(); - } - }, - save_current() { if (!this.edit_level.file) { this.openpanel(saveaspanel); @@ -1172,21 +884,6 @@ var editor = { Level.sync_file(this.edit_level.file); }, - input_t_pressed() { - if (Keys.ctrl()) { - if (Keys.shift()) { - if (this.selectlist.length !== 1) return; - this.openpanel(savetypeas); - return; - } - } - - this.selectlist.forEach(function(x) { x.selectable = false; }); - - if (Keys.alt()) - this.edit_level.objects.forEach(function(x) { x.selectable = true; }); - }, - clear_level() { Log.info("Closed level."); @@ -1200,18 +897,6 @@ var editor = { this.edit_level = Level.create(); }, - input_n_pressed() { - if (!Keys.ctrl()) return; - - if (this.edit_level.dirty) { - Log.info("Level has changed; save before starting a new one."); - this.openpanel(gen_notify("Level is changed. Are you sure you want to close it?", _ => this.clear_level())); - return; - } - - this.clear_level(); - }, - _sel_comp: null, get sel_comp() { return this._sel_comp; }, set sel_comp(x) { @@ -1345,7 +1030,7 @@ var editor = { gui_img("icons/icons8-lock-16.png", world2screen(obj.pos)); }); - Debug.draw_grid(1, editor_config.grid_size/editor_camera.zoom); + Debug.draw_grid(1, editor_config.grid_size/editor_camera.zoom, editor_config.grid_color); var startgrid = screen2world([-20,Window.height]).map(function(x) { return Math.snap(x, editor_config.grid_size); }, this); var endgrid = screen2world([Window.width, 0]); @@ -1468,13 +1153,6 @@ var editor = { this.paste(); }, - input_e_pressed() { - if (Keys.ctrl()) { - this.openpanel(assetexplorer); - return; - } - }, - lvl_history: [], load(file) { @@ -1549,36 +1227,314 @@ var editor = { this.save_current(); }, - input_h_pressed() { - if (this.sel_comp) return; - if (Keys.ctrl()) { - Game.objects.forEach(function(x) { x.visible = true; }); - } else { - var visible = true; - this.selectlist.forEach(function(x) { if (x.visible) visible = false; }); - this.selectlist.forEach(function(x) { x.visible = visible; }); - } - }, - - input_a_pressed() { - if (Keys.alt()) { - this.openpanel(prefabpanel); - return; - } - if (!Keys.ctrl()) return; - if (!this.selectlist.empty) { - this.unselect(); - return; - } - this.unselect(); - - this.selectlist = this.edit_level.objects.slice(); - }, - repl: false, - input_backtick_pressed() { this.repl = !this.repl; }, } +editor.inputs = {}; +editor.inputs['M-a'] = function () { editor.openpanel(prefabpanel); }; +editor.inputs['M-a'].doc = "Open prefab panel."; +editor.inputs['C-a'] = function() { + if (!editor.selectlist.empty) { editor.unselect(); return; } + editor.unselect(); + editor.selectlist = editor.edit_level.objects.slice(); + Log.warn("C-a pressed."); +}; +editor.inputs['C-a'].doc = "Select all objects."; + +editor.inputs['backtick'] = function() { editor.repl = !editor.repl; }; +editor.inputs['backtick'].doc = "Open or close the repl."; + +/* Return if selected component. */ +editor.inputs['h'] = function() { + var visible = true; + editor.selectlist.forEach(function(x) { if (x.visible) visible = false; }); + editor.selectlist.forEach(function(x) { x.visible = visible; }); +}; +editor.inputs['h'].doc = "Toggle object hidden."; + +editor.inputs['C-h'] = function() { Game.objects.forEach(function(x) { x.visible = true; }); }; +editor.inputs['C-h'].doc = "Unhide all objects."; + +editor.inputs['C-e'] = function() { editor.openpanel(assetexplorer); }; +editor.inputs['C-e'].doc = "Open asset explorer."; + +editor.inputs['C-i'] = function() { editor.openpanel(levellistpanel, true); }; +editor.inputs['C-i'].doc = "Open level list."; + +editor.inputs['C-y'] = function() { + if (editor.selectlist.length !== 1) return; + objectexplorer.obj = editor.selectlist[0]; + objectexplorer.on_close = editor.save_prototypes; + editor.openpanel(objectexplorer); +}; +editor.inputs['C-y'].doc = "Open the object explorer for a selected object."; + +editor.inputs['M-y'] = function() { editor.openpanel(protoexplorer); }; +editor.inputs['M-y'].doc = "Open the prototype explorer."; + +editor.inputs['C-S-p'] = function() { + if (editor.selectlist.length !== 1) return; + editor.openpanel(saveprototypeas); +}; +editor.inputs['C-S-p'].doc = "Save prototype as. Ie, to a new prototype."; + +editor.inputs['C-p'] = function() { editor.save_proto(); }; +editor.inputs['C-p'].doc = "Save the selected prototype to disk."; + +editor.inputs['M-p'] = function() { editor.openpanel(prefabpanel); }; +editor.inputs['M-p'].doc = "Open the prefab panel."; + +editor.inputs['C-d'] = function() { + if (editor.selectlist.length === 0) return; + var duped = editor.dup_objects(editor.selectlist); + editor.unselect(); + editor.selectlist = duped; +}; +editor.inputs['C-d'].doc = "Duplicate all selected objects."; + +editor.inputs['C-m'] = function() { + editor.selectlist.forEach(function(x) { x.flipy = !x.flipy; }); +}; +editor.inputs['C-m'].doc = "Mirror selected objects on the Y axis."; + +editor.inputs.m = function() { editor.selectlist.forEach(function(x) { x.flipx = !x.flipx; }); }; +editor.inputs.m.doc = "Mirror selected objects on the X axis."; + +editor.inputs.q = function() { editor.comp_info = !editor.comp_info; }; +editor.inputs.q.doc = "Toggle help for the selected component."; + +editor.inputs.f = function() { + if (editor.selectlist.length === 0) return; + var bb = editor.selectlist[0].boundingbox; + editor.selectlist.forEach(function(obj) { bb = bb_expand(bb, obj.boundingbox); }); + editor.zoom_to_bb(bb); +}; +editor.inputs.f.doc = "Find the selected objects."; + +editor.inputs['C-f'] = function() { + if (editor.selectlist.length !== 1) return; + if (!editor.selectlist[0].file) return; + editor.edit_level = editor.selectlist[0]; + 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-S-f'] = function() { + if (!editor.edit_level.level) return; + + editor.edit_level = editor.edit_level.level; + editor.unselect(); + editor.reset_undos(); + editor.curlvl = editor.edit_level.save(); + editor.edit_level.filejson = editor.edit_level.save(); + 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-r'] = function() { editor.selectlist.forEach(function(x) { x.angle = -x.angle; }); }; +editor.inputs['C-r'].doc = "Negate the selected's angle."; + +editor.inputs.r = function() { + editor.startrots = []; + + if (editor.sel_comp && 'angle' in editor.sel_comp) { + var relpos = screen2world(Mouse.pos).sub(editor.sel_comp.gameobject.pos); + editor.startoffset = Math.atan2(relpos.y, relpos.x); + editor.startrot = editor.sel_comp.angle; + + return; + } + + var offf = editor.cursor ? editor.cursor : editor.selected_com; + var relpos = screen2world(Mouse.pos).sub(offf); + editor.startoffset = Math.atan2(relpos[1], relpos[0]); + + editor.selectlist.forEach(function(x, i) { + editor.startrots[i] = x.angle; + editor.startpos[i] = x.pos; + editor.startoffs[i] = x.pos.sub(offf); + }, editor); +}; +editor.inputs.r.doc = "Rotate selected using the mouse while held down."; + +editor.inputs.f5 = function() { + if (!Game.playing()) { + editor.start_play_ed(); + Level.loadlevel("debug_start.lvl"); + } +}; +editor.inputs.f5.doc = "Start level 'debug_start.lvl'."; + +editor.inputs.f6 = function() { + if (Game.playing()) return; + +// Level.loadlevel +}; +editor.inputs.f6.doc = "Load game from currently edited level."; + +editor.inputs.f7 = function() { + if (Game.playing()) return; + Level.loadlevel("game.lvl"); +}; +editor.inputs.f7.doc = "Start game from the beginning."; + +editor.inputs.escape = function() { editor.openpanel(quitpanel); } +editor.inputs.escape.doc = "Quit editor."; + +editor.inputs.f12 = function() { Log.warn("Editor F12 pressed."); }; + +editor.inputs['C-s'] = function() { + if (editor.edit_level.level) { + if (!editor.edit_level.unique) + editor.save_current(); + + editor.selectlist = []; + editor.selectlist.push(editor.edit_level); + editor.edit_level = editor.edit_level.level; + + return; + } + + editor.save_current(); +}; +editor.inputs['C-s'].doc = "Save selected."; + +editor.inputs['C-S-s'] = function() { + editor.openpanel(saveaspanel); +}; +editor.inputs['C-S-s'].doc = "Save selected as."; + +editor.inputs['C-z'] = function() { editor.undo(); }; +editor.inputs['C-z'].doc = "Undo the last change made."; + +editor.inputs['C-S-z'] = function() { editor.redo(); }; +editor.inputs['C-S-z'].doc = "Redo the last undo."; + +editor.inputs['C-S-t'] = function() { + if (editor.selectlist.length !== 1) return; + editor.openpanel(savetypeas); +}; +editor.inputs['C-S-t'].doc = "Save type as."; + +editor.inputs.t = function() { editor.selectlist.forEach(function(x) { x.selectable = false; }); }; +editor.inputs.t.doc = "Lock selected objects to make them non selectable."; + +editor.inputs['M-t'] = function() { editor.edit_level.objects.forEach(function(x) { x.selectable = true; }); }; +editor.inputs['M-t'].doc = "Unlock all objects in current level."; + +editor.inputs['C-n'] = function() { + if (editor.edit_level.dirty) { + Log.info("Level has changed; save before starting a new one."); + editor.openpanel(gen_notify("Level is changed. Are you sure you want to close it?", _ => editor.clear_level())); + return; + } + + editor.clear_level(); +}; +editor.inputs['C-n'].doc = "Open a new level."; + +editor.inputs['C-o'] = function() { + if (editor.check_level_nested()) { + Log.warn("Nested level ..."); + return; + } + + if (editor.edit_level.dirty) { + editor.openpanel(gen_notify("Level is changed. Are you sure you want to close it?", function() { + editor.clear_level(); + editor.openpanel(openlevelpanel); + }.bind(editor))); + return; + } + + editor.openpanel(openlevelpanel); +}; +editor.inputs['C-o'].doc = "Open a level."; + +editor.inputs['M-o'] = function() { + editor.openpanel(addlevelpanel); +}; +editor.inputs['M-o'].doc = "Select a level to add to the current level."; + +editor.inputs['C-M-o'] = function() { + if (editor.selectlist.length === 1 && editor.selectlist[0].file) { + if (editor.edit_level.dirty) return; + editor.load(editor.selectlist[0].file); + } +}; +editor.inputs['C-M-o'].doc = "Revert opened level back to its disk form."; + +editor.inputs['C-S-o'] = function() { + if (!editor.edit_level.dirty) + editor.load_prev(); +}; +editor.inputs['C-S-o'].doc = "Open previous level."; + +editor.inputs['C-l'] = function() { + texteditor.on_close = function() { editor.edit_level.script = texteditor.value;}; + texteditor.input_s_pressed = function() { + if (!Keys.ctrl()) return; + editor.edit_level.script = texteditor.value; + editor.save_current(); + texteditor.startbuffer = texteditor.value.slice(); + }; + + editor.openpanel(texteditor); + if (!editor.edit_level.script) + editor.edit_level.script = ""; + texteditor.value = editor.edit_level.script; + texteditor.start(); +}; +editor.inputs['C-l'].doc = "Open script editor for the level."; + +editor.inputs['M-l'] = function() { editor.programmode = !editor.programmode; }; +editor.inputs['M-l'].doc = "Toggle program mode."; + +editor.inputs.minus = function() { + if (!editor.selectlist.empty) { + editor.selectlist.forEach(function(x) { x.draw_layer--; }); + return; + } + + if (editor.working_layer > -1) + editor.working_layer--; +}; +editor.inputs.minus.doc = "Go down one working layer, or, move selected objects down one layer."; + +editor.inputs.plus = function() { + if (!editor.selectlist.empty) { + editor.selectlist.forEach(x => x.draw_layer++); + return; + } + + if (editor.working_layer < 4) + editor.working_layer++; +}; + +editor.inputs.plus.doc = "Go up one working layer, or, move selected objects down one layer."; + +editor.inputs.s = function() { + var offf = editor.cursor ? editor.cursor : editor.selected_com; + editor.scaleoffset = Vector.length(Mouse.worldpos.sub(offf)); + + if (editor.sel_comp) { + if (!('scale' in editor.sel_comp)) return; + editor.startscales = []; + editor.startscales.push(editor.sel_comp.scale); + return; + } + + editor.selectlist.forEach(function(x, i) { + editor.startscales[i] = x.scale; + if (editor.cursor) + editor.startoffs[i] = x.pos.sub(editor.cursor); + }, editor); + +}; +editor.inputs.s.doc = "Scale selected."; + var inputpanel = { title: "untitled", value: "", @@ -2540,5 +2496,3 @@ Debug.register_call(editor.ed_debug, editor); if (IO.exists("editor.config")) load_configs("editor.config"); editor.edit_level = Level.create(); - -Log.warn('bottom of editor'); diff --git a/source/scripts/engine.js b/source/scripts/engine.js index 0be93c1..d70b788 100644 --- a/source/scripts/engine.js +++ b/source/scripts/engine.js @@ -830,6 +830,14 @@ var Input = { setnuke() { cmd(78); }, }; +Input.print_pawn_kbm = function(pawn) { + if (!('inputs' in pawn)) return; + + for (var key in pawn.inputs) { + Log.warn(`${key} :: ${pawn.inputs[key].doc}`); + } +}; + function screen2world(screenpos) { return Yugine.camera.view2world(screenpos); } function world2screen(worldpos) { return Yugine.camera.world2view(worldpos); } @@ -875,6 +883,24 @@ var Player = { this.pawns.forEach(x => x[fn]?.(...args)); }, + raw_input(cmd, ...args) { + for (var pawn of this.pawns.reverse()) { + if (typeof pawn.inputs?.[cmd] === 'function') { + pawn.inputs[cmd](...args); + return; + } + } + }, + + raw_release(cmd, ...args) { + for (var pawn of this.pawns.reverse()) { + if (typeof pawn.inputs?.[cmd]?.released === 'function') { + pawn.inputs[cmd].released(...args); + return; + } + } + }, + control(pawn) { this.pawns.push_unique(pawn); }, @@ -942,6 +968,16 @@ var Register = { kbm_input(src, btn, state, ...args) { var input = `${src}_${btn}_${state}`; Player.players[0].input(input, ...args); + + if (!(state === "pressed" || state === "released")) return; + var e_str = ""; + if (Keys.ctrl()) e_str += "C-"; + if (Keys.alt()) e_str += "M-"; + e_str += btn; + if (state === "pressed") + Player.players[0].raw_input(e_str, ...args); + else + Player.players[0].raw_release(e_str, ...args); }, gamepad_playermap: [], @@ -1289,7 +1325,7 @@ var Level = { }, fullpath() { - return `${this.level.fullpath()}.${this.name}`; + //return `${this.level.fullpath()}.${this.name}`; }, get boundingbox() {