Exemple #1
0
        public LuaArgs read(LuaArgs args)
        {
            int x = args.GetInt(0);
            int y = args.GetInt(1);

            if (args.IsNil(2))
            {
                if (x >= 0 && x < Image.Width &&
                    y >= 0 && y < Image.Height)
                {
                    var b = Image[x, y];
                    return(new LuaArgs(b));
                }
                return(new LuaArgs(0));
            }
            else
            {
                int length = args.GetInt(2);
                if (length < 0)
                {
                    throw new LuaError("Read length must be positive");
                }
                if (x < 0 || x >= Image.Width ||
                    y < 0 || y >= Image.Height ||
                    (x + y * Image.Width + length) > Image.Width * Image.Height)
                {
                    throw new LuaError("Read must start and end within the image bounds");
                }
                var result = Image.Read(x, y, length);
                return(new LuaArgs(result));
            }
        }
Exemple #2
0
            public LuaArgs stopSound(LuaArgs args)
            {
                var path = args.GetString(0);

                m_entity.StopSound(path);
                return(LuaArgs.Empty);
            }
Exemple #3
0
 public LuaArgs shutdown(LuaArgs args)
 {
     m_cpu.RequestShutdown();
     throw new LuaYield(LuaArgs.Empty, delegate {
         return(LuaArgs.Empty);
     });
 }
Exemple #4
0
        public LuaArgs setOverlayAlignment(LuaArgs args)
        {
            var line      = args.GetInt(0) - 1;
            var alignment = args.GetString(1);

            switch (alignment)
            {
            case "left":
            {
                m_state.SetTerminalAlignment(line, TextAlignment.Left);
                break;
            }

            case "right":
            {
                m_state.SetTerminalAlignment(line, TextAlignment.Right);
                break;
            }

            case "center":
            {
                m_state.SetTerminalAlignment(line, TextAlignment.Center);
                break;
            }

            default:
            {
                throw new LuaError("Invalid alignment: " + alignment);
            }
            }
            return(LuaArgs.Empty);
        }
Exemple #5
0
        public LuaArgs scrollOverlay(LuaArgs args)
        {
            var i = args.GetInt(0);

            m_state.ScrollTerminal(i);
            return(LuaArgs.Empty);
        }
Exemple #6
0
        public LuaArgs canTranslate(LuaArgs args)
        {
            var language = m_state.Game.Language;
            var key      = args.GetString(0);

            return(new LuaArgs(language.CanTranslate(key)));
        }
Exemple #7
0
 public LuaArgs write(LuaArgs args)
 {
     try
     {
         CheckOpen();
         if (m_openMode == LuaFileOpenMode.Write)
         {
             // Write some stuff
             int             i            = 0;
             LuaContinuation continuation = null;
             continuation = delegate {
                 if (!args.IsNil(i))
                 {
                     return(WriteOneAsync(args[i++], continuation));
                 }
                 else
                 {
                     return(new LuaArgs(this));
                 }
             };
             return(continuation.Invoke(LuaArgs.Empty));
         }
         return(new LuaArgs(this));
     }
     catch (IOException e)
     {
         return(new LuaArgs(LuaValue.Nil, e.Message));
     }
 }
 private void QueueEvent(string eventName, LuaArgs args)
 {
     if (m_computer != null)
     {
         m_computer.Events.Queue(eventName, args);
     }
 }
Exemple #9
0
 public LuaArgs loadlib(LuaArgs args)
 {
     args.GetString(0); // libname
     args.GetString(1); // funcname
                        // We don't support loading C libraries
     return(LuaArgs.Empty);
 }
Exemple #10
0
 public LuaArgs getFreeSpace(LuaArgs args)
 {
     CheckConnected();
     return(new LuaArgs(
                Math.Max(Mount.Capacity - Mount.UsedSpace, 0)
                ));
 }
Exemple #11
0
        private Sound parseSound(LuaArgs args, int index)
        {
            LuaTable table            = args.GetTable(index);
            string   waveform         = table.IsNil("waveform") ? "square" : table.GetString("waveform");
            float    volume           = table.IsNil("volume") ? 1.0f : table.GetFloat("volume");
            float    duty             = table.IsNil("duty") ? 0.5f : table.GetFloat("duty");
            float    duration         = table.GetFloat("duration");
            float    attack           = table.IsNil("attack") ? 0.0f : table.GetFloat("attack");
            float    decay            = table.IsNil("decay") ? 0.0f : table.GetFloat("decay");
            float    frequency        = table.GetFloat("frequency");
            float    slide            = table.IsNil("slide") ? 0.0f : table.GetFloat("slide");
            float    vibratoDepth     = table.IsNil("vibrato_depth") ? 0.0f : table.GetFloat("vibrato_depth");
            float    vibratoFrequency = table.IsNil("vibrato_frequency") ? 0.0f : table.GetFloat("vibrato_frequency");
            bool     loop             = table.IsNil("loop") ? false : table.GetBool("loop");

            var sound = new Sound();

            sound.Waveform         = ParseWaveform(waveform);
            sound.Volume           = Clamp(volume, 0.0f, 1.0f);
            sound.Duty             = Clamp(duty, 0.0f, 1.0f);
            sound.Attack           = Math.Max(attack, 0.0f);
            sound.Duration         = Math.Max(duration, 0.0f);
            sound.Decay            = Math.Max(decay, 0.0f);
            sound.Frequency        = Math.Max(frequency, 0.0f);
            sound.Slide            = slide;
            sound.VibratoDepth     = Math.Max(vibratoDepth, 0.0f);
            sound.VibratoFrequency = Math.Max(vibratoFrequency, 0.0f);
            sound.Loop             = loop;

            return(sound);
        }
Exemple #12
0
        public LuaArgs find(LuaArgs args)
        {
            var wildcard = Sanitize(args.GetString(0));

            try
            {
                CheckConnected();
                var dir         = wildcard.GetDir();
                var namePattern = wildcard.GetName();
                var nameRegex   = new Regex("^" + Regex.Escape(namePattern).Replace("\\*", ".*") + "$");
                var table       = new LuaTable();
                int i           = 0;
                if (Mount.Exists(dir) && Mount.IsDir(dir))
                {
                    foreach (var name in Mount.List(dir))
                    {
                        if (nameRegex.IsMatch(name))
                        {
                            table[++i] = FilePath.Combine(dir, name).ToString();
                        }
                    }
                }
                return(new LuaArgs(table));
            }
            catch (IOException e)
            {
                throw new LuaError(e.Message);
            }
        }
Exemple #13
0
        public LuaArgs open(LuaArgs args)
        {
            var path = Sanitize(args.GetString(0));
            var mode = args.IsNil(1) ? "r" : args.GetString(1);

            try
            {
                CheckConnected();
                if (mode == "r")
                {
                    CheckFileExists(path);
                    return(new LuaArgs(new LuaFile(Mount.OpenForRead(path))));
                }
                else if (mode == "rb")
                {
                    CheckFileExists(path);
                    return(new LuaArgs(new LuaFile(Mount.OpenForBinaryRead(path), LuaFileOpenMode.Read)));
                }
                else if (mode == "w")
                {
                    CheckWritable();
                    CheckDirDoesNotExist(path);
                    CheckParentDirExists(path);
                    return(new LuaArgs(new LuaFile(WritableMount.OpenForWrite(path, false))));
                }
                else if (mode == "wb")
                {
                    CheckWritable();
                    CheckDirDoesNotExist(path);
                    CheckParentDirExists(path);
                    return(new LuaArgs(new LuaFile(WritableMount.OpenForBinaryWrite(path, false), LuaFileOpenMode.Write)));
                }
                else if (mode == "a")
                {
                    CheckWritable();
                    CheckDirDoesNotExist(path);
                    CheckParentDirExists(path);
                    return(new LuaArgs(new LuaFile(WritableMount.OpenForWrite(path, true))));
                }
                else if (mode == "ab")
                {
                    CheckWritable();
                    CheckDirDoesNotExist(path);
                    CheckParentDirExists(path);
                    return(new LuaArgs(new LuaFile(WritableMount.OpenForBinaryWrite(path, true), LuaFileOpenMode.Write)));
                }
                else
                {
                    throw new LuaError("Unsupported mode: " + mode);
                }
            }
            catch (FileNotFoundException)
            {
                return(LuaArgs.Nil);
            }
            catch (IOException e)
            {
                throw new LuaError(e.Message);
            }
        }
Exemple #14
0
        public LuaArgs write(LuaArgs args)
        {
            int x = args.GetInt(0);
            int y = args.GetInt(1);

            if (args.IsNumber(2))
            {
                var n = args.GetByte(2);
                CheckWritable();
                if (x >= 0 && x < Image.Width &&
                    y >= 0 && y < Image.Height)
                {
                    Image[x, y] = n;
                }
                return(LuaArgs.Empty);
            }
            else
            {
                var bytes = args.GetByteString(2);
                if (x < 0 || x >= Image.Width ||
                    y < 0 || y >= Image.Height ||
                    (x + y * Image.Width + bytes.Length) > Image.Width * Image.Height)
                {
                    throw new LuaError("Write must start and end within the image bounds");
                }
                CheckWritable();
                Image.Write(bytes, 0, bytes.Length, x, y);
                return(LuaArgs.Empty);
            }
        }
Exemple #15
0
        public LuaArgs difftime(LuaArgs args)
        {
            var t2 = args.GetDouble(0);
            var t1 = args.GetDouble(1);

            return(new LuaArgs(t2 - t1));
        }
Exemple #16
0
        public LuaArgs searchpath(LuaArgs args)
        {
            var name         = args.GetString(0);
            var path         = args.GetString(1);
            var sep          = args.IsNil(2) ? "." : args.GetString(2);
            var rep          = args.IsNil(3) ? "/" : args.GetString(3);
            var fixedName    = name.Replace(sep, rep);
            var fixedPath    = path.Replace("?", fixedName);
            var candidates   = fixedPath.Split(';');
            var errorBuilder = new StringBuilder();

            foreach (var candidate in candidates)
            {
                var candPath = new FilePath(candidate);
                if (m_fileSystem.Exists(candPath) && !m_fileSystem.IsDir(candPath))
                {
                    return(new LuaArgs(candidate));
                }
                else
                {
                    if (errorBuilder.Length > 0)
                    {
                        errorBuilder.Append('\n');
                    }
                    errorBuilder.Append("no file '" + candidate + "'");
                }
            }
            return(new LuaArgs(LuaValue.Nil, errorBuilder.ToString()));
        }
Exemple #17
0
 public LuaArgs output(LuaArgs args)
 {
     if (args.IsNil(0))
     {
         return(new LuaArgs(m_output.Value));
     }
     else if (args.IsObject <LuaFile>(0))
     {
         m_output.Value = args.GetObject <LuaFile>(0);
         return(LuaArgs.Empty);
     }
     else
     {
         var path = new FilePath(args.GetString(0));
         try
         {
             m_output.Value = new LuaFile(m_fileSystem.OpenForWrite(path, false));
             return(LuaArgs.Empty);
         }
         catch (IOException e)
         {
             throw new LuaError(e.Message);
         }
     }
 }
Exemple #18
0
        public LuaArgs combine(LuaArgs args)
        {
            var a = new FilePath(args.GetString(0));
            var b = new FilePath(args.GetString(1));

            return(new LuaArgs(FilePath.Combine(a, b).ToString()));
        }
Exemple #19
0
        public LuaArgs read(LuaArgs args)
        {
            int start = args.GetInt(0);

            if (args.IsNil(1))
            {
                if (start >= 0 && start < Buffer.Length)
                {
                    var b = Buffer[start];
                    return(new LuaArgs(b));
                }
                return(new LuaArgs(0));
            }
            else
            {
                int length = args.GetInt(1);
                if (length < 0)
                {
                    throw new LuaError("Read length must be positive");
                }
                if (start < 0 || start + length > Buffer.Length)
                {
                    throw new LuaError("Read must start and end within the buffer");
                }
                var result = Buffer.Read(start, length);
                return(new LuaArgs(result));
            }
        }
Exemple #20
0
        public LuaArgs match(LuaArgs args)
        {
            var path     = new FilePath(args.GetString(0));
            var wildcard = new FilePath(args.GetString(1));

            return(new LuaArgs(path.Matches(wildcard)));
        }
Exemple #21
0
            public LuaArgs stopParticles(LuaArgs args)
            {
                var path = args.GetString(0);

                m_entity.StopParticles(path);
                return(LuaArgs.Empty);
            }
Exemple #22
0
        public LuaArgs saveTGA(LuaArgs args)
        {
            var image   = args.GetObject <LuaImage>(0).Image;
            var palette = args.GetObject <LuaPalette>(1).Palette;

            try
            {
                if (args.IsNil(2))
                {
                    // Save to a string and return it
                    using (var stream = new MemoryStream())
                    {
                        TGAImage.Encode(image, palette, stream);
                        return(new LuaArgs(stream.ToArray()));
                    }
                }
                else
                {
                    // Save to a stream
                    var file = args.GetObject <LuaFile>(2);
                    CheckFileMode(file, "tga", LuaFileOpenMode.Write, LuaFileContentType.Binary);
                    TGAImage.Encode(image, palette, file.InnerStream);
                    return(LuaArgs.Empty);
                }
            }
            catch (IOException e)
            {
                throw new LuaError(e.Message);
            }
        }
Exemple #23
0
            public LuaArgs setVisible(LuaArgs args)
            {
                var visible = args.GetBool(0);

                m_entity.Visible = visible;
                return(LuaArgs.Empty);
            }
Exemple #24
0
        public LuaArgs newPalette(LuaArgs args)
        {
            var size = args.IsNil(0) ? 16 : args.GetInt(0);

            if (size < 1 || size > 256)
            {
                throw new LuaError("Palette size must be in range 1-256");
            }
            if (m_computer.Memory.Alloc(size * 3))
            {
                // Create a simple greyscale palette
                uint   usize  = (uint)size;
                uint[] colors = new uint[usize];
                colors[0] = 0x000000ff;
                for (uint i = 1; i < colors.Length; ++i)
                {
                    uint bright = ((i * 255) / (usize - 1)) & 0xff;
                    colors[i] = (bright << 24) + (bright << 16) + (bright << 8) + 255;
                }
                var palette = new Palette(colors);
                return(new LuaArgs(new LuaPalette(palette, m_computer.Memory)));
            }
            else
            {
                throw new LuaError("not enough memory");
            }
        }
Exemple #25
0
            public LuaArgs setCastShadows(LuaArgs args)
            {
                var castShadows = args.GetBool(0);

                m_entity.CastShadows = castShadows;
                return(LuaArgs.Empty);
            }
Exemple #26
0
        public LuaArgs clear(LuaArgs args)
        {
            var color = args.IsNil(0) ? (byte)0 : args.GetByte(0);

            m_graphics.Clear(color);
            return(LuaArgs.Empty);
        }
Exemple #27
0
 public LuaArgs reboot(LuaArgs args)
 {
     m_cpu.RequestReboot();
     throw new LuaYield(LuaArgs.Empty, delegate {
         return(LuaArgs.Empty);
     });
 }
Exemple #28
0
        public LuaArgs newFont(LuaArgs args)
        {
            var image           = args.GetObject <LuaImage>(0);
            var characters      = args.GetString(1);
            var characterWidth  = args.GetInt(2);
            var characterHeight = args.GetInt(3);

            if (characterWidth <= 0)
            {
                throw new LuaError("Character width must be positive");
            }
            if (characterWidth > image.Image.Width)
            {
                throw new LuaError("Character width must be less than image width");
            }
            if (characterHeight <= 0)
            {
                throw new LuaError("Character height must be positive");
            }
            if (characterHeight > image.Image.Height)
            {
                throw new LuaError("Character width must be less than image height");
            }

            var font = new Font(image.Image, characters, characterWidth, characterHeight, true);

            return(new LuaArgs(new LuaFont(font, image)));
        }
Exemple #29
0
        public LuaArgs fill(LuaArgs args)
        {
            var color = args.GetByte(0);

            if (args.IsNil(1))
            {
                CheckWritable();
                Image.Fill(color);
            }
            else
            {
                int x = args.GetInt(1);
                int y = args.GetInt(2);
                int w = args.GetInt(3);
                int h = args.GetInt(4);
                if (w < 0)
                {
                    throw new LuaError("Fill width must be positive");
                }
                if (h < 0)
                {
                    throw new LuaError("Fill height must be positive");
                }
                if (x < 0 || x + w > Image.Width ||
                    y < 0 || y + h > Image.Height)
                {
                    throw new LuaError("Fill must start and end within the image bounds");
                }
                CheckWritable();
                Image.Fill(color, x, y, w, h);
            }
            return(LuaArgs.Empty);
        }
Exemple #30
0
        public LuaArgs getPowerStatus(LuaArgs args)
        {
            PowerStatus status;
            double      chargeLevel;

            m_computer.GetPowerStatus(out status, out chargeLevel);
            return(new LuaArgs(status.ToString().ToLower(), chargeLevel));
        }