package engine; import engine.typedefs.console.CVar; import engine.typedefs.console.CCmd; import engine.enums.console.CVarType; import engine.enums.console.CVarFlag; import game.ui.console.Console; import engine.ConVars_Engine; class ConVar{ // Hush the compiler about unused import // static var ConVars_Engine:Class = ConVars_Engine; static var CVarMap:Map = []; static var CCmdMap:Map = []; /** * Registers a new CVar * @param _name The name of the CVar. This is the way it is called in the console or referred to in code. * @param _type CVar type as defined in the CVarType enum. * @param _value The default value for this CVar. This needs to be in line with its CVarType. * @param _flags CVar flags as defined in the CVarFlags enum. * @param _helpString Help string that gets printed out in console when no value is specified. * @param _callback The function that gets called when the CVar is set. Calls empty Void when left undefined. * @param _callOnCreate Whether the callback function gets called or not after registering. * @param _bMin Specifies if the CVar has a minimum numeric value. * @param _fMin Specifies the minimum numeric value. * @param _fMax Specifies the maximum numeric value. * @param _bMax Specifies if the CVar has a maximum numeric value. */ public static inline function registerCVar(_name:String, _type:CVarType, _value:Dynamic, ?_flags:CVarFlag, ?_helpString:String = "", ?_callback:Void->Void, ?_callOnCreate:Bool=false, _bMin:Bool=false, _fMin:Float=0, _fMax:Float=0, _bMax:Bool = false):CVar { if(CVarMap[_name]!=null || CCmdMap[_name]!= null){ Console.devMsg("Tried setting already defined convar: " + _name + ", returning null instead"); return null; } if(_bMin && _value < _fMin) _value = _fMin; if(_bMax && _value > _fMax) _value = _fMax; var cvar:CVar = CVarMap[_name] = { name : _name, type : _type, value : _value, flags: _flags, helpString: _helpString, bMin : _bMin, fMin : _fMin, fMax : _fMax, bMax : _bMax, callback : _callback == null ? ()->{} : _callback } if(_callback != null && _callOnCreate){ _callback(); } return cvar; } public static inline function registerCCmd(_name:String, ?_callback:Array->Void):CCmd { 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 { if(CVarMap == null){ Console.devMsg("CVarMap is null"); return; } 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.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 inline function getCVar(_name:String):CVar { return CVarMap[_name]; } public static inline function getCVarMap():Map { return CVarMap; } }