' Program by Charlie Veniot
' ๐ ๐ ๐ DECLARATIONS
'๐ multi-use general-purpose variables
VAR t$, this_mark$, this_marker$, this_f_color%, this_b_color%
CONST minw% = 33, maxw% = 260, minh% = 1, maxh% = 60
'๐ menu constants / variables
CONST menuh% = 3 ' number of rows in footer menu
CONST fc4bc%(0 to 15) = {15,15,15,15,15,15,15,0,15,15,0,0,0,0,0,0}
VAR color_menu_mode$ = "Foreground"
<$let menu_picks="Grid,Wdth,Hght,MovL,MovR,MovU,MovD,Xprt"
menu_picks_count={{{ [<menu_picks>split[,]count[]] }}}>
'๐ชง mi = menu item, mic = menu item count
CONST mic% = <<menu_picks_count>> ' vmic = variable menu items count
CONST mi$(1 TO mic%) = { {{{ [<menu_picks>split[,]addprefix["]addsuffix["]join[,]] }}} }
FOR i% = 1 TO mic% : _MAPSET(mi$(i%), i%) : NEXT i%
VAR f_color% = 15, b_color% = 0
'๐ mouse/touch variables
' ๐ ๐ ๐ MAIN PROGRAM
GOSUB โ130_init_program
IF t$ > "" THEN marker$ = t$ : GOSUB โ530_set_marker
IF _MOUSEZONE (0, 0, _WIDTH, [_HEIGHT-(menuh%*8)] ) _
THEN GOSUB โ520_do_marking : GOTO โฉdone
WHILE _MOUSEBUTTON : WEND
IF _MOUSEZONE(40, yMAX - 7, 64, 8 ) _
THEN GOSUB โ510_change_marker : GOTO โฉdone
IF _MOUSEZONE(0, yMAX - 15, 32, 8 ) _
THEN GOSUB ๐320_show_next_menu_item : GOTO โฉdone
IF _MOUSEZONE(0, yMAX - 7, 32, 8 ) _
THEN GOSUB ๐330_toggle_menu_pick : GOTO โฉdone
IF _MOUSEZONE(8*5, yMAX - 15, 88, 8 ) _
THEN GOSUB ๐จ640_toggle_color_menu_mode : GOTO โฉdone
IF _MOUSEZONE(8*6+80, yMAX - 15, 128, 16 ) _
THEN GOSUB ๐จ610_change_color : GOTO โฉdone
' ๐ ๐ ๐ SUBROUTINES
LET marker$ = NVL$( GetLocalStorageItem( "draw:marker" ), " " )
LET f_color% = GetLocalStorageItem( "draw:f_color" )
LET b_color% = GetLocalStorageItem( "draw:b_color" )
GOSUB ๐ฅ220_setup_screen
GOSUB ๐ฅ210_refresh_canvas
FOR iy% = 1 TO MAX(GetLocalStorageItem( "draw:height" ), maxh%)
FOR ix% = 1 TO MAX(GetLocalStorageItem( "draw:height" ), maxw% )
RemoveLocalStorageItem("draw:mark:" + iy% +"," + ix%)
GOSUB โ150_prompt_width
GOSUB โ140_prompt_height
SetLocalStorageItem( "draw:f_color", 15 )
SetLocalStorageItem( "draw:b_color", 0 )
GOSUB ๐ฅ220_setup_screen
IF GetLocalStorageItem( "draw:height" ) > "" _
THEN LET t$ = NVL$(_PROMPT("Continue previous drawing or start a new drawing?\n\n 'C' to continue previous drawing, 'N' for new drawing", "C"), "C")
THEN GOSUB โ110_continue_drawing _
ELSE GOSUB โ120_do_new_drawing
LET i% = _PROMPT( "Canvas Width (i.e. how many characters wide, minimum = " + minh% + ", maximum = " + maxh% + ")", MAX(h%/8-3, 20) )
LET i% = MIN( IFF( i% < minh%, MAX(h%/8-3, 20), i% ), maxh%)
SetLocalStorageItem( "draw:height", i% )
LET i% = _PROMPT( "Canvas Width (i.e. how many characters wide, minimum = " + minw% + ", maximum = " + maxw% + ")", MAX(w%/8,minw%) )
LET i% = MIN( IFF(i% < minw%,MAX(w%/8,minw%), i%), maxw%)
SetLocalStorageItem( "draw:width", i% )
FOR iy% = 1 TO MAX( minh% , GetLocalStorageItem( "draw:height" ) )
FOR ix% = 1 TO MAX( minw%, GetLocalStorageItem( "draw:width" ) )
LET this_mark$ = GetLocalStorageItem( "draw:mark:" + iy% + "," + ix%)
LET this_marker$ = LEFT$(this_mark$, 1) : LET this_mark$ = RIGHT$(this_mark$, LEN(this_mark$) - 2)
LET this_f_color% = VAL(LEFT$(this_mark$, INSTR(this_mark$, ",") - 1))
LET this_b_color% = VAL(RIGHT$(this_mark$, LEN(this_mark$) - INSTR(this_mark$, ",")))
COLOR this_f_color%, this_b_color%
LOCATE iy%, ix% : PRINT this_marker$;
COLOR 15, 0 : LOCATE iy%, ix% : PRINT " ";
IF grid% THEN GOSUB ๐ผ410_do_grid
LET w% = [ MAX(minw%, GetLocalStorageItem( "draw:width" ) ) ] * 8
LET h% = [ MAX(minh%, GetLocalStorageItem( "draw:height" ) ) + menuh% ] * 8
SCREEN _NEWIMAGE( w%, h%, 7 )
LINE (0,_HEIGHT-20) TO (xMAX,_HEIGHT-20) : LINE (35,_HEIGHT-20) TO (36, yMAX), ,B
LOCATE (_HEIGHT/8), 1 : PRINT STRING$(4,CHR$(240));
LOCATE (_HEIGHT/8), 6 : PRINT "Marker:"; : GOSUB โ530_set_marker
GOSUB ๐310_show_menu_pick
GOSUB ๐จ620_show_color_menu
GOSUB ๐จ630_show_color_picks
LOCATE (_HEIGHT/8)-1, 1 : PRINT menu_pick$;
๐320_show_next_menu_item:
GOSUB ๐ผ420_toggle_grid, _
IF BETWEEN(_MAPGET(menu_pick$),2,7) THEN GOSUB ๐ฅ220_setup_screen : GOSUB ๐ฅ210_refresh_canvas
๐330_toggle_menu_pick:
i% = _MAPGET(menu_pick$) + 1 : IF i% > mic% THEN i% = 1
GOSUB ๐310_show_menu_pick
FOR i% = 0 TO xMAX STEP 8
LINE (i%,0) TO (i%,(yMAX-menuh%*8)), 7
FOR i% = 7 TO (yMAX-menuh%*8) STEP 8
LINE (0,i%) TO (xMAX,i%), 7
IF grid% THEN GOSUB ๐ผ410_do_grid ELSE GOSUB ๐ผ430_undo_grid
FOR i% = 0 TO xMAX STEP 8
LINE (i%,0) TO (i%,(yMAX-menuh%*8)), 0
FOR i% = 7 TO (yMAX-menuh%*8) STEP 8
LINE (0,i%) TO (xMAX,i%), 0
GOSUB ๐ฅ210_refresh_canvas
LET marker$ = LEFT$(_PROMPT("Enter one simple keyboard character as a new marker shape.", marker$)+marker$, 1)
LET x% = _MOUSEX : LET y% = _MOUSEY
LET iy% = FIX(y%/8)+1 : LET ix% = FIX(x%/8)+1
LOCATE iy%, ix% : PRINT marker$;
IF grid% THEN GOSUB ๐ผ410_do_grid
SetLocalStorageItem( "draw:mark:" + iy% + "," + ix%, marker$ + " " + f_color% + "," + b_color%)
LOCATE (_HEIGHT/8), 13 : COLOR f_color%, b_color% : PRINT marker$;
SetLocalStorageItem( "draw:marker", marker$ )
LET f_color% = IFF(color_menu_mode$="Foreground", POINT(_MOUSEX,_MOUSEY), f_color%)
LET b_color% = IFF(color_menu_mode$="Background", POINT(_MOUSEX,_MOUSEY), b_color%)
SetLocalStorageItem( "draw:f_color", f_color% )
SetLocalStorageItem( "draw:b_color", b_color% )
GOSUB ๐จ630_show_color_picks
LOCATE (_HEIGHT/8)-1, 6 : PRINT color_menu_mode$ + ":";
๐จ630_show_color_picks:
LOCATE (_HEIGHT/8)-IFF(i% < 8, 1, 0),17+([i%-IFF(i% < 8, 0, 8)]*2) : COLOR i%, 0 : PRINT CHR$(219) + CHR$(219);
IF i% = f_color% THEN LOCATE (_HEIGHT/8)-IFF(i% < 8, 1, 0),17+([i% - IFF(i% < 8, 0, 8)]*2) : COLOR fc4bc%(i%),i% : PRINT "F";
IF i% = b_color% THEN LOCATE (_HEIGHT/8)-IFF(i% < 8, 1, 0),17+([i% - IFF(i% < 8, 0, 8)]*2)+1 : COLOR fc4bc%(i%),i% : PRINT "B";
๐จ640_toggle_color_menu_mode:
LET color_menu_mode$ = IFF(color_menu_mode$="Foreground", "Background", "Foreground")
GOSUB ๐จ620_show_color_menu
OPEN "YourDrawing.bas" FOR OUTPUT AS #1
PRINT#1, "SCREEN _NEWIMAGE( " + w% + ", " + (h%-24) + ", 7 )"
PRINT#1, SPC(2) + "READ row%, col%, marker$, f_color%, b_color%"
PRINT#1, SPC(2) + "IF marker$ <> " + CHR$(34) + "END" + CHR$(34) + " THEN _"
PRINT#1, SPC(4) + "COLOR f_color%, b_color%"
PRINT#1, SPC(4) + "LOCATE row%, col% : PRINT marker$;"
PRINT#1, "LOOP UNTIL marker$ = " + CHR$(34) + "END" + CHR$(34)
FOR iy% = 1 TO MAX( minh% , GetLocalStorageItem( "draw:height" ) )
FOR ix% = 1 TO MAX( minw%, GetLocalStorageItem( "draw:width" ) )
LET this_mark$ = GetLocalStorageItem( "draw:mark:" + iy% + "," + ix%)
LET this_marker$ = LEFT$(this_mark$, 1) : LET this_mark$ = RIGHT$(this_mark$, LEN(this_mark$) - 2)
LET this_f_color% = VAL(LEFT$(this_mark$, INSTR(this_mark$, ",") - 1))
LET this_b_color% = VAL(RIGHT$(this_mark$, LEN(this_mark$) - INSTR(this_mark$, ",")))
PRINT#1, "DATA " + iy% + ", " + ix% + ", " + CHR$(34) + this_marker$ + CHR$(34) + ", " + this_f_color% + ", " + this_b_color%
PRINT#1, "DATA -99, -99, " + CHR$(34) + "END" + CHR$(34) + ", -99, -99"
' ๐งญ๐งญ๐งญ Move Drawing
SetLocalStorageItem( "draw:mark:" + iy% + "," + ix%, GetLocalStorageItem("draw:mark:" + y% + "," + x% ) )
DEF FN_h = GetLocalStorageItem("draw:height")
DEF FN_w = GetLocalStorageItem("draw:width")
๐งญ810_MovL: FOR iy% = 1 TO FN_h : FOR ix% = 1 TO FN_w
CALL Mov_slsi(iy%,ix%+1) : NEXT ix%, iy%
๐งญ820_MovR: FOR iy% = 1 TO FN_h : FOR ix% = FN_w TO 1 STEP -1
CALL Mov_slsi(iy%,ix%-1) : NEXT ix%, iy%
๐งญ830_MovU: FOR iy% = 1 TO FN_h : FOR ix% = 1 TO FN_w
CALL Mov_slsi(iy%+1,ix%) : NEXT ix%, iy%
๐งญ840_MovD: FOR iy% = FN_h TO 1 STEP - 1 : FOR ix% = 1 TO FN_w
CALL Mov_slsi(iy%-1,ix%) : NEXT ix%, iy%