-+-+-+-+-+-+-+-+ START OF PART 4 -+-+-+-+-+-+-+-+ X`09default_filespec : `5BCLASS_S`5D PACKED ARRAY `5B$l2..$u2:INTEGER`5D OF C VHAR := %IMMED 0; X`09related_filespec : `5BCLASS_S`5D PACKED ARRAY `5B$l3..$u3:INTEGER`5D OF C VHAR := %IMMED 0; X`09%IMMED `5BUNBOUND, ASYNCHRONOUS`5D PROCEDURE user_success_procedure := %I VMMED 0; X`09%IMMED `5BUNBOUND, ASYNCHRONOUS`5D PROCEDURE user_error_procedure := %IMM VED 0; X`09%IMMED `5BUNBOUND, ASYNCHRONOUS`5D PROCEDURE user_confirm_procedure := %I VMMED 0; X`09%IMMED user_specified_argument : `5BUNSAFE`5D INTEGER := %IMMED 0; X`09VAR resultant_name : `5BCLASS_S,VOLATILE`5D PACKED ARRAY `5B$l8..$u8:INTE VGER`5D OF CHAR := %IMMED 0; X`09VAR file_scan_context : `5BVOLATILE`5D UNSIGNED := %IMMED 0) : INTEGER; E VXTERNAL; X X`5BASYNCHRONOUS`5D FUNCTION smg$create_pasteboard ( X`09VAR pasteboard_id : `5BVOLATILE`5D UNSIGNED; X`09output_device : `5BCLASS_S`5D PACKED ARRAY `5B$l2..$u2:INTEGER`5D OF CHAR V := %IMMED 0; X`09VAR number_of_pasteboard_rows : `5BVOLATILE`5D INTEGER := %IMMED 0; X`09VAR number_of_pasteboard_columns : `5BVOLATILE`5D INTEGER := %IMMED 0; X`09flags : UNSIGNED := %IMMED 0; X`09VAR type_of_terminal : `5BVOLATILE`5D UNSIGNED := %IMMED 0) : INTEGER; EX VTERNAL; X X`5BASYNCHRONOUS`5D FUNCTION smg$create_virtual_keyboard ( X`09VAR keyboard_id : `5BVOLATILE`5D UNSIGNED; X`09input_device : `5BCLASS_S`5D PACKED ARRAY `5B$l2..$u2:INTEGER`5D OF CHAR V := %IMMED 0; X`09default_filespec : `5BCLASS_S`5D PACKED ARRAY `5B$l3..$u3:INTEGER`5D OF C VHAR := %IMMED 0; X`09VAR resultant_filespec : `5BCLASS_S,VOLATILE`5D PACKED ARRAY `5B$l4..$u4: VINTEGER`5D OF CHAR := %IMMED 0; X`09recall_size : $UBYTE := %IMMED 0) : INTEGER; EXTERNAL; X X`5BASYNCHRONOUS`5D FUNCTION smg$begin_pasteboard_update ( X`09pasteboard_id : UNSIGNED) : INTEGER; EXTERNAL; X`20 X X`5BASYNCHRONOUS`5D FUNCTION smg$create_virtual_display ( X`09number_of_rows : INTEGER; X`09number_of_columns : INTEGER; X`09VAR display_id : `5BVOLATILE`5D UNSIGNED; X`09display_attributes : UNSIGNED := %IMMED 0; X`09video_attributes : UNSIGNED := %IMMED 0; X`09character_set : UNSIGNED := %IMMED 0) : INTEGER; EXTERNAL; X X`5BASYNCHRONOUS`5D FUNCTION smg$delete_virtual_display ( X`09display_id : UNSIGNED) : INTEGER; EXTERNAL; X`20 X X`5BASYNCHRONOUS`5D FUNCTION smg$end_pasteboard_update ( X`09pasteboard_id : UNSIGNED) : INTEGER; EXTERNAL; X`20 X X`5BASYNCHRONOUS`5D FUNCTION smg$erase_chars ( X`09display_id : UNSIGNED; X`09number_of_characters : INTEGER; X`09start_row : INTEGER; X`09start_column : INTEGER) : INTEGER; EXTERNAL; X X`5BASYNCHRONOUS`5D FUNCTION smg$erase_display ( X`09display_id : UNSIGNED; X`09start_row : INTEGER := %IMMED 0; X`09start_column : INTEGER := %IMMED 0; X`09end_row : INTEGER := %IMMED 0; X`09end_column : INTEGER := %IMMED 0) : INTEGER; EXTERNAL; X`20 X X`5BASYNCHRONOUS`5D FUNCTION smg$label_border ( X`09display_id : UNSIGNED; X`09text : `5BCLASS_S`5D PACKED ARRAY `5B$l2..$u2:INTEGER`5D OF CHAR := %IMME VD 0; X`09position_code : UNSIGNED := %IMMED 0; X`09units : INTEGER := %IMMED 0; X`09rendition_set : UNSIGNED := %IMMED 0; X`09rendition_complement : UNSIGNED := %IMMED 0; X`09character_set : UNSIGNED := %IMMED 0) : INTEGER; EXTERNAL; X X`5BASYNCHRONOUS`5D FUNCTION smg$move_virtual_display ( X`09display_id : UNSIGNED; X`09pasteboard_id : UNSIGNED; X`09pasteboard_row : INTEGER; X`09pasteboard_column : INTEGER; X`09top_display_id : UNSIGNED := %IMMED 0) : INTEGER; EXTERNAL; X X`5BASYNCHRONOUS`5D FUNCTION smg$paste_virtual_display ( X`09display_id : UNSIGNED; X`09pasteboard_id : UNSIGNED; X`09pasteboard_row : INTEGER; X`09pasteboard_column : INTEGER; X`09top_display_id : UNSIGNED := %IMMED 0) : INTEGER; EXTERNAL; X X`5BASYNCHRONOUS`5D FUNCTION smg$put_chars ( X`09display_id : UNSIGNED; X`09text : `5BCLASS_S`5D PACKED ARRAY `5B$l2..$u2:INTEGER`5D OF CHAR; X`09start_row : INTEGER := %IMMED 0; X`09start_column : INTEGER := %IMMED 0; X`09flags : UNSIGNED := %IMMED 0; X`09rendition_set : UNSIGNED := %IMMED 0; X`09rendition_complement : UNSIGNED := %IMMED 0; X`09character_set : UNSIGNED := %IMMED 0) : INTEGER; EXTERNAL; X X`5BASYNCHRONOUS`5D FUNCTION smg$put_line ( X`09display_id : UNSIGNED; X`09text : `5BCLASS_S`5D PACKED ARRAY `5B$l2..$u2:INTEGER`5D OF CHAR; X`09line_advance : INTEGER := %IMMED 0; X`09rendition_set : UNSIGNED := %IMMED 0; X`09rendition_complement : UNSIGNED := %IMMED 0; X`09flags : UNSIGNED := %IMMED 0; X`09character_set : UNSIGNED := %IMMED 0; X`09direction : UNSIGNED := %IMMED 0) : INTEGER; EXTERNAL; X X`5BASYNCHRONOUS`5D FUNCTION smg$read_keystroke ( X`09keyboard_id : UNSIGNED; X`09VAR word_terminator_code : `5BVOLATILE`5D $UWORD; X`09prompt_string : `5BCLASS_S`5D PACKED ARRAY `5B$l3..$u3:INTEGER`5D OF CHAR V := %IMMED 0; X`09timeout : INTEGER := %IMMED 0; X`09display_id : UNSIGNED := %IMMED 0; X`09rendition_set : UNSIGNED := %IMMED 0; X`09rendition_complement : UNSIGNED := %IMMED 0) : INTEGER; EXTERNAL; X X`5BASYNCHRONOUS`5D FUNCTION smg$repaint_screen ( X`09pasteboard_id : UNSIGNED) : INTEGER; EXTERNAL; X X`5BASYNCHRONOUS`5D FUNCTION smg$repaste_virtual_display ( X`09display_id : UNSIGNED; X`09pasteboard_id : UNSIGNED; X`09pasteboard_row : INTEGER; X`09pasteboard_column : INTEGER; X`09top_display_id : UNSIGNED := %IMMED 0) : INTEGER; EXTERNAL; X X`5BASYNCHRONOUS`5D FUNCTION smg$set_cursor_abs ( X`09display_id : UNSIGNED; X`09start_row : INTEGER := %IMMED 0; X`09start_column : INTEGER := %IMMED 0) : INTEGER; EXTERNAL; X X`7Bexternal functions end`7D X X`7Bverb garbage begin`7D X X`5Basynchronous,external`5D Xfunction cli$present ( X inval: `5Bclass_s,volatile`5D packed array `5B$l1..$u1:integer`5D of V char): Xunsigned; external; X`20 X`5Basynchronous,external`5D Xfunction cli$get_value ( X inval: `5Bclass_s,volatile`5D packed array `5B$l1..$u1:integer`5D of V char; X var outval: `5Bclass_s`5D char; X var outlen: unsigned := %immed 0): Xunsigned; external; X X`7Bverb garbage end`7D X X Xfunction strint (b:string:='0'):integer; X Xvar X a : integer; X Xbegin X a := 0; X for loop := length (b) downto 1 do X if (ord(b`5Bloop`5D) > 47) and (ord(b`5Bloop`5D) < 58) then X a := a+( (ord(b`5Bloop`5D)-48) * (10**(length(b)-loop)) ); X strint := a; Xend; X Xfunction intstr (a:integer):short; `7Bgood only form numbers less than 10000 V`7D X Xvar X res : integer; X resc : short; X Xbegin X resc := ' '; X if a = 0 then X loop2 := 1 X else X loop2 := trunc (ln(a)/ln(10))+1; X X for loop := loop2 downto 1 do X begin X res := (a mod (10**loop))-(a mod (10**(loop-1))); X res := res div (10**(loop-1)); X resc`5B4-loop+1`5D := chr (48+res); X end; X intstr := resc Xend; X Xfunction center (a : vshort):vshort; X Xvar X left : integer; X right : integer; X b : vshort; X c : integer; X d : integer; X Xbegin X b := ' '; X left := 0; X right := 0; `7Bstring length`7D X repeat X left := left + 1; X until not (a`5Bleft`5D = chr(32)) or (left = 19); X left := left - 1; X if not ((left = 18) and (a`5Bleft+1`5D = chr(32))) then X begin X repeat X right := right + 1; X until not (a`5B20-right`5D = chr(32)); X right := right - 1; X c := trunc ((left+right)/2); X for d := left+1 to 19-right do X b`5Bd-left+c`5D := a`5Bd`5D; X end; X center := b; Xend; X Xprocedure verify; X Xvar X yesno : unsigned; X Xbegin X loop := 1; X smg$create_virtual_display (3,18,yesno,smg$m_border); X smg$paste_virtual_display (yesno,pasty,round((sheight)/2),round((swidth-14 V)/2)); X smg$label_border(yesno,'LOOSE CHANGES???',,,smg$m_bold); X repeat X smg$begin_pasteboard_update (pasty); X if loop = 1 then X begin X smg$put_chars (yesno,' NO! ',2,2,,smg$m_reverse); X smg$put_chars (yesno,' yes ',2,11); X end; X if loop = 2 then X begin X smg$put_chars (yesno,' NO! ',2,2); X smg$put_chars (yesno,' yes ',2,11,,smg$m_reverse); X end; X smg$end_pasteboard_update (pasty); X smg$read_keystroke (keyboard,lastkey,,,); X if lastkey = smg$k_trm_up then loop := loop-1; X if lastkey = smg$k_trm_down then loop := loop+1; X if lastkey = smg$k_trm_left then loop := loop-1; X if lastkey = smg$k_trm_right then loop := loop+1; X if loop < 1 then loop := 2; X if loop > 2 then loop := 1; X until (lastkey = smg$k_trm_ctrlm); X if loop = 1 then X NOWRITE := False X else X NOWRITE := True; X smg$delete_virtual_display (yesno); Xend; X Xprocedure writefile; X Xvar X fileout : text; X backup : varying `5B100`5D of char; X Xbegin X if AUTOSAVE then X begin X backup := filename+'bkup'; X open (fileout,backup,history:=unknown,error:=continue); X backup := filename+'bkup'; X AUTOSAVE := False; X end X else X open (fileout,filename,history:=new,error:=continue); X rewrite (fileout); X writeln (fileout,muno); X for loop := 1 to sheight do X begin X for loop2 := 1 to swidth do X if screen `5Bloop2,loop`5D then X write (fileout,'#') X else X write (fileout,' ');`20 X writeln (fileout); X end; X writeln (fileout,title`5B1`5D); X writeln (fileout,title`5B2`5D); X close (fileout); Xend; X Xprocedure readfile; X Xvar X a : varying `5B1`5D of char; X filein : text; X Xbegin X open (filein,filename,history:=unknown,error:=continue); X reset (filein); X smg$begin_pasteboard_update (pasty); X if status (filein) = 0 then X begin X readln (filein,muno); X for loop := 1 to sheight do X begin X for loop2 := 1 to swidth do X begin X read (filein,a); X if a = '#' then X begin X smg$put_chars (display,wallseg,loop,loop2); X screen `5Bloop2,loop`5D := True; X end X end; X readln (filein); X end; X readln (filein,title`5B1`5D); X readln (filein,title`5B2`5D); X close (filein); X end; X smg$end_pasteboard_update (pasty); Xend; X Xprocedure titlescreen; X Xvar X tdisp : unsigned; X Xbegin X loop2 := 1; X loop := 1; X smg$create_virtual_display(2,length(title`5B1`5D),tdisp,smg$m_border); X smg$paste_virtual_display(tdisp,pasty,(round((sheight-2)/2))+2,(round((swi Vdth-19)/2)+2),); X smg$label_border(tdisp,'TITLE',,,smg$m_bold); X smg$put_line(tdisp,title`5B1`5D,1); X smg$put_line(tdisp,title`5B2`5D,1); X smg$set_cursor_abs (tdisp,1,1); X repeat X if lastkey = smg$k_trm_ctrlm then X begin X smg$set_cursor_abs (tdisp,2,1); X loop := 1; X loop2 := loop2 + 1; X end; X smg$read_keystroke(keyboard,lastkey,,); X smg$begin_pasteboard_update (pasty); X if (lastkey > smg$k_trm_us) and (lastkey < smg$k_trm_delete) then X begin X if not (loop > length(title`5Bloop2`5D)) then title`5Bloop2,loop`5D : V= chr(lastkey); X loop := loop + 1; X if loop > length(title`5Bloop2`5D)+1 then loop := length(title`5Bloop2 V`5D)+1; X end; X if (lastkey = smg$k_trm_delete) or (lastkey = smg$k_trm_ctrlh) then X begin X if (loop-1) > 0 then title`5Bloop2,loop-1`5D := chr(32); X loop := loop - 1; X if loop < 1 then loop := 1; X end; X if (lastkey = smg$k_trm_right) then X begin X loop := loop + 1; X if loop > length(title`5Bloop2`5D)+1 then loop := length(title`5Bloop2 V`5D)+1; X end; X if (lastkey = smg$k_trm_left) then X begin X loop := loop - 1; X if loop < 1 then loop := 1; X end; X smg$put_chars (tdisp,title`5Bloop2`5D,loop2,1,smg$m_erase_to_eol); X smg$end_pasteboard_update (pasty); X smg$set_cursor_abs (tdisp,loop2,loop); X until (loop2 = 2) and (lastkey = smg$k_trm_ctrlm); X title`5B1`5D := center(title`5B1`5D); X title`5B2`5D := center(title`5B2`5D); X smg$delete_virtual_display(tdisp); Xend; X Xprocedure getlevel; X Xbegin X write (chr(27),'<',chr(27),'`5B1;1f',chr(27),'`5BJ'); X write (chr(27),'`5B9;30H use cursor keys to'); X write (chr(27),'`5B10;30Hselect level to edit'); X write (chr(27),'`5B14;30HHit Return when done'); X write (chr(27),'`5B15;30HHit Q to exit editor'); X repeat X if (lastkey = smg$k_trm_ctrll) or (lastkey = smg$k_trm_ctrlw) then X begin X write (chr(27),'<',chr(27),'`5B1;1f',chr(27),'`5BJ'); X write (chr(27),'`5B9;31Huse cursor keys to'); X write (chr(27),'`5B10;30Hselect level to edit'); X write (chr(27),'`5B14;30HHit Return when done'); X write (chr(27),'`5B15;30HHit Q to exit editor'); X end; X if (filen - 1) > 0 then X write (chr(27),'`5B11;39H',filen-1:1,' ') X else X write (chr(27),'`5B11;39H '); X write (chr(27),'`5B7m',chr(27),'`5B12;38H ',filen:1,' ',chr(27),'`5B0m ' V); X if (filen + 1) < 100 then X write (chr(27),'`5B13;39H',filen+1:1,' ') X else X write (chr(27),'`5B13;39H '); X writeln; X smg$read_keystroke(keyboard,lastkey,,); X if lastkey = smg$k_trm_up then filen := filen-1; X if lastkey = smg$k_trm_down then filen := filen+1; X if lastkey = smg$k_trm_left then filen := filen-1; X if lastkey = smg$k_trm_right then filen := filen+1; X if filen < 1 then filen := 1; X if filen > 99 then filen := 99; X until (lastkey = smg$k_trm_uppercase_q) or (lastkey = smg$k_trm_lowercase_ Vq) or (lastkey = smg$k_trm_ctrlm); X if (lastkey = smg$k_trm_uppercase_q) or (lastkey = smg$k_trm_lowercase_q) V then QUIT := True; X if filen > 9 then X filename := prefix+'level'+substr (intstr(filen),3,2)+'.txt' X else X filename := prefix+'level'+substr (intstr(filen),4,1)+'.txt'; X writeln (chr(27),'<',chr(27),'`5B1;1f',chr(27),'`5BJ'); Xend; X Xprocedure copy; X Xvar X mover : unsigned; X newx : integer; X newy : integer; X prev : unsigned; X Xbegin X smg$put_chars (stat,'Now move box to any position, ENTER when done, `5EP t Vo preview, F to cancel...',1,1);`20 X newx := leftx; X newy := lefty; X if moveb then X smg$create_virtual_display(righty-lefty+1,rightx-leftx+1,mover,smg$m_bor Vder) X else X smg$create_virtual_display(righty-lefty+1,rightx-leftx+1,mover,); X smg$paste_virtual_display(mover,pasty,2+newy,1+newx); X smg$begin_pasteboard_update (pasty); X for loop := lefty to righty do X for loop2 := leftx to rightx do X if temp `5Bloop2,loop`5D then X begin X if moveb then +-+-+-+-+-+-+-+- END OF PART 4 +-+-+-+-+-+-+-+-