logging!!
This commit is contained in:
+1
-1
@@ -1 +1 @@
|
||||
984
|
||||
996
|
||||
@@ -81,8 +81,7 @@ class Theme {
|
||||
|
||||
}
|
||||
} catch(e) {
|
||||
// TODO: logs system
|
||||
trace(e.details());
|
||||
Logs.trace('Failed to load Desktop Theme: $e', ERROR);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -117,7 +117,6 @@ class Stage extends FlxBasic implements IBeatReceiver {
|
||||
}
|
||||
if (sprite != null) {
|
||||
for(e in node.nodes.property) {
|
||||
// TODO: Proper logging system
|
||||
XMLUtil.applyXMLProperty(sprite, e);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3,6 +3,7 @@ import funkin.system.Paths;
|
||||
import funkin.system.MusicBeatState;
|
||||
import funkin.system.MusicBeatSubstate;
|
||||
import funkin.system.CoolUtil;
|
||||
import funkin.system.Logs;
|
||||
import funkin.game.PlayState;
|
||||
|
||||
using StringTools;
|
||||
|
||||
@@ -305,8 +305,7 @@ class TitleState extends MusicBeatState
|
||||
}
|
||||
}
|
||||
} catch(e) {
|
||||
// TODO: Logging!!
|
||||
trace(e.details());
|
||||
Logs.trace('Failed to load titlescreen XML: $e', ERROR);
|
||||
}
|
||||
}
|
||||
#end
|
||||
|
||||
@@ -39,6 +39,11 @@ class OptionsMenu extends MusicBeatState {
|
||||
name: 'Save Data',
|
||||
desc: 'Use this menu to reset save data or engine settings.',
|
||||
state: SaveDataOptions
|
||||
},
|
||||
{
|
||||
name: 'Debug Options',
|
||||
desc: 'Use this menu to change debug options.',
|
||||
state: DebugOptions
|
||||
}
|
||||
];
|
||||
|
||||
|
||||
@@ -0,0 +1,19 @@
|
||||
package funkin.options.categories;
|
||||
|
||||
import funkin.windows.WindowsAPI;
|
||||
|
||||
class DebugOptions extends OptionsScreen {
|
||||
public override function create() {
|
||||
options = [
|
||||
#if windows
|
||||
new TextOption(
|
||||
"Show Console",
|
||||
"Select this to show the debug console, which contains log information about the game.",
|
||||
function() {
|
||||
WindowsAPI.allocConsole();
|
||||
}),
|
||||
#end
|
||||
];
|
||||
super.create();
|
||||
}
|
||||
}
|
||||
@@ -17,6 +17,7 @@ class HScript extends Script {
|
||||
var parser = new hscript.Parser();
|
||||
parser.allowJSON = parser.allowMetadata = parser.allowTypes = true;
|
||||
interp.errorHandler = _errorHandler;
|
||||
interp.variables.set("trace", this.trace);
|
||||
try {
|
||||
expr = parser.parseString(code, fileName);
|
||||
} catch(e) {
|
||||
@@ -70,4 +71,12 @@ class HScript extends Script {
|
||||
public override function set(val:String, value:Dynamic) {
|
||||
interp.variables.set(val, value);
|
||||
}
|
||||
|
||||
public override function trace(v:Dynamic) {
|
||||
var posInfo = interp.posInfos();
|
||||
Logs.traceColored([
|
||||
Logs.logText('${fileName}:${posInfo.lineNumber}: ', GREEN),
|
||||
Logs.logText(Std.string(v))
|
||||
], TRACE);
|
||||
}
|
||||
}
|
||||
@@ -135,6 +135,17 @@ class Script extends FlxBasic implements IFlxDestroyable {
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Traces something as this script.
|
||||
*/
|
||||
public function trace(v:Dynamic) {
|
||||
Logs.traceColored([
|
||||
Logs.logText('${fileName}: ', GREEN),
|
||||
Logs.logText(Std.string(v))
|
||||
], TRACE);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Calls the function `func` defined in the script.
|
||||
* @param func Name of the function
|
||||
@@ -177,8 +188,10 @@ class Script extends FlxBasic implements IFlxDestroyable {
|
||||
* @param additionalInfo Additional information you could provide.
|
||||
*/
|
||||
public function error(text:String, ?additionalInfo:Dynamic):Void {
|
||||
// TODO: Logs (like on YCE)
|
||||
trace('$text');
|
||||
Logs.traceColored([
|
||||
Logs.logText(fileName, GREEN),
|
||||
Logs.logText(text)
|
||||
], ERROR);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -0,0 +1,87 @@
|
||||
package funkin.system;
|
||||
|
||||
import haxe.Log;
|
||||
import funkin.windows.WindowsAPI;
|
||||
import funkin.windows.WindowsAPI.ConsoleColor;
|
||||
|
||||
class Logs {
|
||||
private static var __showing:Bool = false;
|
||||
public static function init() {
|
||||
__showInConsole([
|
||||
logText("Hello, World! ", CYAN),
|
||||
logText("I am..."),
|
||||
logText("COLORED!!", RED)]);
|
||||
|
||||
Log.trace = function(v : Dynamic, ?infos : Null<haxe.PosInfos>) {
|
||||
__showInConsole(prepareColoredTrace([
|
||||
logText('${infos.fileName}:${infos.lineNumber}: ', CYAN),
|
||||
logText(Std.string(v))
|
||||
], TRACE));
|
||||
};
|
||||
}
|
||||
|
||||
public static function prepareColoredTrace(text:Array<LogText>, level:Level = INFO) {
|
||||
var time = Date.now();
|
||||
var superCoolText = [
|
||||
logText('[ '),
|
||||
logText('${Std.string(time.getHours()).addZeros(2)}:${Std.string(time.getMinutes()).addZeros(2)}:${Std.string(time.getSeconds()).addZeros(2)}', DARKMAGENTA),
|
||||
logText(' |'),
|
||||
switch(level) {
|
||||
case WARNING: logText(' WARNING ', DARKYELLOW);
|
||||
case ERROR: logText(' ERROR ', DARKRED);
|
||||
case TRACE: logText(' TRACE ', GRAY);
|
||||
default: logText(' INFORMATION ', CYAN);
|
||||
},
|
||||
logText('] ')
|
||||
];
|
||||
for(k=>e in superCoolText)
|
||||
text.insert(k, e);
|
||||
return text;
|
||||
}
|
||||
|
||||
public static function logText(text:String, color:ConsoleColor = LIGHTGRAY):LogText {
|
||||
return {
|
||||
text: text,
|
||||
color: color
|
||||
};
|
||||
}
|
||||
|
||||
public static function __showInConsole(text:Array<LogText>) {
|
||||
#if sys
|
||||
while(__showing) {
|
||||
Sys.sleep(0.05);
|
||||
}
|
||||
__showing = true;
|
||||
for(t in text) {
|
||||
WindowsAPI.setConsoleColors(t.color);
|
||||
Sys.print(t.text);
|
||||
}
|
||||
WindowsAPI.setConsoleColors();
|
||||
Sys.print("\r\n");
|
||||
__showing = false;
|
||||
#else
|
||||
trace(text);
|
||||
#end
|
||||
}
|
||||
|
||||
public static function traceColored(text:Array<LogText>, level:Level = INFO) {
|
||||
__showInConsole(prepareColoredTrace(text, level));
|
||||
}
|
||||
public static function trace(text:String, level:Level = INFO, color:ConsoleColor = LIGHTGRAY) {
|
||||
traceColored([{
|
||||
text: text,
|
||||
color: color
|
||||
}], level);
|
||||
}
|
||||
}
|
||||
|
||||
enum abstract Level(Int) {
|
||||
var INFO = 0;
|
||||
var WARNING = 1;
|
||||
var ERROR = 2;
|
||||
var TRACE = 3;
|
||||
}
|
||||
typedef LogText = {
|
||||
var text:String;
|
||||
var color:ConsoleColor;
|
||||
}
|
||||
@@ -112,6 +112,8 @@ class Main extends Sprite
|
||||
ModsFolder.loadMod("introMod");
|
||||
ModsFolder.currentModFolder = "introMod";
|
||||
|
||||
Logs.init();
|
||||
|
||||
#if sys
|
||||
if (Sys.args().contains("-livereload")) {
|
||||
trace("Used lime test windows. Switching into source assets.");
|
||||
|
||||
@@ -17,7 +17,7 @@ class XMLUtil {
|
||||
*/
|
||||
public static function applyXMLProperty(object:Dynamic, property:Access):ErrorCode {
|
||||
if (!property.has.name || !property.has.type || !property.has.value) {
|
||||
// TODO: show in logs
|
||||
Logs.trace('Failed to apply XML property: XML Element misses name, type, or value attributes.', WARNING);
|
||||
return MISSING_PROPERTY;
|
||||
}
|
||||
|
||||
@@ -33,8 +33,7 @@ class XMLUtil {
|
||||
try {
|
||||
Reflect.setProperty(object, property.att.name, value);
|
||||
} catch(e) {
|
||||
// TODO: Correct Logs
|
||||
trace(e);
|
||||
Logs.trace('Failed to apply XML property: $e on ${Type.getClass(object)}', WARNING);
|
||||
return REFLECT_ERROR;
|
||||
}
|
||||
return OK;
|
||||
|
||||
@@ -19,6 +19,7 @@ class WindowsAPI {
|
||||
public static function allocConsole() {
|
||||
#if windows
|
||||
native.WinAPI.allocConsole();
|
||||
native.WinAPI.clearScreen();
|
||||
#end
|
||||
}
|
||||
|
||||
@@ -30,4 +31,55 @@ class WindowsAPI {
|
||||
native.WinAPI.setDarkMode(enable);
|
||||
#end
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the console colors
|
||||
*/
|
||||
public static function setConsoleColors(foregroundColor:ConsoleColor = LIGHTGRAY, ?backgroundColor:ConsoleColor = BLACK) {
|
||||
#if windows
|
||||
var fg = cast(foregroundColor, Int);
|
||||
var bg = cast(backgroundColor, Int);
|
||||
native.WinAPI.setConsoleColors((bg * 16) + fg);
|
||||
#end
|
||||
}
|
||||
|
||||
public static function consoleColorToOpenFL(color:ConsoleColor) {
|
||||
return switch(color) {
|
||||
case BLACK: 0xFF000000;
|
||||
case DARKBLUE: 0xFF000088;
|
||||
case DARKGREEN: 0xFF008800;
|
||||
case DARKCYAN: 0xFF008888;
|
||||
case DARKRED: 0xFF880000;
|
||||
case DARKMAGENTA: 0xFF880000;
|
||||
case DARKYELLOW: 0xFF888800;
|
||||
case LIGHTGRAY: 0xFFBBBBBB;
|
||||
case GRAY: 0xFF888888;
|
||||
case BLUE: 0xFF0000FF;
|
||||
case GREEN: 0xFF00FF00;
|
||||
case CYAN: 0xFF00FFFF;
|
||||
case RED: 0xFFFF0000;
|
||||
case MAGENTA: 0xFFFF00FF;
|
||||
case YELLOW: 0xFFFFFF00;
|
||||
case WHITE | _: 0xFFFFFFFF;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@:enum abstract ConsoleColor(Int) {
|
||||
var BLACK:ConsoleColor = 0;
|
||||
var DARKBLUE:ConsoleColor = 1;
|
||||
var DARKGREEN:ConsoleColor = 2;
|
||||
var DARKCYAN:ConsoleColor = 3;
|
||||
var DARKRED:ConsoleColor = 4;
|
||||
var DARKMAGENTA:ConsoleColor = 5;
|
||||
var DARKYELLOW:ConsoleColor = 6;
|
||||
var LIGHTGRAY:ConsoleColor = 7;
|
||||
var GRAY:ConsoleColor = 8;
|
||||
var BLUE:ConsoleColor = 9;
|
||||
var GREEN:ConsoleColor = 10;
|
||||
var CYAN:ConsoleColor = 11;
|
||||
var RED:ConsoleColor = 12;
|
||||
var MAGENTA:ConsoleColor = 13;
|
||||
var YELLOW:ConsoleColor = 14;
|
||||
var WHITE:ConsoleColor = 15;
|
||||
}
|
||||
+24
-23
@@ -142,31 +142,32 @@ class WinAPI {
|
||||
if (!AllocConsole())
|
||||
return;
|
||||
|
||||
FILE* fDummy;
|
||||
freopen_s(&fDummy, "CONOUT$", "w", stdout);
|
||||
freopen_s(&fDummy, "CONOUT$", "w", stderr);
|
||||
freopen_s(&fDummy, "CONIN$", "r", stdin);
|
||||
std::cout.clear();
|
||||
std::clog.clear();
|
||||
std::cerr.clear();
|
||||
std::cin.clear();
|
||||
|
||||
// std::wcout, std::wclog, std::wcerr, std::wcin
|
||||
HANDLE hConOut = CreateFile(_T("CONOUT$"), GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
|
||||
HANDLE hConIn = CreateFile(_T("CONIN$"), GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
|
||||
SetStdHandle(STD_OUTPUT_HANDLE, hConOut);
|
||||
SetStdHandle(STD_ERROR_HANDLE, hConOut);
|
||||
SetStdHandle(STD_INPUT_HANDLE, hConIn);
|
||||
std::wcout.clear();
|
||||
std::wclog.clear();
|
||||
std::wcerr.clear();
|
||||
std::wcin.clear();
|
||||
freopen("CONIN$", "r", stdin);
|
||||
freopen("CONOUT$", "w", stdout);
|
||||
freopen("CONOUT$", "w", stderr);
|
||||
')
|
||||
public static function allocConsole() {
|
||||
// LogsOverlay.consoleOpened = LogsOverlay.consoleVisible = true;
|
||||
haxe.Log.trace = function(v:Dynamic, ?infos:haxe.PosInfos) {
|
||||
// nothing here so that it keeps shit clean
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
#if windows
|
||||
@:functionCode('
|
||||
HANDLE console = GetStdHandle(STD_OUTPUT_HANDLE);
|
||||
SetConsoleTextAttribute(console, color);
|
||||
')
|
||||
#end
|
||||
public static function setConsoleColors(color:Int) {
|
||||
|
||||
}
|
||||
|
||||
#if windows
|
||||
@:functionCode('
|
||||
system("CLS");
|
||||
std::cout<< "" <<std::flush;
|
||||
')
|
||||
#end
|
||||
public static function clearScreen() {
|
||||
|
||||
}
|
||||
}
|
||||
#end
|
||||
Reference in New Issue
Block a user