From 97833fc6d917e2edd684c265584f1b6892ad5668 Mon Sep 17 00:00:00 2001 From: andreas Date: Tue, 27 Apr 2021 00:25:42 +0200 Subject: [PATCH] refactoring console ui --- hGameTest/project.xml | 15 +- hGameTest/res/assets.manifest.json | 9 + hGameTest/src/App.hx | 16 +- hGameTest/src/Main.hx | 8 +- hGameTest/src/assets/Fonts.hx | 8 + hGameTest/src/assets/HTex.hx | 2 +- hGameTest/src/game/Game.hx | 37 +- hGameTest/src/game/Input.hx | 77 ++-- hGameTest/src/game/ui/ConVar.hx | 103 ++++- hGameTest/src/game/ui/Console.hx | 77 ---- hGameTest/src/game/ui/UIContianer.hx | 27 ++ hGameTest/src/game/ui/UIElement.hx | 12 + hGameTest/src/game/ui/UIPane.hx | 15 + hGameTest/src/game/ui/console/Console.hx | 363 ++++++++++++++++++ .../game/ui/console/elements/ConsoleInput.hx | 51 +++ hGameTest/src/game/ui/text/TextFormats.hx | 24 ++ 16 files changed, 691 insertions(+), 153 deletions(-) create mode 100644 hGameTest/res/assets.manifest.json create mode 100644 hGameTest/src/assets/Fonts.hx delete mode 100644 hGameTest/src/game/ui/Console.hx create mode 100644 hGameTest/src/game/ui/UIContianer.hx create mode 100644 hGameTest/src/game/ui/UIElement.hx create mode 100644 hGameTest/src/game/ui/UIPane.hx create mode 100644 hGameTest/src/game/ui/console/Console.hx create mode 100644 hGameTest/src/game/ui/console/elements/ConsoleInput.hx create mode 100644 hGameTest/src/game/ui/text/TextFormats.hx diff --git a/hGameTest/project.xml b/hGameTest/project.xml index 285f93fe..17e79d3b 100644 --- a/hGameTest/project.xml +++ b/hGameTest/project.xml @@ -8,23 +8,22 @@ - - - + + + - - - + + + - + - \ No newline at end of file diff --git a/hGameTest/res/assets.manifest.json b/hGameTest/res/assets.manifest.json new file mode 100644 index 00000000..c01c0254 --- /dev/null +++ b/hGameTest/res/assets.manifest.json @@ -0,0 +1,9 @@ +{ + "datascheme": "assetmanifest", + "version": "1.0", + "type": "manifestmanifest", + "files": [ + "" + ] + +} \ No newline at end of file diff --git a/hGameTest/src/App.hx b/hGameTest/src/App.hx index f1302646..b9692eed 100644 --- a/hGameTest/src/App.hx +++ b/hGameTest/src/App.hx @@ -1,17 +1,25 @@ import openfl.display.Sprite; import openfl.display.Stage; import openfl.events.Event; +import assets.Scanner; +import openfl.utils.AssetManifest; class App extends Sprite { public function new () { - super (); - var game:Game = new Game(stage); - game.onInit(); - stage.addEventListener(Event.ENTER_FRAME, game.onEnterFrame); + Scanner.scanTextureDir(); + trace("k"); + #if buildhxml + var manifest = new AssetManifest (); + + + #end + //var game:Game = new Game(stage); + //game.onInit(); + //stage.addEventListener(Event.ENTER_FRAME, game.onEnterFrame); } diff --git a/hGameTest/src/Main.hx b/hGameTest/src/Main.hx index 31bfc990..2713883b 100644 --- a/hGameTest/src/Main.hx +++ b/hGameTest/src/Main.hx @@ -1,3 +1,4 @@ +import assets.Scanner; import game.video.Mode; import openfl.events.KeyboardEvent; import openfl.display.Sprite; @@ -16,16 +17,21 @@ class Main extends Sprite { } private function onInit(e:Event) { + //Scanner.scanTextureDir(); + trace("heyy"); stage.frameRate = 1000; var game:Game = new Game(stage); + trace("kokk"); stage.addEventListener(Event.ENTER_FRAME, game.onEnterFrame); stage.addEventListener(KeyboardEvent.KEY_DOWN,Input.onKeyIsDown); stage.addEventListener(KeyboardEvent.KEY_UP,Input.onKeyIsUp); stage.addEventListener(Event.RESIZE,onResize); game.onInit(); - Mode.setVideoMode(800, 600); + + //Mode.setVideoMode(1280, 960); } private function onResize (event:Event):Void { + trace("yeet"); //Here we can do shit with window scaling //stage.stageWidth; //stage.stageHeight; diff --git a/hGameTest/src/assets/Fonts.hx b/hGameTest/src/assets/Fonts.hx new file mode 100644 index 00000000..2ad4f32f --- /dev/null +++ b/hGameTest/src/assets/Fonts.hx @@ -0,0 +1,8 @@ +package assets; + +import openfl.text.Font; +import openfl.Assets; + +class Fonts{ + //public static var terminus:Font = Assets.getFont("fonts/Terminus.ttf"); +} \ No newline at end of file diff --git a/hGameTest/src/assets/HTex.hx b/hGameTest/src/assets/HTex.hx index 491af41f..01479cdb 100644 --- a/hGameTest/src/assets/HTex.hx +++ b/hGameTest/src/assets/HTex.hx @@ -31,7 +31,7 @@ class HTex{ var tileNames:Array = td.tilesetGeneric.tiles; var atlas:TextureAtlas = new TextureAtlas(Assets.getBitmapData(baseTexturePath),width,height); var tileSetGeneric = new TilesetGeneric(td.texName, atlas, tileNames); - trace(tileSetGeneric); + //trace(tileSetGeneric); } } } diff --git a/hGameTest/src/game/Game.hx b/hGameTest/src/game/Game.hx index 7ce63366..06cfd215 100644 --- a/hGameTest/src/game/Game.hx +++ b/hGameTest/src/game/Game.hx @@ -1,24 +1,14 @@ package game; -import openfl.display.DisplayObject; -import game.ui.Console; +import engine.typedefs.CVar; import game.entities.Player; -import assets.tilesets.TilesetGeneric; -import assets.tilesets.Tileset; -import openfl.display.Bitmap; import openfl.display.Stage; -import openfl.display.Bitmap; -import openfl.display.BitmapData; import openfl.display.Sprite; -import openfl.ui.Keyboard; import openfl.events.Event; -import openfl.Assets; -import openfl.display.DisplayObject; import assets.Scanner; import assets.HTex; -import openfl.Lib; -import openfl.display.StageDisplayState; import game.ui.ConVar; +import game.ui.console.Console; class Game { @@ -27,21 +17,26 @@ class Game public var uiLayer:Sprite; public function new(_stage:Stage){ stage = _stage; + /* Scanner.scanTextureDir(); for(tex in Scanner.textures){ HTex.createTextureObjectFromJSON(tex); } - + */ gameLayer = new Sprite(); uiLayer = new Sprite(); - - trace("wattafak"); } public var player:Player; - public var console:Console = new game.ui.Console(); + public var console:Console = new Console(); + public function loadData():Void + { + new game.ui.text.TextFormats(); + + } public function onInit():Void { + gameLayer = new Sprite(); uiLayer = new Sprite(); stage.addChild(gameLayer); @@ -49,11 +44,10 @@ class Game //player.graphics.lineStyle(2,0xFF0000); //player.graphics.drawRect(0,0,16,16); // var bitmapData:BitmapData = Assets.getBitmapData("textures/sprites/character.png"); - player = new Player(); - console = new Console(); - gameLayer.addChild(player.sprite); + //player = new Player(); + //gameLayer.addChild(player.sprite); uiLayer.addChild(console); - ConVar.setCVar("echo", "blaw"); + var cvar_cl_kankerlow:CVar = ConVar.registerCVar("cl_kankerlow", CInt, 10, FCVAR_ARCHIVE, "is de speler een kankerlow?",null,false,false,0,0,false); //var sheet:SpriteSheet = new SpriteSheet(sheetData); //var playerBitmap:Bitmap = new Bitmap(Tileset.tilesetMap["testsheet"].tileMap["testTile5"]); //var someotherbitmap:Bitmap = new Bitmap(Tileset.tilesetMap["testsheet"].tileMap["testTile3"]); @@ -65,8 +59,5 @@ class Game public function onEnterFrame(e:Event):Void { Input.onEnterFrame(); - - //player.x++; - //player.y++; } } \ No newline at end of file diff --git a/hGameTest/src/game/Input.hx b/hGameTest/src/game/Input.hx index e59ad3d1..01ab7010 100644 --- a/hGameTest/src/game/Input.hx +++ b/hGameTest/src/game/Input.hx @@ -1,6 +1,8 @@ package game; -import game.ui.Console; +import engine.enums.CVarFlag; +import engine.typedefs.CCmd; +import game.ui.console.Console; import game.video.Mode; import openfl.events.KeyboardEvent; import openfl.ui.Keyboard in Kb; @@ -11,29 +13,13 @@ import game.ui.ConVar; class Input{ - public static var keys:Array = []; - public static var keysLast:Array = []; + public static var keys:Map = []; + public static var keysLast:Map = []; public static var bindMap:Map = []; //public static var bind:CVar = Convar.registerCVar("bind",CVarType.cCmd, null, ()->{ // //}); - public static var keyCodeMap:Map = [ - "HOME" => Kb.HOME, "END" => Kb.END, "INSERT" => Kb.INSERT, "DELETE" => Kb.DELETE, "PGUP" => Kb.PAGE_UP, "PGDN" => Kb.PAGE_DOWN, - "ESC" => Kb.ESCAPE, "F1" => Kb.F1, "F2" => Kb.F2, "F3" => Kb.F3, "F4" => Kb.F4, "F5" => Kb.F5, - "F6" => Kb.F6, "F7" => Kb.F7, "F8" => Kb.F8, "F9" => Kb.F9, "F10" => Kb.F10, "F11" => Kb.F11, - "F12" => Kb.F12, - "~" => Kb.BACKQUOTE, "1" => Kb.NUMBER_1, "2" => Kb.NUMBER_2, "3" => Kb.NUMBER_3, "4" => Kb.NUMBER_4, "5" => Kb.NUMBER_5, - "6" => Kb.NUMBER_6, "7" => Kb.NUMBER_7, "8" => Kb.NUMBER_8, "9" => Kb.NUMBER_9, "0" => Kb.NUMBER_0, - "TAB" => Kb.TAB, "Q" => Kb.Q, "W" => Kb.W, "E" => Kb.E, "R" => Kb.R, "T" => Kb.T, - "Y" => Kb.Y, "U" => Kb.U, "I" => Kb.I, "O" => Kb.O, "P" => Kb.P, "[" => Kb.LEFTBRACKET, - "]" => Kb.RIGHTBRACKET, "\\" => Kb.BACKSLASH, - "CAPSLOCK" => Kb.CAPS_LOCK, "A" => Kb.A, "S" => Kb.S, "D" => Kb.D, "F" => Kb.F, "G" => Kb.G, - "H" => Kb.H, "J" => Kb.J, "K" => Kb.K, "L" => Kb.L, "SEMICOLON" => Kb.SEMICOLON, "'" => Kb.QUOTE, - "ENTER" => Kb.ENTER, - "SHIFT" => Kb.SHIFT, "Z" => Kb.Z, "X" => Kb.X, "C" => Kb.C, "V" => Kb.V, "B" => Kb.B, - "N" => Kb.N, "M" => Kb.M, "COMMA" => Kb.COMMA, "PERIOD" => Kb.PERIOD, "/" => Kb.SLASH , - "CTRL" => Kb.CONTROL, "ALT" => Kb.ALTERNATE - ]; + 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", @@ -49,14 +35,28 @@ class Input{ 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){ - keys[e.charCode] = true; - var key:String = keyNameMap[e.charCode]; - if(debugKeys.value > 0) Console.devMsg(""+key); + if(!keys[e.keyCode]){ + if(cv_debugKeys.value > 0) + Console.devMsg("triggered key: "+keyNameMap[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){ - keys[e.charCode] = false; + keys[e.keyCode] = false; } public static function resolveKeyName(key:Int):String { @@ -76,23 +76,26 @@ class Input{ // } 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(); } - - if ( keys[Kb.ENTER] && !keysLast[Kb.ENTER] && !keysLast[Kb.ALTERNATE]){ - if(Lib.current.stage.focus == Console.consoleIndex.cIn){ - Console.consoleIndex.submitInput(); + // 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(); } } - - for(i in 0...keys.length){ - keysLast[i] = keys[i]; - } - //trace("enter pressed: " + keys[Kb.ENTER] + "enter pressed last: " + keysLast[Kb.ENTER]); - //trace(keysLast[Kb.ENTER]); - //keysLast = keys; - //trace(keys[Kb.ENTER]); - //trace(keysLast[Kb.ENTER]); + keysLast = keys.copy(); } } \ No newline at end of file diff --git a/hGameTest/src/game/ui/ConVar.hx b/hGameTest/src/game/ui/ConVar.hx index b992569b..446841d4 100644 --- a/hGameTest/src/game/ui/ConVar.hx +++ b/hGameTest/src/game/ui/ConVar.hx @@ -5,6 +5,7 @@ import engine.typedefs.CVar; import engine.typedefs.CCmd; import engine.enums.CVarType; import engine.enums.CVarFlag; +import game.ui.console.Console; class ConVar{ @@ -24,13 +25,111 @@ class ConVar{ } public static inline function setCVar(_name:String, _value:Dynamic) { - if(CVarMap[_name] != null){ - CVarMap[_name] = _value; + if(CVarMap[_name]!=null || CCmdMap[_name]!=null){ + Console.devMsg("Tried setting already defined command: " + _name + ", returning null instead"); + return null; + } + var cmd:CCmd = CCmdMap[_name] = { + name : _name, + callback : _callback + } + return cmd; + } + public static inline function setCVar(_name:String, _value:Dynamic):Void + { + var cv = getCVar(_name); + if(cv != null){ + switch(cv.type){ + case CInt,CFloat: + if(cv.bMax && _value > cv.fMax) _value = cv.fMax; + if(cv.bMin && _value < cv.fMin) _value = cv.fMin; + case CBool: + if(Std.isOfType(_value, String)){ + var v:String = _value; + _value = v.toLowerCase(); + if(_value == "true" || _value == "1"){ + _value = true; + } + else{ + _value = false; + } + } + else if(Std.isOfType(_value, Int) || Std.isOfType(_value, Float)){ + if(_value %2 == 0){ + _value = false; + } + else{ + _value = true; + } + } + else if(Std.isOfType(_value, Bool)){ + //do nothing + } + else{ + _value = cv.value; + } + case CString: + _value = Std.string(_value); + + } + cv.value = _value; + cv.callback(); + } else{ Console.consoleIndex.devMsg("trying to set null convar '"+_name+"'"); } } + public static inline function isCVar(_name:String){ + return (CVarMap[_name] != null); + + } + public static inline function isCmd(_name:String){ + return (CCmdMap[_name] != null); + } + public static inline function runCmd(_name:String, _args:Array){ + if(CCmdMap[_name] != null){ + CCmdMap[_name].callback(_args); + } + } + public static inline function getCVarNames():Array + { + var keys:Array = [ + for(iterator in [CCmdMap.keys(),CVarMap.keys()]){ + for(key in iterator){ + key; + } + } + ]; + keys.sort(function(a:String, b:String):Int { + a = a.toUpperCase(); + b = b.toUpperCase(); + if (a < b) { + return -1; + } + else if (a > b) { + return 1; + } else { + return 0; + } + }); + return keys; + } + public static var cmdList:CCmd = ConVar.registerCCmd("list", (cArgs:Array)->{ + var keys:Array = getCVarNames(); + for(key in keys){ + if(CVarMap[key] != null){ + Console.devMsg(key+" "+CVarMap[key].value); + } + else{ + Console.devMsg(key); + } + } + }); + public static inline function getCVar(_name:String):CVar + { + return CVarMap[_name]; + } } \ No newline at end of file diff --git a/hGameTest/src/game/ui/Console.hx b/hGameTest/src/game/ui/Console.hx deleted file mode 100644 index 5ba96a33..00000000 --- a/hGameTest/src/game/ui/Console.hx +++ /dev/null @@ -1,77 +0,0 @@ -package game.ui; - -import openfl.events.Event; -import openfl.text.TextFieldAutoSize; -import openfl.text.TextField; -import openfl.display.Sprite; -import openfl.Assets; -import openfl.text.TextFormat; -import openfl.text.TextFieldType; - -class Console extends Sprite{ - - public var textFormat:TextFormat; - public var cOut:TextField; - public var cIn:TextField; - public static var consoleIndex:Console; - public function new(){ - super(); - - consoleIndex = this; - - graphics.beginFill(0x111111); - graphics.drawRect(0,0,800,600); - - textFormat = new TextFormat(Assets.getFont("fonts/Terminus.ttf").fontName, 24, 0x00ff00); - - - - cIn = new TextField(); - cIn.type = TextFieldType.INPUT; - cIn.text = ''; - cIn.multiline = false; - //cIn.autoSize = TextFieldAutoSize.LEFT; - cIn.width = 800-24; - cIn.height = 32; - cIn.background = true; - cIn.backgroundColor = 0x000000; - cIn.selectable = true; - cIn.setTextFormat(textFormat); - cIn.y = 600-cIn.height-12; - cIn.x = 12; - - cOut = new TextField(); - cOut.text = "hConsole Initialized\n"; - cOut.setTextFormat(textFormat); - //cOut.autoSize = TextFieldAutoSize.LEFT; - cOut.multiline = true; - cOut.background = true; - cOut.backgroundColor = 0x000000; - cOut.width = 800 - 24; - cOut.height = 600 - cIn.height - 38; - cOut.y = 12; - cOut.x = 12; - - - cOut.addEventListener(Event.CHANGE, onOutputTextChange); - //cOut.addEventListener() - this.addChild(cOut); - this.addChild(cIn); - } - public function parseCmd(cmd:String){ - var parts:Array = cmd.split(" "); - } - public function submitInput(){ - parseCmd(cIn.text); - cOut.appendText(">"+cIn.text+"\n"); - cIn.text = ""; - cOut.scrollV = cOut.maxScrollV; - } - public function onOutputTextChange(e:Event){ - cOut.scrollV = cOut.maxScrollV; - } - public function devMsg(msg:String):Void - { - cOut.appendText(msg+"\n"); - } -} \ No newline at end of file diff --git a/hGameTest/src/game/ui/UIContianer.hx b/hGameTest/src/game/ui/UIContianer.hx new file mode 100644 index 00000000..35696022 --- /dev/null +++ b/hGameTest/src/game/ui/UIContianer.hx @@ -0,0 +1,27 @@ +package game.ui; + +import openfl.geom.Point; +import openfl.display.Sprite; + + +class UIContianer extends Sprite{ + public static var UIDrawList:Array=[]; + public var anchor:Point; + public function new(panchor,scale){ + super(); + } + public function onResize(){ + + } + public function hide(){ + + } + public function show(){ + + } + public function getParent() + { + return parent; + } + +} diff --git a/hGameTest/src/game/ui/UIElement.hx b/hGameTest/src/game/ui/UIElement.hx new file mode 100644 index 00000000..5b1ff09b --- /dev/null +++ b/hGameTest/src/game/ui/UIElement.hx @@ -0,0 +1,12 @@ +package game.ui; + +import openfl.geom.Point; +import openfl.display.Sprite; + +class UIElement extends Sprite +{ + public function new(){ + super(); + } + +} \ No newline at end of file diff --git a/hGameTest/src/game/ui/UIPane.hx b/hGameTest/src/game/ui/UIPane.hx new file mode 100644 index 00000000..873491d2 --- /dev/null +++ b/hGameTest/src/game/ui/UIPane.hx @@ -0,0 +1,15 @@ +package game.ui; + +class UIPane{ + public static var paneList:Array=[]; + public var x:Int; + public var y:Int; + public var width:Int; + public var height:Int; + public var parent:UIPane; + + public function new(){ + + } + +} \ No newline at end of file diff --git a/hGameTest/src/game/ui/console/Console.hx b/hGameTest/src/game/ui/console/Console.hx new file mode 100644 index 00000000..cd2c75a4 --- /dev/null +++ b/hGameTest/src/game/ui/console/Console.hx @@ -0,0 +1,363 @@ +package game.ui.console; + +import engine.enums.CVarFlag; +import game.ui.text.TextFormats; +import assets.Fonts; +import openfl.Lib; +import openfl.events.Event; +import openfl.text.TextFieldAutoSize; +import openfl.text.TextField; +import openfl.display.Sprite; +import openfl.Assets; +import openfl.text.TextFormat; +import openfl.text.TextFieldType; +import engine.typedefs.CVar; +import game.ui.ConVar; +import engine.typedefs.CCmd; +import game.ui.console.elements.ConsoleInput; + + + +class Console extends Sprite{ + public var textFormat:TextFormat; + public var cOut:TextField; + public var cIn:TextField; + public var cInput:ConsoleInput; + public var cAutoComp:TextField; + public static var consoleInstance:Console; + public var cvar_mat_consolebg:CVar; + public function new(){ + super(); + + consoleInstance = this; + + + graphics.beginFill(0x555555); + graphics.drawRect(0,0,800,600); + + cInput = new ConsoleInput(); + cIn = cInput.tf; + + //cIn.setTextFormat(textFormat); + cInput.y = 600-cInput.height-12; + cInput.x = 12; + + cvar_mat_consolebg = ConVar.registerCVar("mat_consolebg",CString,"0x222222",null,"console background color", ()->{ + cOut.backgroundColor = Std.parseInt(cvar_mat_consolebg.value); + cIn.backgroundColor = Std.parseInt(cvar_mat_consolebg.value); + },false,false,0,0,false); + + cOut = new TextField(); + cOut.text = "hConsole Initialized\n"; + cOut.defaultTextFormat = TextFormats.getFormats().cOutputFmt; + cOut.wordWrap = true; + //cOut.autoSize = TextFieldAutoSize.LEFT; + cOut.multiline = true; + cOut.background = true; + cOut.backgroundColor = Std.parseInt(cvar_mat_consolebg.value); + cOut.width = 800 - 24; + cOut.height = 600 - cIn.height - 38; + cOut.y = 12; + cOut.x = 12; + + cAutoComp = new TextField(); + cAutoComp.text = ""; + cAutoComp.defaultTextFormat = TextFormats.getFormats().cInputFmt; + cAutoComp.wordWrap = false; + cAutoComp.multiline = true; + cAutoComp.background = true; + cAutoComp.backgroundColor = 0x11111100; + cAutoComp.border = true; + cAutoComp.borderColor = 0x55555500; + cAutoComp.selectable = false; + cAutoComp.width = 400; + cAutoComp.height = 32*5; + cAutoComp.visible = false; + cAutoComp.x = 0; + cAutoComp.y = 600; + + + + cOut.addEventListener(Event.CHANGE, onOutputTextChange); + cIn.addEventListener(Event.CHANGE, onInputTextChange); + //cOut.addEventListener() + this.addChild(cOut); + this.addChild(cInput); + this.addChild(cAutoComp); + //ConVar.registerCVar("echo", CVarType.CCmd, null, devMsg()) + ConVar.registerCCmd("echo", (args:Array) -> { Console.devMsg(args.join(" ").split('"').join(""));}); + ConVar.registerCCmd("quit", (args:Array) -> { Lib.application.window.close();}); + } + public function parseCmd(cmd:String){ + history.push(cmd); + cmd = cmd.split(";").join(" ; "); + var subStrings = []; + var startQuoteIndex:Int = cmd.indexOf('"'); + var endQuoteIndex:Int; + if(startQuoteIndex != -1){ + while((startQuoteIndex = cmd.indexOf('"')) > -1){ + //push start of the cmd up until the quotes start + subStrings.push(cmd.substring(0,startQuoteIndex)); + //find next quote + endQuoteIndex = cmd.indexOf('"',startQuoteIndex+1)+1; + if(endQuoteIndex == 0){ + cmd+='"'; + endQuoteIndex = cmd.length; + + } + //push quote content + subStrings.push(cmd.substring(startQuoteIndex,endQuoteIndex)); + cmd = cmd.substr(endQuoteIndex); + } + } + subStrings.push(cmd); + //Split args + var newSubStrings = []; + for(subString in subStrings){ + if(subString.indexOf('"') == -1){ + // split spaced args + for(str in subString.split(" ")){ + //we want to discard empty strings + if(str != "") + newSubStrings.push(str); + } + + } + else{ + newSubStrings.push(subString); + } + } + var commands = []; + //split off additional commands + while(newSubStrings.length > 0){ + for(i in 0...newSubStrings.length){ + if(newSubStrings[i] == ";"){ + commands.push(newSubStrings.splice(0,i)); + newSubStrings.shift(); + break; + } + if(newSubStrings.length-1 == i){ + commands.push(newSubStrings); + newSubStrings = []; + } + } + } + trace(commands); + execCommands(commands); + } + public function execCommands(commands:Array>){ + for(command in commands){ + var cName:String = command[0]; + var cValue:String = command[1]; + var cArgs:Array = command.slice(1); + if(ConVar.isCVar(cName)){ + var cv:CVar = ConVar.getCVar(command[0]); + if(command.length == 1){ + devMsg(cv.name+" - "+cv.helpString); + devMsg(cv.name+" = "+cv.value); + } + else{ + switch(cv.type){ + case CInt: + ConVar.setCVar(cName,Std.parseInt(cValue)); + trace(cValue); + break; + case CFloat: + ConVar.setCVar(cName,Std.parseFloat(cValue)); + break; + case CBool: + cValue = cValue.toLowerCase(); + if(cValue == "1" || cValue == "true"){ + ConVar.setCVar(cName,true); + } + else if(cValue == "0" || cValue == "false"){ + ConVar.setCVar(cName,false); + } + break; + case CString: + ConVar.setCVar(cName,cValue); + break; + } + + } + + } + else if(ConVar.isCmd(cName)){ + ConVar.runCmd(cName,cArgs); + } + else{ + devMsg("unkown command: "+command[0]); + } + } + } + public function submitInput(){ + cOut.appendText(">"+cIn.text+"\n"); + parseCmd(cIn.text); + cIn.text = ""; + cAutoComp.visible = false; + cOut.scrollV = cOut.maxScrollV; + histSelect = -1; + } + public function onOutputTextChange(e:Event){ + cOut.scrollV = cOut.maxScrollV; + } + public function onInputTextChange(e:Event){ + if(cIn.text != ""){ + cAutoComp.text = ""; + for(string in (autocompleteList = getCompList())){ + cAutoComp.text += string+"\n"; + trace(string); + } + cAutoComp.visible = true; + } + else{ + cAutoComp.visible = false; + autocompleteList = history; + } + } + public static function toggle():Void + { + consoleInstance.visible = !consoleInstance.visible; + } + public static function devMsg(msg:String):Void + { + consoleInstance.cOut.appendText(msg+"\n"); + consoleInstance.cOut.scrollV = consoleInstance.cOut.maxScrollV; + } + public static var history:Array = []; + public static var histSelect:Int = -1; + public static var tmpInput:String = ""; + public static var autocompleteList:Array = []; + public static var compSelect:Int = -1; + public static function getCompList():Array + { + // Split words + var inp:Array = consoleInstance.cIn.text.split(" "); + var inpStripped:Array = [ + for(word in inp){ + if(word != "" && word != " "){ + word; + } + } + ]; + // Stop if input is empty + if(inp.length == 0) return []; + + var cVars:Array = ConVar.getCVarNames(); + var cVarFiltered:Array = []; + // Loop through convars + for(cVar in cVars){ + //if there's one word just check if the convar starts with the input string + if(inp.length == 1) + { + // Check if the cvar starts with the input + if(cVar.indexOf(inp[0]) == 0){ + cVarFiltered.push(cVar); + } + } + // User pressed space at least once but entered no other words. Check if first word occurs at any position + else if(inpStripped.length == 1 && inp.length > 1){ + if(cVar.indexOf(inp[0]) > -1){ + cVarFiltered.push(cVar); + } + } + // Multiple words, check for cvars that contain all of them + else if(inpStripped.length > 1) + { + var bWordNotPresent:Bool = false; + for(word in inpStripped){ + if(cVar.indexOf(word) == -1){ + bWordNotPresent = true; + } + } + if(!bWordNotPresent) + cVarFiltered.push(cVar); + } + } + return cVarFiltered; + } + public static function histPrev():Void + { + // Only complete if input field is empty or scrolling through hist + if(consoleInstance.cIn.text == "" || histSelect != -1){ + // Store current input in tmpInput + if(histSelect == -1) tmpInput = consoleInstance.cIn.text; + // Only go through history if history is not empty + if(history.length != 0){ + // Check if currently selecting a history entry + if(histSelect >= 0){ + histSelect--; + } + // Not currently selecting a history entry + else{ + // Put selector to the newest + histSelect = history.length -1; + } + if(histSelect != -1){ + // Put correct history entry in the input field + consoleInstance.cIn.text = history[histSelect]; + } + else{ + // Restore tmp input + consoleInstance.cIn.text = tmpInput; + } + } + // History is empty + else{ + // Do nothing + return; + } + } + // Now we need to descend through the autocomplete list + else{ + if(autocompleteList.length == 0){ + return; + } + else{ + // Check if currently selecting an autocomplete entry + if(compSelect > -1){ + + } + // Not currently selecting an autocomplete entry + else{ + + } + } + + + } + } + public static function histNext():Void + { + // Only complete if input field is empty or scrolling through hist + if(consoleInstance.cIn.text == "" || histSelect != -1){ + // Store current input in tmpInput + if(histSelect == -1) tmpInput = consoleInstance.cIn.text; + // Only go through history if history is not empty + if(history.length != 0){ + // Check if currently selecting a history entry + if(histSelect < history.length -1){ + histSelect++; + } + // Otherwise wrap around + else{ + // Put selector to no selection + histSelect = -1; + } + if(histSelect != -1){ + // Put correct history entry in the input field + consoleInstance.cIn.text = history[histSelect]; + } + else{ + // Restore tmp input + consoleInstance.cIn.text = tmpInput; + } + } + // History is empty + else{ + // Do nothing + return; + } + } + } +} \ No newline at end of file diff --git a/hGameTest/src/game/ui/console/elements/ConsoleInput.hx b/hGameTest/src/game/ui/console/elements/ConsoleInput.hx new file mode 100644 index 00000000..2c34565f --- /dev/null +++ b/hGameTest/src/game/ui/console/elements/ConsoleInput.hx @@ -0,0 +1,51 @@ +package game.ui.console.elements; + +import openfl.events.Event; +import openfl.display.Sprite; +import openfl.text.TextField; +import openfl.text.TextFieldType; +import openfl.text.TextFormat; +import openfl.Assets; +import game.ui.text.TextFormats; + +class ConsoleInput extends Sprite +{ + public var tf:TextField; + public function new(){ + super(); + tf = new TextField(); + tf.defaultTextFormat = TextFormats.getFormats().cInputFmt; + tf.text = ""; + //tf.setTextFormat(new TextFormat(Assets.getFont("fonts/Terminus.ttf").fontName, 24, 0x00ff00)); + trace(tf.getTextFormat().color); + trace(tf.getTextFormat().font); + tf.type = TextFieldType.INPUT; + tf.multiline = false; + //tf.autoSize = TextFieldAutoSize.LEFT; + tf.width = 800-24; + tf.height = tf.textHeight+2; + tf.background = true; + tf.backgroundColor = 0x222222; + tf.selectable = true; + this.addChild(tf); + this.addEventListener(Event.RESIZE,onResize); + tf.addEventListener(Event.CHANGE, onTextChange); + } + public function onResize(e:Event){ + tf.width = this.width; + } + public function onTextChange(e:Event){ + + } + public function clearText(){ + tf.text = ""; + } + public function getText():String + { + return tf.text; + } + public function setText(t:String){ + tf.text = t; + } + +} \ No newline at end of file diff --git a/hGameTest/src/game/ui/text/TextFormats.hx b/hGameTest/src/game/ui/text/TextFormats.hx new file mode 100644 index 00000000..d87a6570 --- /dev/null +++ b/hGameTest/src/game/ui/text/TextFormats.hx @@ -0,0 +1,24 @@ +package game.ui.text; + + +import openfl.text.TextFormat; +import openfl.Assets; +import assets.Fonts; + +class TextFormats{ + public static var formats:TextFormats; + public var cInputFmt:TextFormat; + public var cOutputFmt:TextFormat; + public function new(){ + cInputFmt = new TextFormat(Assets.getFont("fonts/Terminus.ttf").fontName, 24, 0xffffff); + cOutputFmt = new TextFormat(Assets.getFont("fonts/Terminus.ttf").fontName, 24, 0xffffff); + } + public static function getFormats():TextFormats + { + if(formats == null){ + formats = new TextFormats(); + } + return formats; + } + +} \ No newline at end of file