|
Post by wwwwwww on Dec 18, 2019 19:19:38 GMT
Hello, I'm fairly experienced coding text based games in Just Basic, but I want to try my hand at creating an ASCII game (like Nethack, etc.) and have no idea how to go about it. Was wondering if anyone could start me out with how to direct a "@" symbol around in different directions inside a barriered room using the numpad? Maybe some code to just help me get started. I've never done anything graphical (GUI) or anything...only text related stuff. I just need a simple way to get started that I'm able to understand...
|
|
|
Post by cundo on Dec 18, 2019 19:37:18 GMT
|
|
ntech
Junior Member
Posts: 99
|
Post by ntech on Dec 18, 2019 21:57:22 GMT
Hey there w^7 I love Nethack. JustBasic doesn't support color in the basic mainwin (in which the print and input commands are used), but aside from that it's very possible to make ascii games. Note that input requires the user to press <Enter> after entering text. I'd store dungeon data in an 2d array, and access each of its elements in a for loop. If the x,y location is that of the player, display the "O" (for player) symbol instead of the entry in the array.
|
|
|
Post by B+ on Dec 19, 2019 0:05:18 GMT
Why the heck the Main Win starts scrolling left / right when the cursor crosses col 40 ? But here is cheap imitation of pushing the @ around on ASCII screen (make sure number lock is on and use keypad numbers for arrows): 'moving at sign in a room ' make sure your Main Window shows at least 80 columns and 25 rows under Setup>Preferences global atX, atY dim map$(80, 24) call initMap atX = 15 : atY = 7 while 1 scan cls call drawScreen K$ = INPUT$(1) select case K$ case "8" 'up if atY - 1 >= 1 then if map$(atX, atY -1) <> "w" then atY = atY - 1 end if case "6" 'right if atX + 1 <= 80 then if map$(atX + 1, atY) <> "w" then atX = atX + 1 end if case "2" 'down if atY + 1 <= 24 then if map$(atX, atY + 1) <> "w" then atY = atY + 1 end if case "4" 'left if atX - 1 >= 1 then if map$(atX - 1, atY) <> "w" then atX = atX - 1 end if end select if atX > 19 then call makeRoom 25, 10, 15, 10 call makeDoor 33, 10 call makeDoor 25, 12 call makeDoor 39, 17 call makeDoor 35, 19 end if wend
sub initMap for y = 1 to 24 for x = 1 to 80 map$(x, y) = " " next next call makeRoom 5, 5, 15, 5 call makeDoor 19, 7
end sub
sub drawScreen for y = 1 to 24 b$ = "" for x = 1 to 80 b$ = b$;map$(x, y) next locate 1, y : print b$; next locate atX, atY: print "@"; end sub
sub makeRoom x, y, w, h yy = y for xx = 0 to w - 1 map$(xx + x, yy) = "w" map$(xx + x, yy + h - 1) = "w" next xx = x for yy = 0 to h - 1 map$(xx, y + yy) = "w" map$(xx + w - 1, y + yy) = "w" next end sub
sub makeDoor x, y map$(x, y) = " " end sub
Update: Because I didn't have my MainWin Screen maximized, that's why! BTW I can improve performance on this like with the graphics screen. Update #2: oh yeah! 'moving at sign in a room ' make sure your Main Window shows at least 80 columns and 25 rows under Setup>Preferences global atX, atY dim map$(80, 24) call initMap atX = 15 : atY = 7 call drawScreen locate atX, atY : print "@" while 1 scan 'cls < this won't work ;-)) K$ = input$(1) select case K$ case "8" 'up if atY - 1 >= 1 then if map$(atX, atY -1) <> "w" then locate atX, atY : print " " atY = atY - 1 locate atX, atY : print "@" end if end if case "6" 'right if atX + 1 <= 80 then if map$(atX + 1, atY) <> "w" then locate atX, atY : print " " atX = atX + 1 locate atX, atY : print "@" end if end if case "2" 'down if atY + 1 <= 24 then if map$(atX, atY + 1) <> "w" then locate atX, atY : print " " atY = atY + 1 locate atX, atY : print "@" end if end if case "4" 'left if atX - 1 >= 1 then if map$(atX - 1, atY) <> "w" then locate atX, atY : print " " atX = atX - 1 locate atX, atY : print "@" end if end if end select if atX > 19 and rm2F = 0 then call makeRoom 25, 10, 15, 10 call makeDoor 33, 10 call makeDoor 25, 12 call makeDoor 39, 17 call makeDoor 35, 19 call drawScreen rm2F = 1 end if wend wait
sub initMap for y = 1 to 24 for x = 1 to 80 map$(x, y) = " " next next call makeRoom 5, 5, 15, 5 call makeDoor 19, 7 end sub
sub drawScreen for y = 1 to 24 b$ = "" for x = 1 to 80 b$ = b$;map$(x, y) next locate 1, y : print b$ next end sub
sub makeRoom x, y, w, h yy = y for xx = 0 to w - 1 map$(xx + x, yy) = "w" map$(xx + x, yy + h - 1) = "w" next xx = x for yy = 0 to h - 1 map$(xx, y + yy) = "w" map$(xx + w - 1, y + yy) = "w" next end sub
sub makeDoor x, y map$(x, y) = " " end sub
|
|
|
Post by B+ on Dec 19, 2019 0:27:29 GMT
And thanks to bplus whatever you can do on mainscreen, you can do bigger and bolder and in color with this ' Moving @ around in and out of rooms > Mainscreen Commands for Graphics Window.txt for JB B+ 2019-12-18
' PLUS Color!!! Plus the print is a little bigger for us older folks.
' Use: setup title$, desiredWidth, desiredHeight 'to setup a graphics window #gr
'Then use you can use these command substitutes for the graphics window: ' locate = call locateG characterColumn, characterRow ' print = call printG text$ '(strings only) ' input = call inputG prompt$, variable$ '(string variable only) ' color = call colorG fore$, back$ 'takes only string arguments ' for colors I set up function QBcolr$(colrNum) to return QB color string for numbers 0 to 15 ' cls = call clsG 'clears to last colorG fore$, back$ used ' PLUS inkee$ is a global variable you have access to use like QB inkey$
' finish your code section with a wait command
call setup "Testing move @ around on Main Window Commands for Graphic Windows", 1200, 720 '100 x 30? characters check
'moving at sign in a room ' make sure your Main Window shows at least 80 columns and 25 rows under Setup>Preferences global atX, atY dim map$(80, 24) call initMap atX = 15 : atY = 7 while 1 scan cls call drawScreen K$ = inkee$ inkee$ = "" 'let's not poll same thing over and over select case K$ case "8" 'up if atY - 1 >= 1 then if map$(atX, atY -1) <> "w" then atY = atY - 1 end if case "6" 'right if atX + 1 <= 80 then if map$(atX + 1, atY) <> "w" then atX = atX + 1 end if case "2" 'down if atY + 1 <= 24 then if map$(atX, atY + 1) <> "w" then atY = atY + 1 end if case "4" 'left if atX - 1 >= 1 then if map$(atX - 1, atY) <> "w" then atX = atX - 1 end if end select if atX > 19 then 'probably want to make this once so set a flag so don't make over and over again call makeRoom 25, 10, 15, 10 call makeDoor 33, 10 call makeDoor 25, 12 call makeDoor 39, 17 call makeDoor 35, 19 end if wend wait
sub initMap for y = 1 to 24 for x = 1 to 80 map$(x, y) = " " next next call makeRoom 5, 5, 15, 5 call makeDoor 19, 7 end sub
sub drawScreen for y = 1 to 24 b$ = "" for x = 1 to 80 b$ = b$;map$(x, y) next call locateG 1, y : call printG b$ next call locateG atX, atY: call printG "@" end sub
sub makeRoom x, y, w, h yy = y for xx = 0 to w - 1 map$(xx + x, yy) = "w" map$(xx + x, yy + h - 1) = "w" next xx = x for yy = 0 to h - 1 map$(xx, y + yy) = "w" map$(xx + w - 1, y + yy) = "w" next end sub
sub makeDoor x, y map$(x, y) = " " end sub
' Copy Paste these Procedures so you can do a graphics setup
' Use: setup title$, desiredWidth, desiredHeight 'to setup a graphics window #gr 'Then use you can use these command substitutes for the graphics window: ' locate = call locateG characterColumn, characterRow ' print = call printG text$ '(strings only) ' input = call inputG prompt$, variable$ '(string variable only) ' color = call colorG fore$, back$ 'takes only string arguments ' for colors I set up function QBcolr$(colrNum) to return QB color string for numbers 0 to 15 ' cls = call clsG 'clears to last colorG fore$, back$ used ' PLUS inkee$ is a global variable you have access to use like QB inkey$
' finish your code section with a wait command
'setup graphics window with specified title$, width and height with handle #gr, AKA h$ sub setup title$, wWidth, wHeight global xmax, ymax 'screen width and height xmax = wWidth : ymax = wHeight '<<<<<< set this as you need or from plug-in notes
global cellW, cellH 'do not mess with cellW and cellH globals for printing cellW = 12 'pixels wide for characters cellH = 24 'pixels high for characters
global maxRow, maxCol 'and then these are calculated from above globals maxCol = int(xmax / cellW) 'these control printing characters maxRow = int(ymax / cellH)
global lastC, lastR 'for LocateG (locate), printG (print a line), lp (locate and print) lastC = 1 : lastR = 1
'key events update globals with latest info global inkee$, h$
h$ = "#gr"
global wFG$, wBG$ wFG$ = "white" : wBG$ = "black"
nomainwin
WindowWidth = xmax + 8 WindowHeight = ymax + 32 UpperLeftX = (DisplayWidth-WindowWidth) / 2 UpperLeftY = (DisplayHeight-WindowHeight) / 2
open title$ for graphics_nsb_nf as #gr #gr "trapclose quit"
'fonts that don't work arial, tahoma, verdana '#gr "font arial ";cellW;" ";cellH '#gr "font dejavu_sans_mono ";cellW;" ";cellH
'fonts that work '#gr "font courier_new ";cellW;" ";cellH #gr "font consolas ";cellW;" ";cellH
'#gr "home" '< check drawing area '#gr "posxy w2 h2" '<<<<<<<<<<<<<<<<<< 'notice "Screen Drawing Check";chr$(13);"Size:" + chr$(13) + "Width (w2*2) = ";w2*2;", Height (h2*2) = ";h2*2
#gr "setfocus" #gr "when characterInput charIn" #gr "down" call colorG "white", "black" call clsG end sub
sub printG mess$ 'print (with "line feed") for graphics window startR = lastR for i = 1 to len(mess$) scan call lp lastC, lastR, mid$(mess$, i, 1) if lastR <> startR then exit for next lastC = 1 lastR = startR + 1 if lastR > maxRow then lastR = maxRow 'yuck! end sub
sub clsG 'cls for graphics window #gr "fill ";wBG$ lastC = 1 : lastR = 1 end sub
sub colorG fore$, back$ 'set color fore and back to color string names, see QBcolr$ function wFG$ = fore$ : wBG$ = back$ #gr "color ";wFG$ #gr "backcolor ";wBG$ end sub
sub locateG x, y 'locate xColumnCell, yRowCell for printing if 0 < x and x < maxCol + 1 and 0 < y and y < maxRow + 1 then lastC = x lastR = y end if end sub
sub inputG prmpt$, byref var$ 'input for a graphics screen 'prints prompt at lastC, lastR and leaves lastC = 1 lastR = pRow + 1
inkee$ = "" 'clear last key (new fix for DE5) call lp lastC, lastR, prmpt$;"{" 'this will update lastR and lastC to the starting point of input variable pRow = lastR : pCol = lastC 'save these for redrawing var call lp pCol, pRow, "}" OK$ = "ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz" OK$ = OK$+ chr$(8)+ chr$(27) + chr$(13) + "1234567890!@#$%^&*()_-+={}[]|\:;'<,>.?/" do scan if instr(OK$, inkee$) then if inkee$ = Chr$(8) then if t$ <> "" then if Len(t$)=1 then t$="" else t$=Left$(t$,Len(t$)-1) end if else if inkee$=Chr$(13) or inkee$=Chr$(27) then 'new D5, I was expecting nothing in return for my esc if inkee$ = chr$(27) then t$ = "" exit do else t$=t$;inkee$ end if end if call lp pCol, pRow, t$;"} " inkee$ = "" end if loop until done var$ = t$ lastC = 1 : lastR = pRow + 1 end sub
function QBcolr$(colrNum) select case colrNum case 0 : QBcolr$ = "black" case 1 : QBcolr$ = "darkblue" case 2 : QBcolr$ = "brown" case 3 : QBcolr$ = "darkcyan" case 4 : QBcolr$ = "darkred" case 5 : QBcolr$ = "darkpink" case 6 : QBcolr$ = "darkgreen" case 7 : QBcolr$ = "lightgray" case 8 : QBcolr$ = "darkgray" case 9 : QBcolr$ = "blue" case 10 : QBcolr$ = "green" case 11 : QBcolr$ = "cyan" case 12 : QBcolr$ = "red" case 13 : QBcolr$ = "pink" case 14 : QBcolr$ = "yellow" case 15 : QBcolr$ = "white" end select end function
function rndColor$() rndColor$ = QBcolr$( int( rnd(0) * 16) ) end function
sub lp x, y, mess$ 'locate x, y : print mess$ lp = locate and print 'if locate = x col and y row then and top left corner locates as 1, 1 c = x - 1: r = y if 0 < x and x < maxCol + 1 and 0 < y and y < maxRow + 1 then #gr "place ";c * cellW;" ";r * cellH - 4 #gr "|";mess$ lastC = x + len(mess$) if lastC > maxCol then lastC = 1 : lastR = lastR + 1 if lastR > maxRow then lastR = maxRow 'yuck! end if end sub
sub cp y,cpText$ 'cp Center Print on line y the cpText$ call lp int((maxCol - len(cpText$))/2 + 1.5), y, cpText$ lastC = 1 : lastR = y + 1 end sub
sub at xPix, yPix, char$ 'print a string at pixel x, y This pin point locating. #gr "place ";xPix;" ";yPix #gr "|";char$ end sub
sub pause mil 'tsh version has scan built-in t0 = time$("ms") while time$("ms") < t0 + mil : scan : wend end sub
sub charIn hdl$, c$ inkee$ = c$ end sub
sub quit hdl$ timer 0 close #gr end end sub
More about the setup and examples of graphics Window to run Main Window commands here: justbasiccom.proboards.com/thread/379/mainwin-code-graphics-window-color
|
|
|
Post by B+ on Dec 19, 2019 1:49:53 GMT
Here is 100% improvement on performance:
' Moving @ around > Mainscreen Commands for Graphics Window.txt for JB B+ 2019-12-18
' PLUS Color!!! Plus the print is a little bigger for us older folks.
' Use: setup title$, desiredWidth, desiredHeight 'to setup a graphics window #gr
'Then use you can use these command substitutes for the graphics window: ' locate = call locateG characterColumn, characterRow ' print = call printG text$ '(strings only) ' input = call inputG prompt$, variable$ '(string variable only) ' color = call colorG fore$, back$ 'takes only string arguments ' for colors I set up function QBcolr$(colrNum) to return QB color string for numbers 0 to 15 ' cls = call clsG 'clears to last colorG fore$, back$ used ' PLUS inkee$ is a global variable you have access to use like QB inkey$
' finish your code section with a wait command
call setup "Testing move @ around on Main Window Commands for Graphic Windows", 1200, 720 '100 x 30? characters check
'''''''''''''''''''''''''''''''''''''''''' Here is code for this program
'moving at sign in a room ' make sure your Main Window shows at least 80 columns and 25 rows under Setup>Preferences global atX, atY dim map$(80, 24) call initMap atX = 15 : atY = 7 call drawScreen call locateG atX, atY : call printG "@" while 1 scan 'cls < this won't work ;-)) K$ = inkee$ inkee$ = "" 'let's not poll same thing over and over select case K$ case "8" 'up if atY - 1 >= 1 then if map$(atX, atY -1) <> "w" then call locateG atX, atY : call printG " " atY = atY - 1 call locateG atX, atY : call printG "@" end if end if case "6" 'right if atX + 1 <= 80 then if map$(atX + 1, atY) <> "w" then call locateG atX, atY : call printG " " atX = atX + 1 call locateG atX, atY : call printG "@" end if end if case "2" 'down if atY + 1 <= 24 then if map$(atX, atY + 1) <> "w" then call locateG atX, atY : call printG " " atY = atY + 1 call locateG atX, atY : call printG "@" end if end if case "4" 'left if atX - 1 >= 1 then if map$(atX - 1, atY) <> "w" then call locateG atX, atY : call printG " " atX = atX - 1 call locateG atX, atY : call printG "@" end if end if end select if atX > 19 and rm2F = 0 then call makeRoom 25, 10, 15, 10 call makeDoor 33, 10 call makeDoor 25, 12 call makeDoor 39, 17 call makeDoor 35, 19 call drawScreen rm2F = 1 end if wend wait
sub initMap for y = 1 to 24 for x = 1 to 80 map$(x, y) = " " next next call makeRoom 5, 5, 15, 5 call makeDoor 19, 7 end sub
sub drawScreen for y = 1 to 24 b$ = "" for x = 1 to 80 b$ = b$;map$(x, y) next call locateG 1, y : call printG b$ next end sub
sub makeRoom x, y, w, h yy = y for xx = 0 to w - 1 map$(xx + x, yy) = "w" map$(xx + x, yy + h - 1) = "w" next xx = x for yy = 0 to h - 1 map$(xx, y + yy) = "w" map$(xx + w - 1, y + yy) = "w" next end sub
sub makeDoor x, y map$(x, y) = " " end sub
''''''''''''''''''''''''''''''''''' this sets up a Graphics screen to handle special MainWin like commands
' Copy Paste these Procedures so you can do a graphics setup
' Use: setup title$, desiredWidth, desiredHeight 'to setup a graphics window #gr 'Then use you can use these command substitutes for the graphics window: ' locate = call locateG characterColumn, characterRow ' print = call printG text$ '(strings only) ' input = call inputG prompt$, variable$ '(string variable only) ' color = call colorG fore$, back$ 'takes only string arguments ' for colors I set up function QBcolr$(colrNum) to return QB color string for numbers 0 to 15 ' cls = call clsG 'clears to last colorG fore$, back$ used ' PLUS inkee$ is a global variable you have access to use like QB inkey$
' finish your code section with a wait command
'setup graphics window with specified title$, width and height with handle #gr, AKA h$ sub setup title$, wWidth, wHeight global xmax, ymax 'screen width and height xmax = wWidth : ymax = wHeight '<<<<<< set this as you need or from plug-in notes
global cellW, cellH 'do not mess with cellW and cellH globals for printing cellW = 12 'pixels wide for characters cellH = 24 'pixels high for characters
global maxRow, maxCol 'and then these are calculated from above globals maxCol = int(xmax / cellW) 'these control printing characters maxRow = int(ymax / cellH)
global lastC, lastR 'for LocateG (locate), printG (print a line), lp (locate and print) lastC = 1 : lastR = 1
'key events update globals with latest info global inkee$, h$
h$ = "#gr"
global wFG$, wBG$ wFG$ = "white" : wBG$ = "black"
nomainwin
WindowWidth = xmax + 8 WindowHeight = ymax + 32 UpperLeftX = (DisplayWidth-WindowWidth) / 2 UpperLeftY = (DisplayHeight-WindowHeight) / 2
open title$ for graphics_nsb_nf as #gr #gr "trapclose quit"
'fonts that don't work arial, tahoma, verdana '#gr "font arial ";cellW;" ";cellH '#gr "font dejavu_sans_mono ";cellW;" ";cellH
'fonts that work '#gr "font courier_new ";cellW;" ";cellH #gr "font consolas ";cellW;" ";cellH
'#gr "home" '< check drawing area '#gr "posxy w2 h2" '<<<<<<<<<<<<<<<<<< 'notice "Screen Drawing Check";chr$(13);"Size:" + chr$(13) + "Width (w2*2) = ";w2*2;", Height (h2*2) = ";h2*2
#gr "setfocus" #gr "when characterInput charIn" #gr "down" call colorG "white", "black" call clsG end sub
sub printG mess$ 'print (with "line feed") for graphics window startR = lastR for i = 1 to len(mess$) scan call lp lastC, lastR, mid$(mess$, i, 1) if lastR <> startR then exit for next lastC = 1 lastR = startR + 1 if lastR > maxRow then lastR = maxRow 'yuck! end sub
sub clsG 'cls for graphics window #gr "fill ";wBG$ lastC = 1 : lastR = 1 end sub
sub colorG fore$, back$ 'set color fore and back to color string names, see QBcolr$ function wFG$ = fore$ : wBG$ = back$ #gr "color ";wFG$ #gr "backcolor ";wBG$ end sub
sub locateG x, y 'locate xColumnCell, yRowCell for printing if 0 < x and x < maxCol + 1 and 0 < y and y < maxRow + 1 then lastC = x lastR = y end if end sub
sub inputG prmpt$, byref var$ 'input for a graphics screen 'prints prompt at lastC, lastR and leaves lastC = 1 lastR = pRow + 1
inkee$ = "" 'clear last key (new fix for DE5) call lp lastC, lastR, prmpt$;"{" 'this will update lastR and lastC to the starting point of input variable pRow = lastR : pCol = lastC 'save these for redrawing var call lp pCol, pRow, "}" OK$ = "ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz" OK$ = OK$+ chr$(8)+ chr$(27) + chr$(13) + "1234567890!@#$%^&*()_-+={}[]|\:;'<,>.?/" do scan if instr(OK$, inkee$) then if inkee$ = Chr$(8) then if t$ <> "" then if Len(t$)=1 then t$="" else t$=Left$(t$,Len(t$)-1) end if else if inkee$=Chr$(13) or inkee$=Chr$(27) then 'new D5, I was expecting nothing in return for my esc if inkee$ = chr$(27) then t$ = "" exit do else t$=t$;inkee$ end if end if call lp pCol, pRow, t$;"} " inkee$ = "" end if loop until done var$ = t$ lastC = 1 : lastR = pRow + 1 end sub
function QBcolr$(colrNum) select case colrNum case 0 : QBcolr$ = "black" case 1 : QBcolr$ = "darkblue" case 2 : QBcolr$ = "brown" case 3 : QBcolr$ = "darkcyan" case 4 : QBcolr$ = "darkred" case 5 : QBcolr$ = "darkpink" case 6 : QBcolr$ = "darkgreen" case 7 : QBcolr$ = "lightgray" case 8 : QBcolr$ = "darkgray" case 9 : QBcolr$ = "blue" case 10 : QBcolr$ = "green" case 11 : QBcolr$ = "cyan" case 12 : QBcolr$ = "red" case 13 : QBcolr$ = "pink" case 14 : QBcolr$ = "yellow" case 15 : QBcolr$ = "white" end select end function
function rndColor$() rndColor$ = QBcolr$( int( rnd(0) * 16) ) end function
sub lp x, y, mess$ 'locate x, y : print mess$ lp = locate and print 'if locate = x col and y row then and top left corner locates as 1, 1 c = x - 1: r = y if 0 < x and x < maxCol + 1 and 0 < y and y < maxRow + 1 then #gr "place ";c * cellW;" ";r * cellH - 4 #gr "|";mess$ lastC = x + len(mess$) if lastC > maxCol then lastC = 1 : lastR = lastR + 1 if lastR > maxRow then lastR = maxRow 'yuck! end if end sub
sub cp y,cpText$ 'cp Center Print on line y the cpText$ call lp int((maxCol - len(cpText$))/2 + 1.5), y, cpText$ lastC = 1 : lastR = y + 1 end sub
sub at xPix, yPix, char$ 'print a string at pixel x, y This pin point locating. #gr "place ";xPix;" ";yPix #gr "|";char$ end sub
sub pause mil 'tsh version has scan built-in t0 = time$("ms") while time$("ms") < t0 + mil : scan : wend end sub
sub charIn hdl$, c$ inkee$ = c$ end sub
sub quit hdl$ timer 0 close #gr end end sub
BTW you can increase characters per row to 100, and 30 rows as setup is setup now, more if you know how setup works.
|
|
|
Post by wwwwwww on Dec 19, 2019 13:53:37 GMT
Loving this, everyone! I had a nasty headache last night so I crashed early, but I'm going to pour over everything that's been offered after work today. Thank you, and I'll let y'all know what I think.
|
|
|
Post by B+ on Dec 19, 2019 16:23:43 GMT
Hi 7w, I think you might have questions If you've had some early QB experience, you might find environment I try to setup in graphics window familiar. Basically one screen no GUI (though the whole thing is working under a GUI screen), for print you have to "call printG", locate "call locateG" BTW locateG matches JB locate with x first (col) and y 2nd (row), there is an inputG that allows variable prompt and well read notes...
|
|