Author Topic: Competition  (Read 35309 times)

0 Members and 1 Guest are viewing this topic.

Offline Pete

  • Forum Resident
  • Posts: 2361
  • Cuz I sez so, varmint!
    • View Profile
Re: Competition
« Reply #105 on: October 17, 2021, 12:58:49 am »
I helped shed light on the difference with how the SCREEN function cannot function as perfectly in graphics screens ass it does in screen 0. The ability to store the color and character in a graphics project requires mapping with a matrix. I made a graphics GUI using that approach. Maybe someday I'll see why it displayed correctly in the SDL version, but had a slight misalignment problem when we switched to GL.

So for this overlay idea, I took Steve's code and modified it a bit, to get a little bit closer to what I'm thinking about as a use.

Code: QB64: [Select]
  1. Screen0 = _NEWIMAGE(80, 25, 0)
  2. SCREEN Screen0
  3.  
  4. 'font = _LOADFONT("courbd.ttf", 48, "monospace")
  5. 'IF font <= 0 THEN font = 16
  6. '_FONT font
  7.  
  8. 'This is going to be the screen I use as an overlay.
  9.  
  10. COLOR 0, 7
  11. FOR x = 1 TO 25
  12.     LOCATE x, 1: PRINT STRING$(80, 176);
  13.  
  14. 'Now the above is just Pete's background in Screen0.
  15. 'Now I'm going to create the Overly
  16.  
  17. _DEST Overlay
  18. COLOR MidnightBlue, 0
  19. 'IF font <= 0 THEN font = 16
  20. '_FONT font
  21. text$ = "This is text wrote over the background"
  22. _PRINTSTRING ((_WIDTH - _PRINTWIDTH(text$)) \ 2, _HEIGHT \ 2), text$
  23.  
  24. _DEST 0 'reset our dest back to the normal screen 0 screen
  25.  
  26. 'Turn our software overlay into a hardware image
  27. Overlay_Hardware = _COPYIMAGE(Overlay, 33)
  28.  
  29. 'And then my impressive main program to toggle between showing and not
  30. 'showing the overlay.
  31.     k = _KEYHIT
  32.     IF k = 32 THEN Show_Overlay = NOT Show_Overlay
  33.     IF Show_Overlay THEN _PUTIMAGE (0, 0), Overlay_Hardware
  34.     _DISPLAY
  35.     _LIMIT 30
  36. LOOP UNTIL k = 27
  37.  
  38.  

That's pretty cool how the overlay effect, using hardware imaging, does not disturb the screen 0 screen contents.

Pete
Want to learn how to write code on cave walls? https://www.tapatalk.com/groups/qbasic/qbasic-f1/

Offline bplus

  • Global Moderator
  • Forum Resident
  • Posts: 8053
  • b = b + ...
    • View Profile
Re: Competition
« Reply #106 on: October 17, 2021, 08:58:13 am »
@Pete 

I found the stuff I was talking about and it turns out graphics screen using _PrintMode. But I think this game of yours might have you ready to grad-e-ate to graphics :) screen 12 might be a gentle transition. If you need to know what characters you have printed on screen you can keep am array to track. If you need to know if a chr$(32) or a chr$(255) then I have to ask why? ;-))

Offline Pete

  • Forum Resident
  • Posts: 2361
  • Cuz I sez so, varmint!
    • View Profile
Re: Competition
« Reply #107 on: October 17, 2021, 11:53:06 am »
LOL @ "grad-e-ate" You used the term improperly, though. Every varmint knows ya sez, "Ain't ya grad-e-ate your breakfast!"

 - Sam
Want to learn how to write code on cave walls? https://www.tapatalk.com/groups/qbasic/qbasic-f1/

Offline jack

  • Seasoned Forum Regular
  • Posts: 408
    • View Profile
Re: Competition
« Reply #108 on: October 19, 2021, 12:28:06 pm »
Pete, there's a problem in line 350, illegal function call
the error happened in second wave about half way trough

Offline Pete

  • Forum Resident
  • Posts: 2361
  • Cuz I sez so, varmint!
    • View Profile
Re: Competition
« Reply #109 on: October 19, 2021, 12:51:44 pm »
That's the part where the aliens have landed.

        FOR i = j TO 1 STEP -1
            LOCATE , ialiencol + INSTR(a(i), CHR$(79)) - 2
            PRINT LTRIM$(RTRIM$(a(i)));
            LOCATE CSRLIN - 2
        NEXT

The error line:  LOCATE , ialiencol + INSTR(a(i), CHR$(79)) - 2

This may be some instance where the variable ialiencol = 2 and the INSTR() function is not detecting CHR$(79) in the array. That would make the equation 2 + 0 - 2, leaving a zero in the LOCATE statement, and thus the error. I'll have to run a few tests.

Can you recall how many alien ships (bats) were in the bottom row of the screen when it errored out?

Thanks,

Pete
Want to learn how to write code on cave walls? https://www.tapatalk.com/groups/qbasic/qbasic-f1/

Offline jack

  • Seasoned Forum Regular
  • Posts: 408
    • View Profile
Re: Competition
« Reply #110 on: October 19, 2021, 01:01:01 pm »
no, mayby less than half

Offline Pete

  • Forum Resident
  • Posts: 2361
  • Cuz I sez so, varmint!
    • View Profile
Re: Competition
« Reply #111 on: October 20, 2021, 03:37:29 am »
Okay, fixed the bug Jack found and finished switching out the hardware overlay scoreboard.

https://www.qb64.org/forum/index.php?topic=4245.msg137017#msg137017

Pete
Want to learn how to write code on cave walls? https://www.tapatalk.com/groups/qbasic/qbasic-f1/

Offline bplus

  • Global Moderator
  • Forum Resident
  • Posts: 8053
  • b = b + ...
    • View Profile
Re: Competition
« Reply #112 on: October 20, 2021, 11:51:15 am »
Hi @Pete

Assuming reply #102 in this thread is latest, I tested last night and this morning and am having a very hard time getting initials correct. It seems you have to hold alt key down to move letters at all and I am always going past letter stop by one and am getting farther and farther right having to backspace a bunch. At one point I swear the backspace never appears! Anyway result is always wrong or quit. Shouldn't it be press alt key one to move up letter one time? I press once and no move, again once and no move, I have to hold down for it to cycle letters. Just some feed back, luv everything else, the look of the High Score Dialog is great!

Offline Pete

  • Forum Resident
  • Posts: 2361
  • Cuz I sez so, varmint!
    • View Profile
Re: Competition
« Reply #113 on: October 20, 2021, 03:19:50 pm »
That's a really valid criticism of the enter your initials part. Okay, let's scrap that crap, and how about giving this a go...

Input routine demo only. Not the game. Tap the alt key to advance initials. Leave it unpressed for 2 seconds, and the initial showing will be automatically input. If you make a mistake, hold the Alt key down for a short time, and you can redo from start. It finishes when the last initial is input, and starts flashing your initials for 2.5 seconds. Press the Alt key anytime while initials flash to redo from start; otherwise, just wait until they stop flashing, and your initials are entered.

Oh, and for Mark, it will rerun after ending...
 
Code: QB64: [Select]
  1. DIM SHARED rank: rank = 1
  2.  
  3. DIM SHARED intro%: intro% = -1
  4.  
  5. skip_intro:
  6. DIM SHARED Overlay, font
  7. DIM SHARED lmargin%, rmargin%, topmargin%, screenwidth%, level, ibk, ileadingrow
  8. DIM SHARED irow, icol, inextrnd, imaxalienmissiles, alienforce%, ileadingmax, imaxalienforce, ihits, score$
  9.  
  10. SCREEN 0, 0, 0, 0
  11. swidth = _WIDTH
  12.  
  13. score$ = "000000"
  14. imaxalienforce = 6
  15. imaxalienmissiles = 3
  16. lmargin% = 2
  17. rmargin% = 79
  18. topmargin% = 3
  19. ialiencolstat = 6
  20. iwin = 3 ' 3 Levels.
  21. screenwidth% = rmargin% - lmargin% + 1
  22. ibk = 0 ' Background color
  23.  
  24. DIM SHARED a(imaxalienforce) AS STRING * 68
  25.  
  26. 'fontpath$ = ENVIRON$("SYSTEMROOT") + "\fonts\lucon.ttf" 'Find Windows Folder Path.
  27. 'font& = _LOADFONT(fontpath$, 25, "monospace")
  28. '_FONT font&
  29.  
  30. score$ = "069000": CALL displayhighscores: RUN
  31.  
  32. SUB displayhighscores
  33.  
  34.     COLOR 0, 3
  35.     LOCATE 25, 68: PRINT "Score "; score$;
  36.  
  37.     DIM hs AS STRING * 25
  38.     REDIM highscore$(6), hsdata$(6)
  39.     DO
  40.         ''' IF _FILEEXISTS("ascii-invaders-high-score.dat") THEN
  41.         ''' OPEN "ascii-invaders-high-score.dat" FOR RANDOM AS #1 LEN = 25
  42.         ''' FOR i = 1 TO 5
  43.         ''' GET #1, i, hs
  44.         ''' highscore$(i) = MID$(hs, 10, 6): hsdata$(i) = hs
  45.         ''' NEXT
  46.         ''' CLOSE #1
  47.         ''' ELSE
  48.         FOR i = 1 TO 5
  49.             hsdata$(i) = SPACE$(25)
  50.         NEXT
  51.         ''' END IF
  52.  
  53.         IF VAL(score$) > VAL(highscore$(5)) THEN
  54.  
  55.             IF VAL(score$) > VAL(highscore$(1)) THEN
  56.                 msg$ = " HIGH SCORE / Enter Your Initials! "
  57.             ELSE
  58.                 msg$ = " Top 5 Score. Enter Your Initials! "
  59.             END IF
  60.  
  61.             GOSUB hiscore
  62.  
  63.             a = 14
  64.             OUT &H3C8, 0
  65.             OUT &H3C9, 20 - a
  66.             OUT &H3C9, 20 - a
  67.             OUT &H3C9, 20 - a
  68.  
  69.             OUT &H3C8, 8
  70.             OUT &H3C9, 30 - a
  71.             OUT &H3C9, 30 - a
  72.             OUT &H3C9, 30 - a
  73.  
  74.             OUT &H3C8, 7
  75.             OUT &H3C9, 30 - a
  76.             OUT &H3C9, 30 - a
  77.             OUT &H3C9, 30 - a
  78.  
  79.             OUT &H3C8, 3
  80.             OUT &H3C9, 30 - a
  81.             OUT &H3C9, 30 - a
  82.             OUT &H3C9, 30 - a
  83.  
  84.             GOSUB hardware_overlay
  85.  
  86.             _FONT 16
  87.  
  88.             COLOR White, 0
  89.             t$ = msg$
  90.             PSLC 4.6, 41 - LEN(msg$) \ 2, t$
  91.  
  92.             font = _LOADFONT("lucon.ttf", 20, "monospace")
  93.             IF font <= 0 THEN font = 16
  94.             _FONT font
  95.  
  96.             DEF SEG = 0
  97.             delay = .4
  98.             lscr = 19
  99.             z3 = TIMER
  100.             DO
  101.                 initials$ = "": i = 0: nxt = 0
  102.                 COLOR , _RGB(24, 24, 24): t$ = "   " ' Blank initials for redo. Okay to blank at start.
  103.                 PSL 5 + rank * 2, lscr, t$
  104.                 _DISPLAY
  105.                 DO
  106.                     _LIMIT 60
  107.                     IF ABS(z3 - TIMER) > .3 AND kflag > -2 THEN
  108.                         underline 5 + rank * 2, lscr + nxt, 0
  109.                         _DISPLAY
  110.                         z3 = TIMER
  111.                     END IF
  112.  
  113.                     SELECT CASE kflag
  114.                         CASE 0
  115.                             IF ABS(z1 - TIMER) > 1.5 AND i AND nxt < 3 THEN
  116.                                 SOUND 1500, 1
  117.                                 underline 5 + rank * 2, lscr + nxt, -1: uflag = 0
  118.                                 _DISPLAY
  119.                                 initials$ = initials$ + CHR$(64 + i)
  120.                                 nxt = nxt + 1 ' Next initial
  121.                                 i = 0 ' Reset alphabet.
  122.                                 z1 = TIMER
  123.                                 IF nxt = 3 THEN
  124.                                     kflag = -2 ' All 3 initials have been input.
  125.                                     underline 5 + rank * 2, lscr + nxt, -1: uflag = 0
  126.                                     _DISPLAY
  127.                                 END IF
  128.                             END IF
  129.  
  130.                             IF PEEK(1047) MOD 16 = 7 OR PEEK(1047) MOD 16 = 8 THEN
  131.                                 kflag = -1 ' Alt key pressed.
  132.                                 z1 = TIMER: z2 = TIMER
  133.                                 i = i + 1: IF i > 26 THEN i = 1
  134.                                 COLOR , _RGB(24, 24, 24): t$ = " "
  135.                                 PSL 5 + rank * 2, lscr + nxt, t$
  136.                                 COLOR DarkOrange: t$ = CHR$(64 + i)
  137.                                 SOUND 1000, .1
  138.                                 PSL 5 + rank * 2, lscr + nxt, t$
  139.                                 underline 5 + rank * 2, lscr + nxt, 0
  140.                                 _DISPLAY
  141.                             END IF
  142.                         CASE -1
  143.                             IF ABS(z2 - TIMER) > 2 THEN ' Key down long enough to indicate redo input.
  144.                                 IF nxt > 0 THEN ' Redo last initial input.
  145.                                     SOUND 300, .5
  146.                                     FOR nxt = 0 TO 3
  147.                                         underline 5 + rank * 2, lscr + nxt, -1: uflag = 0
  148.                                     NEXT
  149.                                     nxt = 0: i = 0
  150.                                     initials$ = ""
  151.                                     COLOR , _RGB(24, 24, 24): t$ = "   "
  152.                                     PSL 5 + rank * 2, lscr, t$
  153.                                     _DISPLAY
  154.                                     z1 = TIMER ' Reset enter timer.
  155.                                 ELSE
  156.                                     SOUND 300, .5
  157.                                     i = 0
  158.                                     COLOR , _RGB(24, 24, 24): t$ = " "
  159.                                     PSL 5 + rank * 2, lscr, t$
  160.                                     _DISPLAY
  161.                                     z1 = TIMER ' Reset enter timer.
  162.                                 END IF
  163.                                 z2 = TIMER
  164.                             END IF
  165.  
  166.                             IF PEEK(1047) MOD 16 <> 7 AND PEEK(1047) MOD 16 <> 8 THEN ' Alt key was released.
  167.                                 kflag = 0 ' Alt key up
  168.                                 z1 = TIMER
  169.                             END IF
  170.                         CASE -2 ' Finished. Initials will flash until confirmed by 2-second timer.
  171.                             z1 = TIMER: z2 = TIMER
  172.                             j = 0
  173.                             DO
  174.                                 IF ABS(z1 - TIMER) > .3 THEN j = -j - 1: z1 = TIMER
  175.                                 IF j THEN
  176.                                     COLOR DarkOrange: t$ = initials$
  177.                                     PSL 5 + rank * 2, lscr, t$
  178.                                     _DISPLAY
  179.                                 ELSE
  180.                                     COLOR _RGB(24, 24, 24): t$ = initials$
  181.                                     PSL 5 + rank * 2, lscr, t$
  182.                                     _DISPLAY
  183.                                 END IF
  184.  
  185.                                 IF ABS(z2 - TIMER) > 2.5 AND j THEN
  186.                                     kflag = -3
  187.                                     EXIT DO
  188.                                 END IF
  189.  
  190.                                 IF PEEK(1047) MOD 16 = 7 OR PEEK(1047) MOD 16 = 8 THEN
  191.                                     BEEP
  192.                                     kflag = -4
  193.                                     EXIT DO
  194.                                 END IF
  195.                             LOOP
  196.                         CASE -3
  197.                             _DELAY 1
  198.                             l$ = "8"
  199.                             n$ = "n24": PLAY "L" + l$ + n$
  200.                             n$ = "n28": PLAY "L" + l$ + n$
  201.                             n$ = "n28": PLAY "L" + l$ + n$
  202.                             l$ = "7"
  203.                             n$ = "n31": PLAY "L" + l$ + n$
  204.                             l$ = "9"
  205.                             n$ = "n28": PLAY "L" + l$ + n$
  206.                             l$ = "3"
  207.                             n$ = "n31": PLAY "L" + l$ + n$
  208.                             kflag = 1
  209.                             _DELAY 1: EXIT DO
  210.                         CASE -4
  211.                             kflag = 0 ' Repeat enter initials
  212.                             nxt = 0
  213.                             i = 0
  214.                             EXIT DO
  215.                     END SELECT
  216.                 LOOP
  217.                 IF kflag > 0 THEN kflag = 0: EXIT DO ' Exit routine.
  218.             LOOP
  219.             DEF SEG
  220.  
  221.             hsname$ = initials$
  222.  
  223.             MID$(hsdata$(rank), 5, 3) = hsname$ + SPACE$(3 - LEN(hsname$))
  224.             '''OPEN "ascii-invaders-high-score.dat" FOR RANDOM AS #1 LEN = 25
  225.             '''FOR i = 1 TO 5
  226.             ''' hs = hsdata$(i)
  227.             '''IF LEFT$(hs, 1) = "" THEN MID$(hs, 1, 2) = "0" + LTRIM$(STR$(i))
  228.             '''PUT #1, i, hs
  229.             '''NEXT
  230.             '''CLOSE #1
  231.  
  232.             _DELAY 1
  233.             _DISPLAY ' Remove scoreboard.
  234.             _DELAY 1
  235.             _FREEIMAGE Overlay
  236.             _FONT 16 'select inbuilt 8x16 default font
  237.             _FREEFONT font
  238.  
  239.             _DEST 0 'Reset dest back to the normal screen 0.
  240.  
  241.             _AUTODISPLAY
  242.             COLOR 6, 0
  243.             msg$ = SPACE$(40)
  244.             LOCATE 4, 41 - LEN(msg$) \ 2
  245.             PRINT msg$;
  246.             PALETTE
  247.             _DELAY 1
  248.  
  249.             EXIT DO
  250.         ELSE
  251.             EXIT DO ' Not in the top 5 highest scores so exit sub.
  252.         END IF
  253.     LOOP
  254.     EXIT SUB
  255.  
  256.     hardware_overlay:
  257.     Overlay = _NEWIMAGE(_WIDTH * _FONTWIDTH, _HEIGHT * _FONTHEIGHT, 32)
  258.  
  259.     _DEST Overlay
  260.     _DISPLAY ' Turn autodisplay off.
  261.  
  262.     font = _LOADFONT("lucon.ttf", 20, "monospace")
  263.     IF font <= 0 THEN font = 16
  264.     _FONT font
  265.  
  266.     bxy% = 3
  267.     bxx% = 13
  268.     COLOR DarkOrange, 0
  269.     t$ = " " + CHR$(218) + STRING$(27, CHR$(196)) + CHR$(191) + " "
  270.     PSL bxy%, bxx% - 1, t$
  271.     FOR i = 1 TO 12
  272.         t$ = " " + CHR$(179) + STRING$(27, CHR$(32)) + CHR$(179) + " "
  273.         PSL bxy% + i, bxx% - 1, t$
  274.     NEXT
  275.     t$ = " " + CHR$(192) + STRING$(27, CHR$(196)) + CHR$(217) + " "
  276.     PSL bxy% + i, bxx% - 1, t$
  277.  
  278.     bxy% = 4
  279.     COLOR Black, DarkOrange
  280.     t$ = "    NAME   SCORE    DATE   "
  281.     PSL bxy% + 1, bxx% + 1, t$
  282.  
  283.     COLOR DarkOrange, 0
  284.     FOR i = 1 TO 5
  285.         t$ = hsdata$(i)
  286.         PSL bxy% + 1 + i * 2, bxx% + 2, t$
  287.     NEXT
  288.  
  289.     _DISPLAY
  290.  
  291.     RETURN
  292.  
  293.     hiscore:
  294.     FOR i = 1 TO 5
  295.         IF VAL(score$) > VAL(highscore$(i)) THEN rank = i: EXIT FOR
  296.     NEXT
  297.  
  298.     hsdata$(6) = SPACE$(25)
  299.     MID$(hsdata$(6), 10, 6) = score$
  300.     MID$(hsdata$(6), 18, 8) = MID$(DATE$, 1, 6) + MID$(DATE$, 9, 2)
  301.     highscore$(6) = score$
  302.     FOR i = 1 TO 6
  303.         FOR j = 1 TO 6
  304.             IF i <> j THEN
  305.                 IF VAL(highscore$(i)) > VAL(highscore$(j)) THEN
  306.                     SWAP highscore$(i), highscore$(j)
  307.                     SWAP hsdata$(i), hsdata$(j)
  308.                 END IF
  309.             END IF
  310.         NEXT
  311.     NEXT
  312.     FOR i = 1 TO 5
  313.         MID$(hsdata$(i), 1, 2) = "0" + LTRIM$(STR$(i))
  314.     NEXT
  315.  
  316.     RETURN
  317.  
  318.  
  319. SUB PSLC (y, x, t$)
  320.     _PRINTSTRING ((x - 1) * 8, (y - 1) * 16), t$
  321.  
  322. SUB PSL (y, x, t$)
  323.     _PRINTSTRING ((x - 1) * _FONTWIDTH, (y - 1) * _FONTHEIGHT), t$
  324.     Overlay_Hardware = _COPYIMAGE(Overlay, 33)
  325.     _PUTIMAGE (0, 0), Overlay_Hardware
  326.  
  327. SUB underline (y, x, uflag)
  328.     STATIC ucnt
  329.     ucnt = -ucnt - 1
  330.     IF ucnt OR uflag THEN
  331.         LINE ((x - 1) * _FONTWIDTH, y * _FONTHEIGHT)-((x - 1) * _FONTWIDTH + 12, y * _FONTHEIGHT), _RGB(24, 24, 24), BF
  332.     ELSE
  333.         LINE ((x - 1) * _FONTWIDTH, y * _FONTHEIGHT)-((x - 1) * _FONTWIDTH + 12, y * _FONTHEIGHT), DarkOrange, BF
  334.     END IF
  335.  
  336.     Overlay_Hardware = _COPYIMAGE(Overlay, 33)
  337.     _PUTIMAGE (0, 0), Overlay_Hardware

Pete
« Last Edit: October 20, 2021, 09:00:33 pm by Pete »
Want to learn how to write code on cave walls? https://www.tapatalk.com/groups/qbasic/qbasic-f1/

Offline bplus

  • Global Moderator
  • Forum Resident
  • Posts: 8053
  • b = b + ...
    • View Profile
Re: Competition
« Reply #114 on: October 20, 2021, 04:42:18 pm »
OK Pete what did you edit? :)

I tested before edit and was going to request you cycle back through capital letters if missed on first run through, you are or were cycling through all of ASCII yikes!

But I was able to get my initials a couple of times if I was careful not to accidently go past the letter to wait on, I would say much improved but more tweaks ahead.

Also I put the call to sub in loop and it never looped around again and again for practice, just one run in sub and it quits.

Offline Pete

  • Forum Resident
  • Posts: 2361
  • Cuz I sez so, varmint!
    • View Profile
Re: Competition
« Reply #115 on: October 20, 2021, 05:01:56 pm »
Yeah, I noticed that loop situation and edited it, along with a couple of other small tweaks. I'm thinking of having it flash the initials once the last one is input, and if the user doesn't engage the Alt key while flashing, it finishes. If the user does engage the Alt key, it does a redo.

Pete
Want to learn how to write code on cave walls? https://www.tapatalk.com/groups/qbasic/qbasic-f1/

Offline Pete

  • Forum Resident
  • Posts: 2361
  • Cuz I sez so, varmint!
    • View Profile
Re: Competition
« Reply #116 on: October 20, 2021, 06:26:45 pm »
Okay, see newly edited and revised version with flashing 3-initials at end of input so user can press Alt to redo.

Pete
Want to learn how to write code on cave walls? https://www.tapatalk.com/groups/qbasic/qbasic-f1/

Offline bplus

  • Global Moderator
  • Forum Resident
  • Posts: 8053
  • b = b + ...
    • View Profile
Re: Competition
« Reply #117 on: October 20, 2021, 08:53:33 pm »
Yes that's working for me, just need to remember if it's flashing and correct to leave it alone. Good by me.

Offline Pete

  • Forum Resident
  • Posts: 2361
  • Cuz I sez so, varmint!
    • View Profile
Re: Competition
« Reply #118 on: October 20, 2021, 09:03:21 pm »
I added one more small tweak, the ability to redo the first initial if you go past it.

Yes, this one-button challenge is certainly doable, but waiting as input instead of action for input is a bit hard to get used to at first.

Thanks for taking it for a test run!

Pete
Want to learn how to write code on cave walls? https://www.tapatalk.com/groups/qbasic/qbasic-f1/

Offline jack

  • Seasoned Forum Regular
  • Posts: 408
    • View Profile
Re: Competition
« Reply #119 on: October 20, 2021, 09:52:20 pm »
Pete, that last initials routine works really well