package game; import openfl.text.TextField; import openfl.events.KeyboardEvent; import openfl.ui.Keyboard in Kb; import openfl.Lib; import engine.enums.console.CVarFlag; import engine.enums.console.CVarType; import engine.typedefs.console.CCmd; import engine.typedefs.console.CVar; import engine.ConVar; import game.ui.console.Console; import game.video.Mode; class Input{ public static var keys:Map = []; public static var keysLast:Map = []; public static var bindMap:Map = ["~" => "toggleconsole", "\\" => "toggleconsole", "1" => "echo kak", "2" => "+attack"]; public static var cv_debugKeys = ConVar.registerCVar("cl_debuginput", CInt, 0, null, "print debug messages related to input to console", null, false, true, 0, 0, false); public static var keyNameMap:Map = [ Kb.HOME => "HOME", Kb.END => "END", Kb.INSERT => "INSERT", Kb.DELETE => "DELETE", Kb.PAGE_UP => "PGUP", Kb.PAGE_DOWN => "PGDN", Kb.ESCAPE => "ESC", Kb.F1 => "F1", Kb.F2 => "F2", Kb.F3 => "F3", Kb.F4 => "F4", Kb.F5 => "F5", Kb.F6 => "F6", Kb.F7 => "F7", Kb.F8 => "F8", Kb.F9 => "F9", Kb.F10 => "F10", Kb.F11 => "F11", Kb.F12 => "F12", Kb.BACKQUOTE => "~", Kb.NUMBER_1 => "1", Kb.NUMBER_2 => "2", Kb.NUMBER_3 => "3", Kb.NUMBER_4 => "4", Kb.NUMBER_5 => "5" , Kb.NUMBER_6 => "6", Kb.NUMBER_7 => "7", Kb.NUMBER_8 => "8", Kb.NUMBER_9 => "9", Kb.NUMBER_0 => "0", Kb.TAB => "TAB", Kb.Q => "Q", Kb.W => "W", Kb.E => "E", Kb.R => "R", Kb.T => "T", Kb.Y => "Y", Kb.U => "U", Kb.I => "I", Kb.O => "O", Kb.P => "P", Kb.LEFTBRACKET => "[", Kb.RIGHTBRACKET => "]", Kb.BACKSLASH => "\\", Kb.CAPS_LOCK => "CAPSLOCK", Kb.A => "A", Kb.S => "S", Kb.D => "D", Kb.F => "F", Kb.G => "G" , Kb.H => "H", Kb.J => "J", Kb.K => "K" , Kb.L => "L", Kb.SEMICOLON => "SEMICOLON", Kb.QUOTE => "'", Kb.ENTER => "ENTER", Kb.SHIFT => "SHIFT", Kb.Z => "Z", Kb.X => "X", Kb.C => "C", Kb.V => "V", Kb.B => "B", Kb.N => "N", Kb.M => "M", Kb.COMMA => "COMMA",Kb.PERIOD => "PERIOD", Kb.SLASH => "/" , Kb.CONTROL => "CTRL", Kb.ALTERNATE =>"ALT" ]; public static var keyCodeMap:Map = [ for(key in keyNameMap.keys()){ keyNameMap[key] => key; } ]; public static var cCmdGetKeyCode = ConVar.registerCCmd("getkey", (cArgs:Array) -> { var keycode:Int = keyCodeMap[cArgs[0]]; if(cArgs != null) Console.devMsg(Std.string(keycode)); }); public static function onKeyIsDown(e:KeyboardEvent){ if(!Std.isOfType(Lib.current.stage.focus,TextField)){ // Check if not null so we don't end up cooming all over unallocated memory; if(bindMap[keyNameMap[e.keyCode]] != null) Console.consoleInstance.parseCmd(bindMap[keyNameMap[e.keyCode]]); } if(!keys[e.keyCode]){ if(cv_debugKeys.value == 1) Console.devMsg("triggered key: "+keyNameMap[e.keyCode]); else if(cv_debugKeys.value > 1 ) Console.devMsg(""+e.keyCode); } keys[e.keyCode] = true; var key:String = keyNameMap[e.keyCode]; if(cv_debugKeys.value > 0) Console.devMsg(""+key); } public static function onKeyIsUp(e:KeyboardEvent){ if(!Std.isOfType(Lib.current.stage.focus,TextField)){ // Make sure we're not checking a null value (this can cause a crash) if(bindMap[keyNameMap[e.keyCode]] != null){ if(bindMap[keyNameMap[e.keyCode]].indexOf("+") == 0){ Console.consoleInstance.parseCmd(StringTools.replace(bindMap[keyNameMap[e.keyCode]],"+","-")); } } } keys[e.keyCode] = false; } // public static function resolveKeyName(key:Int):String // { // return keyNameMap[key]; // } public static function bindKey(input:String, action:String):Void { bindMap[input] = action; } private static var bind:CCmd = ConVar.registerCCmd("bind", (cArgs:Array)->{ cArgs[0] = cArgs[0].toUpperCase(); if(cArgs.length == 2){ if(keyCodeMap[cArgs[0]]!= null) { if(cArgs[1].indexOf('"') == 0 && cArgs[1].lastIndexOf('"') == cArgs[1].length-1){ bindKey(cArgs[0], cArgs[1].substring(1,cArgs[1].length-1)); } else{ bindKey(cArgs[0], cArgs[1]); } } } else if(cArgs.length == 1){ Console.devMsg(bindMap[cArgs[0]]); } else{ Console.devMsg("usage: bind "); } }); public static function onEnterFrame() { if( keys[Kb.BACKQUOTE]){ //Console.toggle(); if(cv_debugKeys.value > 0) Console.devMsg("toggle console"); } if( keys[Kb.ALTERNATE] && keys[Kb.ENTER] && !keysLast[Kb.ALTERNATE] && !keysLast[Kb.ENTER] ){ Mode.switchFsMode(); } // Console Input field is in focus if(Lib.current.stage.focus == Console.consoleInstance.cIn){ if ( keys[Kb.ENTER] && !keysLast[Kb.ENTER] && !keysLast[Kb.ALTERNATE]){ Console.consoleInstance.submitInput(); } if (keys[Kb.UP] && !keysLast[Kb.UP]){ Console.histPrev(); } if (keys[Kb.DOWN] && !keysLast[Kb.DOWN]){ Console.histNext(); } } if(Console.consoleInstance.visible){ if (keys[Kb.ESCAPE]){ Console.toggle(); } } keysLast = keys.copy(); } }