Archived
1
0
Fork 0

Finished implementing the funge space field

This commit is contained in:
Julien Dessaux 2021-10-02 20:37:24 +02:00
commit 52be0d0d1e
11 changed files with 131 additions and 12 deletions

View file

@ -8,7 +8,7 @@ type
lx, ly: int
lines: seq[Line]
proc blank*(f: var Field, x, y: int) =
func blank*(f: var Field, x, y: int) =
if y < f.y or y >= f.y+f.ly: # outside the field
return
var l = addr f.lines[y-f.y]
@ -59,17 +59,80 @@ proc blank*(f: var Field, x, y: int) =
x2 = f.lines[i].x + f.lines[i].l
f.lx = x2-f.x
proc get*(f: Field, x, y: int): int =
func get*(f: Field, x, y: int): int =
if y >= f.y and y < f.y+f.ly:
let l = f.lines[y-f.y]
if x >= l.x and x < l.x+l.l:
return l.columns[x-l.x]
return int(' ')
proc isIn*(f: Field, x, y: int): bool =
func isIn*(f: Field, x, y: int): bool =
return x >= f.x and y >= f.y and x < f.x+f.lx and y < f.y+f.ly
proc set*(f: var Field, x, y, v: int) =
proc load*(f: var Field, filename: string): bool =
var file: File
if not open(file, filename):
return false
defer: file.close()
f.lines.add(Line())
var l = addr f.lines[0]
var trailingSpaces = 0
var data: array[255,char]
while true:
let n = file.readChars(data, 0, 255)
if n <= 0:
if f.ly == 0:
if l.l == 0: # we got en empty file!
return false
f.x = l.x
if l.l > 0:
inc f.ly
if f.lx < l.l+l.x-f.x:
f.lx = l.l+l.x-f.x
break
var i = 0
while i < n:
if data[i] == char(12):
inc i
continue
if data[i] == '\n' or data[i] == '\r':
if f.ly == 0:
if l.l == 0:
return false
f.x = l.x
inc f.ly
if f.x > l.x:
f.x = l.x
if f.lx < l.l+l.x-f.x:
f.lx = l.l+l.x-f.x
f.lines.add(Line())
l = addr f.lines[^1]
trailingSpaces = 0
if i+1 < n and data[i] == '\r' and data[i+1] == '\n':
inc i
else:
if data[i] == ' ':
if l.l == 0: # trim leading spaces
inc l.x
else:
inc trailingSpaces
else:
if trailingSpaces > 0:
let newL = l.l + trailingSpaces + 1
l.columns.setlen(newL)
for j in l.l..<newL-1:
l.columns[j] = int(' ')
l.columns[newL-1] = int(data[i])
l.l = newL
trailingSpaces = 0
else:
l.columns.add(int(data[i]))
inc l.l
inc i
f.lines = f.lines[0..<f.ly]
return true
func set*(f: var Field, x, y, v: int) =
if v == int(' '):
f.blank(x, y)
elif y >= f.y:

View file

@ -1,5 +0,0 @@
import nimfunge98/field/field
let f:Field
echo f.get(3,2)