Example #1
0
        public string RealExecute(FungeContext fungeContext)
        {
            var values     = fungeContext.GetTopStackTopValues(fungeContext.Dimension + 1);
            var targetCell = new DeltaVector(values.Reverse().Skip(1).ToArray()) + fungeContext.CurrentThread.StorageOffset;

            fungeContext.ModifyCell(targetCell, values.Last());
            return(null);
        }
Example #2
0
        public int GetValue(DeltaVector dv)
        {
            if (_field.TryGetValue(dv.Y, out var xcoords))
            {
                if (xcoords.TryGetValue(dv.X, out var val))
                {
                    return(val);
                }
            }

            return(' ');
        }
Example #3
0
        public void ModifyCell(DeltaVector target, int value)
        {
            if (_field.TryGetValue(target.Y, out var xcoords))
            {
                xcoords[target.X] = value;
            }
            else
            {
                _field[target.Y] = new Dictionary <int, int> {
                    { target.X, value }
                };
            }

            UpdateBounds();
        }
Example #4
0
        public string RealExecute(FungeContext fungeContext)
        {
            var filename = fungeContext.PopString();
            var flag     = fungeContext.GetTopStackTopValues(1)[0];
            var va       = new DeltaVector(fungeContext.GetTopStackTopValues(fungeContext.Dimension).Reverse().ToArray()) + fungeContext.CurrentThread.StorageOffset;
            var vb       = fungeContext.GetTopStackTopValues(fungeContext.Dimension).Reverse().ToArray();

            try
            {
                using var fw = new StreamWriter(File.OpenWrite(filename));


                for (var y = va.Y; y < vb[1] + va.Y; y++)
                {
                    var line = new List <char>();
                    for (var x = va.X; x < va.X + vb[0]; x++)
                    {
                        var c = fungeContext.GetCellValue(new DeltaVector(x, y, 0));
                        line.Add((char)c);
                    }

                    var resString = new string(line.ToArray());
                    if ((flag & 1) == 1)
                    {
                        resString = resString.Trim();
                    }

                    fw.WriteLine(resString);
                }
            }
            catch
            {
                fungeContext.CurrentThreadDeltaVector = fungeContext.CurrentThreadDeltaVector.Reflect();
            }

            return(null);
        }
Example #5
0
 public bool IsOutOfBounds(DeltaVector dv)
 {
     return(!(dv.Y <= _maxY && dv.Y >= _minY && dv.X >= _minX && dv.X <= _maxX && dv.Z <= _maxZ &&
              dv.Z >= _minZ));
 }
Example #6
0
        public string RealExecute(FungeContext fungeContext)
        {
            var filename = fungeContext.PopString();
            var flag     = fungeContext.GetTopStackTopValues(1)[0];
            var vec      = new DeltaVector(fungeContext.GetTopStackTopValues(fungeContext.Dimension).Reverse().ToArray());

            if (!File.Exists(filename))
            {
                fungeContext.CurrentThreadDeltaVector = fungeContext.CurrentThreadDeltaVector.Reflect();
                return(null);
            }

            var y    = 0;
            int maxX = 0;

            if ((flag & 1) == 1)
            {
                using var fs     = File.OpenRead(filename);
                using var reader = new BinaryReader(fs);
                var target = vec + fungeContext.CurrentThread.StorageOffset;
                while (reader.BaseStream.Position != reader.BaseStream.Length)
                {
                    var c = reader.Read();
                    fungeContext.ModifyCell(target, c);
                    target.X += 1;
                }

                maxX = (int)(reader.BaseStream.Length + fungeContext.CurrentThread.StorageOffset.X);
            }
            else
            {
                foreach (var line in File.ReadLines(filename))
                {
                    for (var x = 0; x < line.Length; x++)
                    {
                        if (line[x] == ' ' || line[x] == '\f')
                        {
                            continue;
                        }
                        fungeContext.ModifyCell(
                            new DeltaVector(x, y, 0) + vec + fungeContext.CurrentThread.StorageOffset, line[x]);
                    }

                    if (line.Length > maxX)
                    {
                        maxX = line.Length;
                    }

                    y++;
                }
            }


            fungeContext.PushToTopStack(maxX);
            fungeContext.PushToTopStack(y);
            foreach (var c in vec.Coords(fungeContext.Dimension))
            {
                fungeContext.PushToTopStack(c);
            }

            return(null);
        }
Example #7
0
 public bool IsOutOfBounds(DeltaVector currentPosition)
 {
     return(currentPosition.X < 0 || currentPosition.X >= 80 || currentPosition.Y < 0 || currentPosition.Y >= 25);
 }
Example #8
0
 public int GetValue(DeltaVector dv)
 {
     return(IsOutOfBounds(dv) ? 0 : _field[dv.Y][dv.X]);
 }
Example #9
0
 public void ModifyCell(DeltaVector target, int value)
 {
     _field[target.Y][target.X] = (char)value;
 }
Example #10
0
 public bool IsOutOfBounds(DeltaVector dv)
 {
     return(dv.X < 0 || dv.X >= _field.Count);
 }
Example #11
0
 public int GetValue(DeltaVector dv) => _field[dv.X];