to wireworld :filename :speed ;speed in n times per second, approximated Make "speed 60/:speed wireworldread :filename Make "bufferfield (mdarray (list :height :width) 0) for [i 0 :height-1] [for [j 0 :width-1] [mdsetitem (list :i :j) :bufferfield mditem (list :i :j) :field]] pu ht Make "gen 0 while ["true] [ ;The user will have to halt it :P ;clean seth 90 setxy 0 20 ;label :gen sety 0 for [i 0 :height-1] [for [j 0 :width-1] [mdsetitem (list :i :j) :field mditem (list :i :j) :bufferfield]] for [i 0 :height-1] [ for [j 0 :width-1] [ if (mditem (list :i :j) :field)=[] [setpixel [255 255 255]] ;blank if (mditem (list :i :j) :field)=1 [setpixel [0 0 0] if wn :j :i 2 [mdsetitem (list :i :j) :bufferfield 2]] ;wire if (mditem (list :i :j) :field)=2 [setpixel [0 0 255] mdsetitem (list :i :j) :bufferfield 3] ;head if (mditem (list :i :j) :field)=3 [setpixel [255 0 0] mdsetitem (list :i :j) :bufferfield 1] ;tail setx xcor+1 ] setxy 0 ycor-1 ] Make "gen :gen+1 wait :speed ] end to wireworldread :filename local [line] openread :filename setread :filename Make "width 0 Make "height 0 ; first pass, take dimensions while [not eofp] [ Make "line readword if (count :line)>:width [Make "width count :line] Make "height :height+1 ] ; second pass, load data setreadpos 0 Make "field (mdarray (list :height :width) 0) for [i 0 :height-1] [ Make "line readword foreach :line [ if ?=char 32 [mdsetitem (list :i #-1) :field []] if ?=". [mdsetitem (list :i #-1) :field 1] if ?="H [mdsetitem (list :i #-1) :field 2] if ?="t [mdsetitem (list :i #-1) :field 3] ] ] setread [] close :filename end to wn :x :y :thing ;WireNeighbourhood Make "neighbours 0 if (mditem (list :y-1 :x) :field)=:thing [Make "neighbours :neighbours+1] if (mditem (list :y-1 :x+1) :field)=:thing [Make "neighbours :neighbours+1] if (mditem (list :y :x+1) :field)=:thing [Make "neighbours :neighbours+1] if (mditem (list :y+1 :x+1) :field)=:thing [Make "neighbours :neighbours+1] if (mditem (list :y+1 :x) :field)=:thing [Make "neighbours :neighbours+1] if (mditem (list :y+1 :x-1) :field)=:thing [Make "neighbours :neighbours+1] if (mditem (list :y :x-1) :field)=:thing [Make "neighbours :neighbours+1] if (mditem (list :y-1 :x-1) :field)=:thing [Make "neighbours :neighbours+1] ifelse OR :neighbours=1 :neighbours=2 [op "true] [op "false] end