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); }
public int GetValue(DeltaVector dv) { if (_field.TryGetValue(dv.Y, out var xcoords)) { if (xcoords.TryGetValue(dv.X, out var val)) { return(val); } } return(' '); }
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(); }
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); }
public bool IsOutOfBounds(DeltaVector dv) { return(!(dv.Y <= _maxY && dv.Y >= _minY && dv.X >= _minX && dv.X <= _maxX && dv.Z <= _maxZ && dv.Z >= _minZ)); }
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); }
public bool IsOutOfBounds(DeltaVector currentPosition) { return(currentPosition.X < 0 || currentPosition.X >= 80 || currentPosition.Y < 0 || currentPosition.Y >= 25); }
public int GetValue(DeltaVector dv) { return(IsOutOfBounds(dv) ? 0 : _field[dv.Y][dv.X]); }
public void ModifyCell(DeltaVector target, int value) { _field[target.Y][target.X] = (char)value; }
public bool IsOutOfBounds(DeltaVector dv) { return(dv.X < 0 || dv.X >= _field.Count); }
public int GetValue(DeltaVector dv) => _field[dv.X];