public static void CreateScreen() { if (Surface != IntPtr.Zero) { SDL_FreeSurface(Surface); Surface = IntPtr.Zero; } Surface = SDL_CreateRGBSurface(0, Eight.RealWidth, Eight.RealHeight, 32, 0xff000000, 0x00ff0000, 0x0000ff00, 0x000000ff); if (Surface == IntPtr.Zero) { Console.WriteLine("SDL_CreateRGBSurface() failed: " + SDL_GetError()); Eight.Quit(); } TextGrid = new ulong[Eight.WindowWidth * Eight.WindowHeight]; TextFlags = new byte[Eight.WindowWidth * Eight.WindowHeight]; Dirty = true; }
public static bool Init() { _quit = false; LuaState = new Lua { Encoding = Encoding.UTF8 }; LuaState.PushString($"Eight {Eight.Version}"); LuaState.SetGlobal("_HOST"); LuaState.SetWarningFunction(WarnFunction, IntPtr.Zero); DoLibs(); State = LuaState.NewThread(); State.SetHook((luaState, ar) => { var state = Lua.FromIntPtr(luaState); var arg = LuaDebug.FromIntPtr(ar); if (arg.Event == LuaHookEvent.Count) { if (Event.OutOfSync && !_killed) { _killed = true; if (Eight.Flags["out_of_sync_error"]) { State.Error("out of sync"); } } } }, LuaHookMask.Count, 10000); if (!File.Exists("Lua/boot.lua")) { Console.WriteLine("Could not find boot.lua"); Eight.Crash("Could not find bios.lua!", "Is Eight installed correctly?"); return(false); } var biosContent = File.ReadAllText("Lua/boot.lua"); var status = State.LoadString(biosContent, "@BOOT"); if (status != LuaStatus.OK) { var error = State.ToString(-1); Console.WriteLine("Lua Load Exception: {0}", error); return(false); } return(true); }
public static bool Resume(int n = 0) { if ( _quit ) return false; if ( _running ) return false; _running = true; var status = State.Resume(null, n, out var nres); _running = false; _killed = false; if ( status == LuaStatus.OK || status == LuaStatus.Yield ) { State.Pop(nres); if ( status != LuaStatus.OK ) return true; Console.WriteLine(State.ToString(-1)); return false; } var error = State.ToString(-1) ?? "Unknown Error"; State.Traceback(State); var traceback = State.ToString(-1) ?? "Unknown Trace"; string nr; switch ( status ) { case LuaStatus.ErrRun: nr = "Runtime Error"; break; case LuaStatus.ErrMem: nr = "Memory Allocation Error"; break; case LuaStatus.ErrErr: nr = "Error Handler Error"; break; case LuaStatus.ErrSyntax: nr = "Syntax Error"; break; default: nr = status.ToString(); break; } var hexStatus = status.ToString("X").TrimStart('0'); Console.WriteLine($"Lua Exception [0x{hexStatus}] {nr}: {error}"); Console.WriteLine(traceback); Console.WriteLine("Could not resume"); var rand = new Random(); var splash = crashSplashes[rand.Next(crashSplashes.Length)]; Eight.Crash(splash, error, traceback, "Could not resume"); return false; }
public static string ReadLine(int?maxLen, string regex = "*") { string input = ""; int ox = X; int oy = Y; var redraw = new Action(() => { X = ox; Y = oy; Print(input + " "); Render(); }); Render(); bool exit = false; while (SDL_WaitEvent(out var _ev) != 0 && !exit) { if (_ev.type == SDL_EventType.SDL_QUIT) { Eight.Quit(); break; } if (_ev.type == SDL_EventType.SDL_TEXTINPUT) { byte[] c; unsafe { c = Utils.CString(_ev.text.text); } var chunk = Encoding.UTF8.GetString(c); if (Regex.IsMatch(chunk, regex)) { input += chunk; } if (maxLen != null) { input = input.Substring(0, Math.Min((int)maxLen, input.Length)); } redraw(); } if (_ev.type == SDL_EventType.SDL_KEYDOWN) { switch (_ev.key.keysym.sym) { case SDL_Keycode.SDLK_RETURN: exit = true; break; case SDL_Keycode.SDLK_BACKSPACE: if (input.Length > 0) { input = input.Substring(0, input.Length - 1); redraw(); } break; } } } return(input); }