// LIFE.VDM - The Game of Life
//
// by Pauli Lindgren, 2000-11-06
//
// To use this macro:
//
// 1. Open Vedit with an empty buffer. Adjust the window size before starting
// the macro. (Tip: use font that has as square character cell as possible.)
// 2. Start the macro.
// 3. Use cursor keys to move cursor and Space to toggle cell on/off.
// 4. When the patterns are ready, hit Enter to calculate one generation,
// or R to animate next 100 generations. You can then continue to edit
// the cells if you wish.
// 5. Press Q to quit/restart.
#30 = 2 // animation speed (delay), n/10 sec
:Start:
// Create the board
Config(PG_E_SYNTAX,0,LOCAL) //Disable syntax highlighting
Buf_Empty(OK)
#3 = 2 // Line number
#9 = 0
#22 = 0 // number of generations
#10 = Win_Lines
#11 = Win_Cols
BOF
IT("Edit")
for (#1=1; #1<#10; #1++) {
Ins_Newline
IC('.', COUNT, #11)
}
BOF
Update()
Goto_Line(#10/2)
Goto_Col(#11/2)
Update()
// Read and interpret keypres
repeat(ALL) {
#1 = Get_Key("Cursor = move, [Space] = set/clear cell, [Enter] = Run one generation, R = run, Q = Quit", STATLINE)
if (#1=='q') {
break
}
#2 = Cur_Col
#21 = Cur_Line
if (#1=='C'+'U'*256) {
if(Cur_Line>2) {
Line(-1)
Goto_Col(#2)
}
}
if (#1=='C'+'D'*256) {
if(Cur_Line<#10) {
Line(1)
Goto_Col(#2)
}
}
if (#1=='C'+'L'*256) {
if(#2>1) {
Char(-1)
}
}
if (#1=='C'+'R'*256) {
if(#2<#11) {
Char(1)
}
}
if (#1==' ') {
if (Cur_Char=='.') {
IC('O',OVERWRITE)
Char(-1)
} else {
IC('.',OVERWRITE)
Char(-1)
}
}
if (#1=='r') { // R = start animating cells
#9 = 100
Statline_Message("Running...")
while (#9--) {
Call("calculate") // calculate one generation
Update()
Sleep(#30)
if (Previous_Key(0) == 'q') {
#9=0
}
}
Goto_Line(#21)
Goto_Col(#2)
}
if (#1=='R'+'T'*256) { // Return
Call("calculate") // calculate one generation
Goto_Line(#21)
Goto_Col(#2)
}
Update()
}
#1 = Get_Key("Play again (Y/N)? ", STATLINE)
if (#1=='y') {
Goto Start
}
Return
// Calculate one generation
:calculate:
BOF
Line(1)
While (At_EOF == 0) {
Search("|A",ERRBREAK)
if (#3 != Cur_Line) {
#3 = Cur_Line
if (#3==2) { #5 = #10 } else { #5 = #3-1 } // #5 = line above
if (#3==#10) { #6 = 2 } else { #6 = #3+1 } // #6 = line below
}
#4 = Cur_Col
if (#4==1) { #7 = #11 } else { #7 = #4-1 }
if (#4==#11) { #8 = 1 } else { #8 = #4+1 }
Goto_Col(#7)
IC(Cur_Char+1,OVERWRITE)
Goto_Col(#8)
IC(Cur_Char+1,OVERWRITE)
Goto_Line(#5)
Call("inc_3")
Goto_Line(#6)
Call("inc_3")
Goto_Line(#3)
Goto_Col(#4+1)
}
Goto_Line(2)
#20 = 0
do {
if ((CC=='1') || (CC=='Q') || (CC=='R')) {
IC('O',OVERWRITE)
#20++
} else {
if (CC > '!') {
IC('.',OVERWRITE)
} else {
char(1)
}
}
Search("|!.",ERRBREAK)
} While (At_EOF == 0)
#22++
BOF
Del_Block(CP,EOL_pos)
IT("Gens:")
Num_Ins(#22,NOCR)
IT(" Cells:")
Num_Ins(#20,NOCR)
IT(" ")
Return
// increment values of 3 characters in a row
:inc_3:
Goto_Col(#7)
for (#1=0; #1<3; #1++) {
IC(Cur_Char+1,OVERWRITE)
if (At_EOL) {
BOL
}
}
Return