Example #1
0
        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;
        }
Example #2
0
        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);
        }
Example #3
0
        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;
        }
Example #4
0
        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);
        }