Welcome, Guest
You have to register before you can post on our site.

Username/Email:
  

Password
  





Search Forums

(Advanced Search)

Forum Statistics
» Members: 326
» Latest member: hafsahomar
» Forum threads: 1,759
» Forum posts: 17,939

Full Statistics

Latest Threads
As technology rapidly evo...
Forum: Utilities
Last Post: Frankvab
Today, 06:09 AM
» Replies: 14
» Views: 27
Everybody's heard about t...
Forum: Utilities
Last Post: Frankvab
Today, 06:07 AM
» Replies: 22
» Views: 1,293
MBA Assignment Help in Du...
Forum: General Discussion
Last Post: hafsahomar
06-11-2025, 07:05 AM
» Replies: 0
» Views: 13
лучшие песни медляки слуш...
Forum: Petr
Last Post: WillieTop
06-08-2025, 02:21 AM
» Replies: 0
» Views: 29
пинк слушать онлайн беспл...
Forum: SMcNeill
Last Post: WillieTop
06-08-2025, 02:20 AM
» Replies: 0
» Views: 24
скачать музыку российскую...
Forum: madscijr
Last Post: WillieTop
06-08-2025, 02:18 AM
» Replies: 0
» Views: 23
нежная музыка mp3 скачать
Forum: Keybone
Last Post: WillieTop
06-08-2025, 02:17 AM
» Replies: 0
» Views: 24
лучшая песня слушать онла...
Forum: bplus
Last Post: WillieTop
06-08-2025, 02:16 AM
» Replies: 0
» Views: 27
пикник слушать онлайн луч...
Forum: Spriggsy
Last Post: WillieTop
06-08-2025, 02:15 AM
» Replies: 0
» Views: 23
какая сейчас популярная м...
Forum: RhoSigma
Last Post: WillieTop
06-08-2025, 02:14 AM
» Replies: 0
» Views: 19

 
  DAY 017: _MAPUNICODE
Posted by: SMcNeill - 11-22-2022, 03:23 PM - Forum: Keyword of the Day! - Replies (6)

As there's been several people asking about how to display extended characters (such as greek characters) onto the screen, I thought _MAPUNICODE would be a nice word for today.  Wink

First:  Download the attached unicode font file and extract it into your qb64pe root directory (the same one with the qb64pe executable).

Then copy and paste the code below into qb64pe, and run it:

Code: (Select All)
Screen _NewImage(1280, 720, 32)

f = _LoadFont("DejaVuSansMono.ttf", 24, "monospace")
_Font f

fw = _FontWidth: fh = _FontHeight 'font width, font height
cpl = _Width \ fw: cpp = _Height \ fh 'characters per line, characters per page


For y = 0 To cpp - 1
    For x = 0 To cpl - 1
        i = i + 1
        _PrintString (x * fw, y * fh), Chr$(i)
        If i = 255 Then GoTo skip 'show the first 255 that people are used to seeing usually.
    Next 'then exit...  This is just lazy formatting
Next
skip:
Sleep


'Just to show all the tons of different unicode symbols inside the unicode file...
i = 0
For y = 4 To cpp - 1
    For x = 0 To cpl - 1
        i = i + 1
        _MapUnicode i To 0
        _PrintString (x * fw, y * fh), Chr$(0)
        If i = 255 Then Sleep 'show the first 255 that people are used to seeing usually.
    Next 'then fill the page with extra junk!  (I dunno what any of these are supposed to be. :P )
Next
Sleep

'Greek codes are 913 to 969
'note that there is no greek symbol at 930, so that unicode value has been recycled to be something else.
'pay no attention to it, if you don't need it.  (And I don't think most people would.)


Cls
i = 912
Print "The Greek character set:"
For y = 1 To cpp - 1
    For x = 0 To cpl - 1
        i = i + 1
        _MapUnicode i To 0
        _PrintString (x * fw, y * fh), Chr$(0)
        If i = 969 Then GoTo done
    Next
Next
done:

'Latin is 256 to 328
i = 255
Locate 5, 1: Print "The Latin character set:"
For y = 5 To cpp - 1
    For x = 0 To cpl - 1
        i = i + 1
        _MapUnicode i To 0
        _PrintString (x * fw, y * fh), Chr$(0)
        If i = 328 Then GoTo done2
    Next
Next
done2:
Sleep
System


Running the above, we start out with a burst of characters across the screen that everyone should be familiar with -- the 255 ASCII characters that we see and use all the time in QB64!

Hit any key, and then you can see what the unicode characters from 1 to 255 look like.  A large portion of the first half maps directly over from our current ASCII set to the UNICODE set of characters (everything from 32 to 128), but, as you can see, there's no symbols defined in our font for unicode characters 1 to 31.  Those are/were control codes back in the day, and the vast majority of them were non-printing, so many unicode fonts don't have those characters in them.  Our ASCII code actually maps unicode symbols from other values, and puts it in those spots, to make the character set that we're used to seeing.  Wink

Now from 128 to 255, there's not a single character which matches up between the unicode values and our ASCII values.  We tend to, by default, map the character codes from codepage 437 into those spots, so that our codes will match the same ones QB45 and all other basics used to use by default.  Now, one problem with this is that we aren't offering a lot of the specialized characters (such as those with various accents and such), as we're offering the old character sets that were used to build boxes and such in old terminal screens. 

So, how would one fix that, if they wanted to display other symbols besides the ones we currently offer??

Hit any key in the demo, and you can see that there's a whole bunch of other characters inside the font we loaded!  Even though QB64 only makes use of 256 of those characters, that doesn't mean our font doesn't have a whole lot more than 256 that we can choose from!  (After all, if we couldn't use other characters, I'd never be able to create the demo that you're now viewing, now would I??)

To pick and choose our display set, we simply make use of the _MAPUNICODE command.  To easily get the most out of this command, I recommend the following steps:

1) Go to ✔️ ❤️ ★ Unicode Character Table (unicode-table.com) -- There's a ton of unicode symbols available out there.  Find which code corresponds to the character you want.
2) Find a current ASCII character that you're not using.  For my demo, I chose CHR$(0) for all my needs -- you can choose any of the 0 to 255 characters to replace that you want.
3) _MAPUNICDE unicode_number TO ascii_number

It's that simple!!

Now, whenever you need to display that character upon the screen, you can call upon it as needed.

PRINT "Hello World " + CHR$(150) '150 for whatever symbol/character you decided to map to 150.  Wink



Note that not every unicode font has every unicode character in it.  When you run my demo, you'll see several square boxes -- that's default for "Nope!  No symbol here!"  If the font you have doesn't support the language/symbols you need, then you'll just have to swap to a different font.  After all, you can't print characters that don't exist in your font set!  Wink



Attached Files
.zip   fonts.zip (Size: 312.35 KB / Downloads: 49)
Print this item

  New Wordfind
Posted by: PhilOfPerth - 11-22-2022, 03:03 AM - Forum: Programs - No Replies

This is an updated version of my Wordfind programme. It now finds and displays all words that can be derived from a given word, using each letter only once, up to 30 characters in length.

Code: (Select All)
Screen 9
_FullScreen
Clear
Common Shared base$, origbase$, dictfile$, dummy$, dictwrd$, l, found, totfound, unique$, min, max, t1$, t2$

min = 3

Color 14: Locate 6, 35: Print "Word-Find": Color 15
Print Tab(30);  "By Phil Taylor (2022)": Print
Print Tab(5); "This programme will find all English words up to 13 letters in length"
Print Tab(5); "that appear in the Collins (2019) dictionary, that can be formed from "
Print Tab(5); "the letters of a word or group of letters, with each letter only being"
Print Tab(5); "used once."
Print: Print Tab(10); "(You can specify minimum and maximum word-lengths to find)."
Print
Color 14: Print Tab(15);: Input "Minimum size of words (ENTER for default of 2)"; min$
If Val(min$) < 2 Then min = 2 Else min = Val(min$)
Color 15: Print Tab(30); "Minimum set at "; min: Color 14
Print
Print Tab(15);: Input "Maximum size of words (ENTER for default of 30)"; max$
If Val(max$) < 2 Then max = 30 Else max = Val(max$)
Color 15: Print Tab(30); "Maximum set at"; max
Print: Color 14: Print Tab(30); "Press a key to start": Color 15
While InKey$ <> "": Wend
While InKey$ = "": Wend

Start:
Cls
While InKey$ <> "": Wend
Locate 10, 20: Color 14: Input "What is the Base-Word (or group)"; base$: Color 15
If base$ < "A" Then base$ = "ANYTHING" '                                                                              just a word for demo purposes
base$ = UCase$(base$)
origbase$ = base$
Color 14: Print Tab(9); "Base word:"; origbase$; "  Minimum length:"; min; "  Maximum length:"; max: Color 15

sort:
swapped = 0
For a = 1 To Len(base$) - 1
    If Mid$(base$, a, 1) > Mid$(base$, a + 1, 1) Then
        t1$ = Mid$(base$, a, 1): t2$ = Mid$(base$, a + 1, 1)
        Mid$(base$, a, 1) = t2$: Mid$(base$, a + 1) = t1$
        swapped = 1
    End If
Next
If swapped = 1 Then GoTo sort
Print a$
l = Len(base$)
found = 0: totfound = 0
sorted$ = Left$(base$, 1)
Cls
FindUnique
For bletrnum = 1 To l '                                                                                              for each letter in base$
    fileletr$ = Mid$(base$, bletrnum, 1)
    po = InStr(unique$, fileletr$)
    If po = 0 Then GoTo skip
    Mid$(unique$, po, 1) = " "
    dictfile$ = "wordlists/" + fileletr$
    Close
    Open dictfile$ For Input As #1
    GetAWord:
    While Not EOF(1)
        Input #1, dictwrd$
        l = Len(dictwrd$): If l < min Or l > max Then GoTo GetAWord
        WORDCHECK
    Wend
    skip:
Next
Print: Color 14: Print Tab(35); "Finished!"
Print Tab(29); "Total words found:"; totfound
Sleep
GoTo Start

Sub WORDCHECK
    fail = 0
    dummy$ = base$
    For a = 1 To l
        dictletr$ = Mid$(dictwrd$, a, 1)
        po = InStr(dummy$, dictletr$)
        If po = 0 Then
            fail = 1 '                                                                                                     letter is not in dummy$ so abandon word
        Else
            Mid$(dummy$, po, 1) = " "
        End If
    Next
    If fail = 1 Then Exit Sub
    found = found + 1: totfound = totfound + 1
    Print dictwrd$; Space$(1);
    If Pos(0) > 70 Then Print
    If found = 220 Then
        While InKey$ <> "": Wend
        Color 14
        Print: Print Tab(27); "Press a key for next group"
        While InKey$ = "": Wend
        found = 0
        Cls
        Color 14: Print Tab(9); "Base word:"; origbase$; "  Minimum length:"; min; "  Maximum length:"; max: Color 15
        Color 15
    End If
End Sub

Sub FindUnique
    unique$ = ""
    For a = 1 To l
        l$ = Mid$(base$, a, 1)
        po = InStr(unique$, l$)
        If po = 0 Then unique$ = unique$ + l$
    Next
End Sub

Print this item

  A quick question
Posted by: PhilOfPerth - 11-22-2022, 02:01 AM - Forum: Help Me! - Replies (11)

I'm trying to display the copyright symbol, but for chr$(184) I get a different character (a bit like a backward F). How do I place the &copy; sign on the page?
(I've tried the Alt button trick; no joy there either). Huh

By the by, both the Chr$() and Asc() Help files reference an ASCII page, which is non-existent.

Print this item

  BAM "dev" and "prod" directives
Posted by: CharlieJV - 11-21-2022, 11:48 PM - Forum: QBJS, BAM, and Other BASICs - Replies (8)

A program can be at one of two promotion levels: development or production.

When at the development level, there are two versions of the program available: development and production.

When at the production level, there is only the one version of the program: production.  Until edited, at which point it is back at the development level.

That aside:

We may want a program to look/behave differently depending on what version we are running/exporting.
This is where the "dev" and "prod" preprocessor directives come in.

Sample code:



Code: (Select All)
<<dev """
greet$ = "howdy buds, this is the development version of the program"
""">>

<<prod """
greet$ = "good day ladies and gentlement, this is the production version of the program"
""">>

print greet$

In the sample code above, greet$ will have one value when we are running the development version, and a different value when running the production version.

Print this item

  DAY 016: _MOUSEINPUT
Posted by: SMcNeill - 11-21-2022, 11:27 PM - Forum: Keyword of the Day! - Replies (25)

Today's Keyword of the Day is the first which has poor Steve shaking his head and sighing deeply over our documentation and wiki entries on it.  Guys, do me a favor and toss the wiki examples out of your brains, as they're NOT what you want to do with _MOUSEINPUT at all.  



Let me illustrate with the first example from the wiki:



Code: (Select All)
DO
  DO WHILE _MOUSEINPUT '      Check the mouse status
    PRINT _MOUSEX, _MOUSEY, _MOUSEBUTTON(1), _MOUSEWHEEL
  LOOP
LOOP UNTIL INKEY$ <> ""


Seems to work as advertised, so what's the problem here?



Nothing should go inside your _MOUSEINPUT loop, except for a _MOUSEWHEEL counter!



Let me show you why:



Code: (Select All)
Do
    Locate 1
    i = 1
    Do While _MouseInput '      Check the mouse status
        Locate i, 1: Print _MouseX, _MouseY, _MouseButton(1), _MouseWheel
        i = i + 1
    Loop
    If i <> 1 Then For z = i To 20: Locate z, 1: Print Space$(60): Next
    Locate 21, 1: Print _MouseX, _MouseY, _MouseButton(1)
    _Limit 120
Loop Until InKey$ <> ""




Take the first code and imagine trying to actually do something with it.  Printing it inside that example loop isn't actually doing anything constructive for us -- it's just displaying all the mouse's minute movements as it crosses the screen.  If we're going to check the mouse against a button, or some such, that we've draw upon our screen, we'll need to settle on o single value for that mouse position which we compare against -- and that's going to be AFTER WE EXIT THE LOOP.

Code: (Select All)
Do While _MOUSEINPUT
Loop


^The above says we're not going to actually do anything with our _MOUSEX and _MOUSEY values...  We'll only respond to them outside the loop.



And, as you can see from my second set of code, the end result is *always* going to print the same values as the last pass inside the loop did...



So why would we waste time processing a couple of dozen events, assigning them to overwrite the same values over and over and whatnot, when we're just going to toss those values out the door at the end of the loop??



IF both sets of the following code produce the same results, which is more efficient for us?



Code: (Select All)
While _MouseInput
    x = _MOUSEX:  y = _MOUSEY
Wend


Code: (Select All)
While _MouseInput; Wend
x = _MouseX: y = _MouseY


Both are going to generate the exact same values for x and y, so which is more efficient for us?  The first code is going to assign several dozen temporary values to x and y, before exiting and giving us a final value for x and y.  The second code skips all that intermittent assignment and just gives us the final result after the mouseinput loop.






Our second example in the wiki is just as poorly written, and is just as bad of an example.



Code: (Select All)
SCREEN 12

DO ' main program loop

  ' your program code

  DO WHILE _MOUSEINPUT'mouse status changes only
    x = _MOUSEX
    y = _MOUSEY
    IF x > 0 AND x < 640 AND y > 0 AND y < 480 THEN
      IF _MOUSEBUTTON(2) THEN
        PSET (x, y), 15
        LOCATE 1, 1: PRINT x, y
      END IF
    END IF
  LOOP

  ' your program code

LOOP UNTIL INKEY$ = CHR$(27)



Once again, the example is processing all sorts of crap inside that _MOUSEINPUT loop that it doesn't need to.  Compile it.  Run it.  Watch how it behaves.   And then compare to the following:



Code: (Select All)
Screen 12

Do ' main program loop

    ' your program code

    Do While _MouseInput: Loop 'mouse status changes only

    ' your program code
    x = _MouseX
    y = _MouseY
    If x > 0 And x < 640 And y > 0 And y < 480 Then
        If _MouseButton(2) Then
            PSet (x, y), 15
            Locate 1, 1: Print x, y
        End If
    End If

Loop Until InKey$ = Chr$(27)




The only thing that needs to go inside a _MOUSEINPUT loop is possibly a counter to deal with _MOUSEWHEEL.  Everything else should go outside it, or else you're going to end up lagging up your program to the point of uselessness.



MouseInput code should generally look like one of the two varieties below:



Code: (Select All)
While _MouseInput: Wend


Code: (Select All)
While _MouseInput
    scrollwheel = scrollwheel + _MOUSEWHEEL
Wend


Attempting to process other code inside that mouseinput loop is just asking for trouble.  Our wiki examples work for what they're showing, but what they're showing is about the worst possible structure I could imagine for use with _MOUSEINPUT.  Honestly, they must've just written into the wiki when _MOUSEINPUT was first added into the wiki and nobody knew much about it..  As it stands now, those examples need an overhaul to show how to actually use them properlyWink

Print this item

  QBJS v0.6.1 Release
Posted by: dbox - 11-21-2022, 07:30 PM - Forum: QBJS, BAM, and Other BASICs - Replies (5)

Hi All,

Just published a small update to the last release of QBJS.  I've added a screen pixel cache to improve the performance of programs that heavily utilize PSET for rendering.

For example, @vince's American flag now majestically waves at a more acceptable rate.  Not quite as fast as native QB64 on my box, but a lot closer than before.

Also, there have been a number of posts recently of "Bubble Universes" which also run a lot faster:

Bubble Universe
Bubble Universe 2
Bubble Universe 3

There is also a rotating planet example that @bplus found in another thread that didn't run very smoothly before that works better now.

Note:  If you are not seeing an improvement when you try these examples, you might need to do a SHIFT+Refresh to clear the cached version in your browser.

Print this item

  USB Camera?
Posted by: james2464 - 11-21-2022, 07:12 PM - Forum: Help Me! - Replies (15)

I don't know much about this topic of accessing PC/Mac/Linux devices.

Is it possible to capture a still image from a USB camera from within a QB64 program?   Or would this be incredibly complicated?   Obviously the easiest thing to do is just manually capture the image (using the camera software) then _loadimage into QB64.  

I'm wondering if QB64 could be used to capture a new image at a certain time interval and discard the previous image.

Print this item

  Multilanguage Support.
Posted by: gaslouk - 11-21-2022, 01:24 PM - Forum: General Discussion - Replies (5)

I would like to ask a question to the community here.
How easy is it for QB64 to support the Greek language?
That is, what is written in quotation marks.
For example,

PRINT "Den ypostirizo ellinikoys xaraktires>"
PRINT "I do not support Greek characters."
PRINT "Δεν υποστηρίζω ελληνικούς χαρακτηρισμούς."
SLEEP

Copy this little example and you'll see exactly what I mean.
I would like one day to be able to make my own programs and insert Greek characters where needed.

Thank you very much for your valuable time.

Postscript. I hope I wrote it in the right place.
[Image: 118.png]

Print this item

  Mini-Robo-Mixer
Posted by: James D Jarvis - 11-21-2022, 07:53 AM - Forum: Programs - Replies (13)

Mini-Robo-Mixer generates a sprite sheet of robots.

Code: (Select All)
'Mini-Robo-Mixer v0.1
'By James D. Jarvis November 2022
'This program uses BASIMAGE coded by Dav for QB64GL 1.4, MAY/2020
'
'generate a sprite sheet of monsters
'each is 64 by 64 pixels but code here can be modified to change that
'
'press c or s to save a sprite sheet to the clipboard so you can paste it into a paint program
'and save is whatever format you desire
'pres <esc> to quit
'
'License: Share sprite sheets as long as they include generated credit bar in image
'any programs using original code or graphics from source or generated by program
' please include the following (or equivalent) line somwhere in comments and documentation:
'Includes Art and/or Code from Mini-Robo-Mixer v0.1 created by James D. Jarvis
'
Randomize Timer
Dim Shared ms&
ms& = _NewImage(512, 360, 32)
Screen ms&
_Title "Mini-Robo-Mixer V0.1"
Dim Shared part&
Dim Shared kk1 As _Unsigned Long
Dim Shared kk2 As _Unsigned Long
Dim Shared kk3 As _Unsigned Long
Dim Shared kk4 As _Unsigned Long
Dim Shared kk5 As _Unsigned Long
Dim Shared kk6 As _Unsigned Long

Dim Shared clr~&
part& = BASIMAGE1&

Type robobody_type
    head As Integer
    larm As Integer
    rarm As Integer
    torso As Integer
    leg As Integer
    k1 As _Unsigned Long
    k2 As _Unsigned Long
    k3 As _Unsigned Long
    k4 As _Unsigned Long
    k5 As _Unsigned Long
    k6 As _Unsigned Long
    xsiz As Integer
    ysiz As Integer
End Type
robot_limit = 40
Dim klrset(12, 3) As Integer
Dim Shared rlook(robot_limit) As robobody_type
_Source part&
'read the colors from the color reference bar whichever color is in the top left corner will be transparent
clr~& = Point(0, 0) 'find background color of image
kk1 = Point(0, 1): kk2 = Point(0, 2): kk3 = Point(0, 3): kk4 = Point(0, 4): kk5 = Point(0, 5): kk6 = Point(0, 6)
_Dest part&
Line (0, 0)-(0, 8), clr~& 'erase the color reference bar from the bit map
_ClearColor clr~&, ms& 'set background color as transparent
_ClearColor clr~&, part&
_Source ms&
_Dest ms&
Do
    Cls
    'build a color set for the sprite sheet
    For k = 1 To 12
        klrset(k, 1) = Int(Rnd * 100 + 150)
        If Rnd * 7 < 3 Then klrset(k, 2) = klrset(k, 1) Else klrset(k, 2) = Int(Rnd * 100 + 150)
        If Rnd * 7 < 3 Then klrset(k, 3) = klrset(k, 1) Else klrset(k, 3) = Int(Rnd * 100 + 150)
    Next k
    mmx = 0: mmy = 0
    For m = 1 To robot_limit
        'create a new set of monster sprites
        'included image source has 16 options for head,arms,torso, and legs
        rlook(m).head = Int(1 + Rnd * 20)
        rlook(m).larm = Int(1 + Rnd * 20)
        If Rnd * 10 < 3 Then rlook(m).rarm = rlook(m).larm Else rlook(m).rarm = Int(1 + Rnd * 20)
        rlook(m).torso = Int(1 + Rnd * 20)
        rlook(m).leg = Int(1 + Rnd * 20)
        'determing colors for this specific monster sprite
        kp = 1 + Int(Rnd * 12)
        kr = klrset(kp, 1): kg = klrset(kp, 2): kb = klrset(kp, 3)
        kr2 = Int(kr / 2): kg2 = Int(kg / 2): kb2 = Int(kb / 2)
        kp = 1 + Int(Rnd * 6)
        kr3 = klrset(kp, 1) - 5: kg3 = klrset(kp, 2) - 10: kb3 = klrset(kp, 3) - 15
        kr4 = Int(kr3 / 2): kg4 = Int(kg3 / 2): kb4 = Int(kb3 / 2)
        kp = 1 + Int(Rnd * 6)
        kr5 = klrset(kp, 1) - 20: kg5 = klrset(kp, 2) - 15: kb5 = klrset(kp, 3) - 7
        kr6 = Int(kr5 / 2): kg6 = Int(kg5 / 2): kb6 = Int(kb5 / 2)


        rlook(m).k1 = _RGB32(kr, kg, kb)
        rlook(m).k2 = _RGB32(kr2, kg2, kb2)
        rlook(m).k3 = _RGB32(kr3, kg3, kb3)
        rlook(m).k4 = _RGB32(kr4, kg4, kb4)
        rlook(m).k5 = _RGB32(kr5, kg5, kb5)
        rlook(m).k6 = _RGB32(kr6, kg6, kb6)




        draw_robot mmx, mmy, m, 6
        mmx = mmx + 64
        If mmx >= _Width Then
            mmx = 0
            mmy = mmy + 64
        End If
    Next m
    md$ = "Robot Sprite Sheet generated " + Date$ + " at " + Time$
    md2$ = "Mini-Robot-Mixer V0.1 by James D. Jarvis"
    _PrintString (0, 321), md$
    _PrintString (0, 337), md2$
    Do
        _Limit 60
        kk$ = InKey$
    Loop Until kk$ <> ""
    If kk$ = "C" Or kk$ = "c" Or kk$ = "S" Or kk$ = "s" Then
        _ClipboardImage = ms&
        _Delay 0.3
        Locate 1, 1: Print "Sprite Sheet Saved to Clipboard"
        Sleep 3
    End If
Loop Until kk$ = Chr$(27)
_FreeImage part&
System




Sub draw_robot (Mx, my, mid, scale)
    'generate a monster image from source sprite sheet part& and render to the programs main screen ms&
    tempi& = _NewImage(64, 64, 32)
    'tempi& creates a temporary one sprite image for rendering
    _ClearColor clr~&, tempi&
    _Dest tempi&
    Cls

    _PutImage (0 + 16, 12 + 16)-(31 + 16, 43 + 16), part&, tempi&, ((rlook(mid).leg - 1) * 32, 64)-((rlook(mid).leg - 1) * 32 + 31, 64 + 31)
    _PutImage (0 + 4, 0 + 8)-(31 + 4, 31 + 8), part&, tempi&, ((rlook(mid).larm - 1) * 32, 96)-((rlook(mid).larm - 1) * 32 + 31, 96 + 31)
    _PutImage (0 + 28, 0 + 8)-(31 + 28, 31 + 8), part&, tempi&, ((rlook(mid).rarm - 1) * 32, 128)-((rlook(mid).rarm - 1) * 32 + 31, 128 + 31)


    _PutImage (0 + 16, 0 + 16)-(31 + 16, 31 + 16), part&, tempi&, ((rlook(mid).torso - 1) * 32, 32)-((rlook(mid).torso - 1) * 32 + 31, 32 + 31)


    _PutImage (0 + 16, 0)-(31 + 16, 31), part&, tempi&, ((rlook(mid).head - 1) * 32, 0)-((rlook(mid).head - 1) * 32 + 31, 0 + 31)

    _Source tempi&
    'repaint source image with generate color values for new monster sprite
    For y = 0 To 63
        For x = 0 To 63
            Select Case Point(x, y)
                Case kk1
                    PSet (x, y), rlook(mid).k1
                Case kk2
                    PSet (x, y), rlook(mid).k2
                Case kk3
                    PSet (x, y), rlook(mid).k3
                Case kk4
                    PSet (x, y), rlook(mid).k4
                Case kk5
                    PSet (x, y), rlook(mid).k5
                Case kk6
                    PSet (x, y), rlook(mid).k6
            End Select
        Next x
    Next y
    'generated image in tempi& is rendered to ms& as a 64 by 64 sprite

    _PutImage (Mx, my)-(Mx + 63, my + 63), tempi&, ms&
    _Source ms&
    _Dest ms&
    _FreeImage tempi&
End Sub

'================================
'PNG file saved using BASIMAGE1&
'================================
'EXAMPLE USAGE OF BASIMAGE1&
'===========================
'SCREEN _NEWIMAGE(600, 600, 32)
'pic& = BASIMAGE1&: _PUTIMAGE (0, 0), pic&

Function BASIMAGE1& 'robo01.png
    v& = _NewImage(640, 160, 32)
    Dim m As _MEM: m = _MemImage(v&)
    A$ = ""
    A$ = A$ + "haIkM^P]SScZ5^W4o3]<9k9Y_gDM9K46dC#XH_mJ]G9Wh78Q#`WUCZjOnWoi"
    A$ = A$ + "hOPPPPPPPPPN=jkFd]1XadW?OnSR^M01]JURmaL088XE9NNWEW7bJko_oko6"
    A$ = A$ + "^?]mn^>[jgmaEd]G_7oCKX>8d:EDinh]Q_i^BaoAkCPF[NbloooAdcMnTRPA"
    A$ = A$ + "gGN:SolJ^JKNfNncen?A75DWfNfH]e=NOTmj]mogeaTojCBlH`[a#oSmPPnZ"
    A$ = A$ + "D<fGf;ZFM\GdlO?InSMFWnLQjN?YaQIZ;Cm<Ag?l:6PCnhiH_D=GMOoQ;iT>"
    A$ = A$ + "SiY[aeI\?kcj`fo2gS0Wi[E6#cmoM8?S3;5kmTb12]?:KMWo;kE:WcOh`2hn"
    A$ = A$ + "aSPoCKM0nEOn?cHkJO^?fVEkk1c1>:7gCNmoTHolT1\F=gokH^_O;c;9bnYa"
    A$ = A$ + "oe93h8\B[>gC;lON_nOJ[m[5[1k8aRBm?`oi_6Yn;M^YW]1_kcd>R4oGB[Q3"
    A$ = A$ + "86n7]e1`[kkWKOjj]B[kAoLgjk<95GLh`h#6gG9f_5T3NERbl=bjhm4Gk_B\"
    A$ = A$ + "ON`0B[gVHYUHZo`P`^63\9>dEn_>[9aOn?[jnOC]C]f[#J87RmTbc<gj_>B\"
    A$ = A$ + "hGUnNKbonK26#oRc^Fk7mL?UH0]86Xfj?iC]gkC^:aoI53XdmbAGg?9O0mL]"
    A$ = A$ + "lN0KIM0n:_VoAciFRoc;6`?WS[7WekXa6l?gbH_^Io8<PNi;llN?h\K_In_k"
    A$ = A$ + "YNZUoe660YikB\Oef_5i3lUo[mfV6kgZI0WmHV9NhFOF9_SefFRoS>>`SglZ"
    A$ = A$ + "=hALe<]5?bo>2kG96`Ic7AkSJ\?liPFF3VoMm[EIbmnNLaSCi=iao7llP7fm"
    A$ = A$ + "L0h[3#BYmco<;biGKLh]`o=J\WGnR<63WckO6OM`cWD?o7ho\Wok?nek=8aL"
    A$ = A$ + "2GS3Fboa6c9aMgnLWb1XanA[ohI\P57c<a3gWc?>kMGSo2QKGihT25]_=djh"
    A$ = A$ + "K?7kX]3?Smha#I\ODWlQlWYa0>fhnmjk]\I57HbfJeLXSelfkdfn#Nmo:9ji"
    A$ = A$ + "j9kWH\0Y6P]aSgikTTG\gWn1VXlOl?GjJ<Jo^fmLY9[io:bnMF?`jen\lhL;"
    A$ = A$ + "a5NFCNE:?OC9n?Kj_BlO7\[KJN_fnocWI#<a5CW0[aRH#B]3]kmfjJ`BSkS8"
    A$ = A$ + ";K7ReIM<7#^?P<FO8`oafGDlO[PmC:^cbO;0OnLWg8SeSnZbWMS7I#n_JcgZ"
    A$ = A$ + "]i=o7gFFboeBkb[H=N<g=>?:oWhWi;oWdh\7lOdLJB<7JaLdcMnahkLMb]U5"
    A$ = A$ + "bo9977cCm5jgeRcn=i_e>??VG\:nBAV?^cGP5d6kBNfJ5hoX=UcmKDl`>`o]"
    A$ = A$ + "J^[TODSkZU]DkHTJ_Ja29fZcb2\?cEn_^Teim^ZYEBdSaJO`g=YJ?l?KNV7f"
    A$ = A$ + "jNXUgYdWab1eK<hYoTXVi09Wc\S5ehodR;N2lOdloWS]BSk2g7`O>W9KKdib"
    A$ = A$ + "Uh^eWGVG?ZKkOLokMI[lOBGSA7S5G[[lIU^olOUV?:9kZoMWWWbjAc7`o<?^"
    A$ = A$ + "GPKn1Uh?oV7FPm[B^gi]]L<LbVRkc`lBlkWjRkkCamIoH#KKfe_?4[k[]n?B"
    A$ = A$ + "L0cTo[UnoZlmIin[TkajiR]TgCZ]HNo^Sh_Il3iM5aAhV4WKOHONYLNUb5J`"
    A$ = A$ + "HAYJ`edSToCZ>T`WmWcIRf6?6\genMVH_FR3:=gdJV;a#lFV1JHN8BWkJLFL"
    A$ = A$ + "mo]a7<cl>?IPK9^cniPgWOUV?L>_H1<POgXO^4oW7nQC6?]i0BO^;S3\B<TY"
    A$ = A$ + "4d?c;n_T=dhohkoY`oEM>QQajZf[CI7oGoX?lJWS4gEbGO;o_dOK`joU^VoG"
    A$ = A$ + "X7kJCRnX_obf7W][IiohSodiJIciHSooblOlkk?[n2mE5NPccK`f7?6VVcSc"
    A$ = A$ + "LYaPA_6Fi_kMmo\`^gZgeZlPkYF27Sl1B[g7GB[oWdah23LQofleN#lN^>bI"
    A$ = A$ + "0Yc5MXVH[[1Q7imbFS?j`Ka?cAn_3QQObWIClFncoMdeoSN]<;nW5gkEN7=Y"
    A$ = A$ + "=Gg3KM[nOJLVIkCgSQeo?cmcRa:ZK7kllORiP:mjamnO_aPS`L[9;67^GCi:"
    A$ = A$ + "Gggg;aoiiLPEaoIaVelOY[YdkYO6mJHUoNU[oGnL#Fm]JbhJoT>gAJ^NZ^Ln"
    A$ = A$ + "lOKl1Dn__Gedcl>mjaWLn_B7S9coYmo?imEY?c^koG8gkWfGo?OR5mkkmFAK"
    A$ = A$ + "bLeGajljOnmm_ZUQOgVkeiV[]3N=FJTg2ZmachiE=`KL87YYIL6SknUIS3_U"
    A$ = A$ + "gWnZT4?Vihobl3]\^O:mkN[1W^6SllNhc1lSokB[ToK5iN[UW_G=B<8=6>bW"
    A$ = A$ + "oK:WF?[oggcana3QJOBbYJOTTOIccYO6e7<[=CcYhLMd?_USa<n?QJ1d?>_6"
    A$ = A$ + "QE[iX<ogaAmeoc[jRIS?>4_Y6oO6OOUGWN?hNbO8aQYU3`J^;A6#UHa\L#Nf"
    A$ = A$ + ">HfWjkm>NhFOo_bUal9U9lO9g]``n=MkHWWo;Ol_\:aneKMhJlO]\IFNHRRN"
    A$ = A$ + "moThQLO=WH\Hda6jWYM>Se6b]I?KdfRUnl8Fo?nL`KcgM>gKYlnJeQ\ToSce"
    A$ = A$ + "mi_]SE\nOeFoU\aP?lmI1gI16`KnNilaN5;^Ln_4WAF^G6og:V3DIc[k5W7h"
    A$ = A$ + "UOoGifO9nPD]>J4gRR5FALnf`o9:QhOUS[?KNM^jaQ]cnIAL?_fK[c1]ZmXc"
    A$ = A$ + "oMY#ho8cmSPoS>Wg3n?No]4o_GOWoUR7mL]VkMNQUaiEW3TbicGgo<64KR5_"
    A$ = A$ + "5S;XElmo;[O;lncHmCGSMnQRiKime5T?FLlIAel?m7dl:4onE>7__g[;F<ng"
    A$ = A$ + "e>?W;NS1lfh_oiP4_GGZFDn?]ijNdO;UKY5i3oGNMXb<Pf\nOJc3FA=XNh0m"
    A$ = A$ + "X]Xco5ljoIH]VRaNK0o7GJ\G[P7R67B]_GfC<ND8^gKKfBn#;_W[An^O8YAK"
    A$ = A$ + "?ReKi_WoW2eS]:fGT3\0gWWL8AM?8I<PWiOF;oA4co^7;hOM_B]QCkN\FOoU"
    A$ = A$ + "ooN<_WnkKlo:im\L>A9V>YLLJ7KOfljL;e^Faj]DJl#Zn[WilX>VMImohgoY"
    A$ = A$ + "mnjblONolOg]h?9koFho:IK?J3K5o7MR>m__jhggg7K__\KeO:`liM^7U2=["
    A$ = A$ + "]60g3\HnSEcn2kon\O9VBIn_ee^R^nk:7o[ike63nUkoURW6AoJmoNK3AJkW"
    A$ = A$ + "Hn_JcejQmKTff9kgTlOnM_Ia<n7=oGdmO8XXEdaoAKoMdgoVl1##[#]N__e^"
    A$ = A$ + "7hA]]EK?Yl2k3ogL?W;888888XO7]ZkoJWGokgPoOTf#dn68888888888888"
    A$ = A$ + "888888888888888888888888888888888888888888888888888888888888"
    A$ = A$ + "8888888888888888888888888888888888888888888888888Xheokomo2_="
    A$ = A$ + "0111mTdW?O<AoZfOff1looff_gfe^=?<Rfb>d_OJaOA?no[e_OJcoKY=\ZnH"
    A$ = A$ + "4S1A?^oF]og[a\Kcd>nN^okon_C9[l3e\SUmkMboo]5<UVdnAfo;??l#imnT"
    A$ = A$ + ";nPZ6llFg>Bm]S:]5;m1A>oG\_>X\XnG[iMl:^OeiModHLnZW;L=Oo_bXLMS"
    A$ = A$ + ">Nhah]HoL:I1o7cOGm_o]So5kom4eo#h?fMn??jgkToO;ho>[5dok]JL8We["
    A$ = A$ + "L^>?^o_JLGNGcC\cj\mSJn?]o>[m]P1<i7>4JGWakIS;nDokkEnd_Fimc?_g"
    A$ = A$ + "FIGN0Uim6T_KTi4FU[G]_V6?EN]dn^hbN6lOdn\Jn63Roejo]^i2oWhLbjkc"
    A$ = A$ + "TlNT=NNEalQTSmY`oeMM7SlogVOeZ<8><SoK`g?Mo_I^?^<NMh3RoK4f?[J3"
    A$ = A$ + "WiMo8K1J>G]mgKKPgOCiJ6iENNZIF;bMPoK5ggmMnVfRedTE[5#Ci0<8WG[n"
    A$ = A$ + "VlLCfD_E\oN0n_MImoJMcZno>aoAO=U;Tn<YXi3Y_2n?3iohSbliLB7[5lOC"
    A$ = A$ + "\=jjoDWkkSbkU>^iGoWj5OXeoMTk\Af_T\HnO:Njh_aSYGYeOhkk\6DWfGRo"
    A$ = A$ + "K4AI1MWocXhnJf?2n_IH0]\=edD_\LPfolHK]nSU[eiXaoGnliK?R[3A]ofQ"
    A$ = A$ + "hOJ>7enkPiMJI\8]E]V_Qa0TP:QiHeg7Fo?KloK3ogW6O_1aQaboe7bEM=;7"
    A$ = A$ + "J^T6WedDnO`oMnJ[SeL>`TneGo?^?_dk]ToK46#[IBKJ\Wf2<doGf_HC>?]n"
    A$ = A$ + "<MnG6CGSomXin^eF>m[lj;:o]3ao[hnO:=FTfNSlOdGCi2ajo50ogAQiNB7k"
    A$ = A$ + "\l7IaGmoniho\P3ljJ=DoO2f[33h_4kD_<n_\jJ=8:c8M7^boUjeO6?^_VmG"
    A$ = A$ + "Am?Yki[GK[UKfEn_Ki5meoc_7?[j[ln<=^W??XUof:OaI]8^oFl_mignF_bF"
    A$ = A$ + "kOOnPfO?KMGaiRRim[_?\nOfhog2n_NT1aQIlO3nNoFo_?ImaF>nQjoBjUbo"
    A$ = A$ + "A5=7#R1DjHVe_CIiJ=f?KNhOo#;l3ZccYS9C4g?Rm]VoCdo?hVUnoRihhJ`i"
    A$ = A$ + "k3?n;\iMM_E478>6TiSEnK3mmmhClb^Po3[ogXKVao=Z\PoKamo]Wo[3F<Gh"
    A$ = A$ + "ojP3d<n?B^N]koSKM[ho6ADfA[hohmgEcoUlY]lN;SkVI<HilOC<O_Vo7lO2"
    A$ = A$ + "nIYoNAlONhc;egCKeR5\b7\ClOln^DnOYS5lOPoK\iKBon>bo<J>^J7[KlOE"
    A$ = A$ + "hcV=>L66#;\m>`o=j[;Uo;K<IMl7NDgG:VK6f_ImoGi4JMZWOnNJ\MFm7bH_"
    A$ = A$ + "5in_=okPmlMKl_]fG8bkMhS__fhQ5eJj9f;]m6ioX_VVO_3[oWTM]:Fh3Y?n"
    A$ = A$ + "QeOUTfa?KLGJNEc[;6klV>nk39VZcg?Zm;gG5hR[LlF>n;U3ZdaJBNPFUA\O"
    A$ = A$ + "diMgbeOhkcoUfWWMm?><H<8Zko\5kk1oWD<g<lOV_6D;RmSkkUR_?cgU=7dV"
    A$ = A$ + "H0nl_<n^6oKciodhn8iQ]doGJl`ciLBmkFgLSoC9>[dnNj[oWF>I?b3L_2W\"
    A$ = A$ + "\=OWD>?Ye7CohV>nS6Ceik1oW]a2e:0j1gQViheKTfo\lOF8[Z3Ol9OM0Ub3"
    A$ = A$ + "JCL_OjGdogSoa:k`7kSToK61n?kjg]^IUOhC?6E[]<AkHGRoXc_K9GS7i2JY"
    A$ = A$ + "=hQ]_Vc9ahEkc<H=02:n[5f;YH=;[;8>FgiCPOUenl8f;Ziok4oAEn?jHnWi"
    A$ = A$ + "ioVeWKaHa>ioUl?WS9oeG?K]^F7?X\OI<8O^6k]XfKdcodJ?WeFBAlDn?7Zk"
    A$ = A$ + "FbWH9[CmnM_QmPokYao5K=oB<OBO^=em>>don>DCF4oe?a5CCJOah\0hoZ6o"
    A$ = A$ + "C\WUf<bioF`PHEnWRlOg6;6?^SK;;DjJeKKZekgHEg?2eoXao]jkoacj_img"
    A$ = A$ + ";^Cjk;]?_hQ_amMngnbna7C\fGKml0;\;Yc9DOYnn\PoKd=;iojQi`jH1nhJ"
    A$ = A$ + "YJ=N]><mM?8f6o59ogfcO\0n_Z]37]KTeog=n_NZoK5ogA1Kg:gGjeIJCmkj"
    A$ = A$ + "MnIaZDKjAcomYnoN0VoNWhoLH^nXS9N=f;gOk[n[5SmT>W#Nnjkc:n?]G;]_"
    A$ = A$ + "Eaoial>eaQ6g<WoCH4^X\Rkh8heoKTn>a74:oQ1LH5K3;LMX;=WdckkNWhod"
    A$ = A$ + "77>^mgFcoUNM4^_d[C?GLQiN:iKX_Vle76<O_D<NdlO[nNOkJnhRbiXi?lXV"
    A$ = A$ + "kI<O;YILJ^`>ao=bf:holJNWjh#SK?9n_If\8oGgmMSl1U^?GYL?;Mm_Jd;h"
    A$ = A$ + "M]H?ioXS1Yn=WcAkc\RmSfG[boMh?oG9>`JWcCImoRTo;=cjFm7J\Paiof1n"
    A$ = A$ + "?aLA1OOWF^F3M7c_Pj#k4oWf[UfgCToCbfNO_8I<#BaPROf_ococRfPES1Ja"
    A$ = A$ + "SN<NO6cYbKdWl:FPFWa;o>hoJkOS3mTokLLXe8>7VgaSgdho\L^8_^3_ON>o"
    A$ = A$ + "G:N``l2gJ7ObI#iomBHoZT7J^ke`?eNK`0^_9WC\ClOS\1n?k\O4lOLoO?_^"
    A$ = A$ + "Zk1dcJ>]HO?6_?Si68_[7lOGi?cScdZ;Jih_4ogggbiohOVe]QVho8omCRo["
    A$ = A$ + "Hm#Eic_k3`oEoOooneio:]VVcXFJCESek>kkheTg9n?]G;]?`oIWm1oWNl0h"
    A$ = A$ + "olSoCSm[8ogOm7FF7VbjAiNdn<?RoGAnWMTok<>Xe8>7V;Z=6hE^O=kaSm96"
    A$ = A$ + "m6kWE]WAHRF2oGQLBF4ocSa?VLOPoK`aR1g0oWMfo=coY]FneTWfW?VK]m[V"
    A$ = A$ + "cMYlObio:boIH<hX[og:RoCSmdGWIno>bo]3coFUoWKcJZU=_[1j9k7OnG[i"
    A$ = A$ + "T0ogcRoCkeBk3lOfIoG?oWcceZ>ng9kUEammTceSfAFn#fE?:n?YLkl?kGUo"
    A$ = A$ + "HGiojQgaSlOk6o7WeeKO1]mTV;ZogonlONXFKCEI07Q3L0oa=n_Knkjkc:n_"
    A$ = A$ + "AfF1oWFN9`o1n?C7oG<gEAKgH^H[Vk=L>#7l1Po3lOk0oG]j?Nh;^jgoGHN6"
    A$ = A$ + "og7ongl?nL`BiLV=_3_6REZGOCC<P>W7\fmEhml#;HaG5o7O>XGlO[`_;6;F"
    A$ = A$ + ":nBB;:o;holUoCenETUeLJ>G8co793l_:oa^co]blnAhoWY?_ZJ1[`Wgml#3"
    A$ = A$ + "ON3daH;d8lOYfBgYN<\>4ho6[MhaL^Ejg5S3iaEe4ho\Ml_7I<ogY?XA^7_\"
    A$ = A$ + "McioLHl_g4a[ZV[eco1oG\noIjcJ]7?V?^Jf?eiR6O?_FbmIQ?:OM4K=mSMO"
    A$ = A$ + "7`]#oZfOffQUal`n`nAIoNJ;NHcAl1AJkOiaoA]e>fVn5moN=>hmlA[_nShK"
    A$ = A$ + "RL\NWR9FiH14444444444444444444444444444444444444444444444dkB"
    A$ = A$ + "NoK_0on8PPPPPPPPf;mU=k`IYaommOOFR^o31111m^5Fg3XgXfMn?<732222"
    A$ = A$ + "b;iI=#DOJnaVXogI_8HnGU]STo;]E^__^o]G62222jM9`o]GRcdDcoj3keX3"
    A$ = A$ + "ifnok_[ho[;RRo;moM:bSmSkoacK62222ZThl5Uh>TF[UFg?FKR>7?nkFRYY"
    A$ = A$ + "6Ka\oo^VlJY=7oA?<YJ[Ug8lOmJoXhoXSain1[<kMK2n?8888X_BRQkPmo]Y"
    A$ = A$ + "75nohDjn?>4>g:e0QhnbS\ood]7n?jie;_mO>NjXg\lO\[E?aPdne8lO]bOE"
    A$ = A$ + "cnNcoUJcIS1VKj;kZm\VQPPPPNOZ6ogAUo?^Gkh1oGoS3L^_IhoB__EONRIk"
    A$ = A$ + "8a^I0o7mJeJlWGlOURoZmm9d:a];W7cKn?YWe<4444dkDPoK?4WQK6n?Ye?\"
    A$ = A$ + "5kW=jI0o7mJE;nCkk<`<lOl[IC[3IUhmf7;[OMRHmo`co5222jM;Yj][Po[g"
    A$ = A$ + "W;iK#9n=Yen[Gn?niVfJQmicRGo?JlW6of\lOWnQ6RmF=oWo[oG^maJo1111"
    A$ = A$ + "1Ua]Y`oe:_6oiLYaoa[9^ZWkVfcQ[WWGWG7KjhilJlO;3U:dc_nl[C;[1HDl"
    A$ = A$ + "OYCJ5lOY?[Ui4a]nO9=?g7ggc]74444dkCJLNcF3\e[[m[eAoe7?iO;\nUIm"
    A$ = A$ + "[2lGBmoF^^GWS>_F;lOl[7W3\En_CI0o7mJY6[#j3LFG;hoT^V]6kJeL;]SC"
    A$ = A$ + "Lmoblom<?QLl:nN^mPPPPPf?IeJLEjjg;WB[]kF^^Wee>>^NUnn?:_GBJ7[j"
    A$ = A$ + "eU`oAOUmICaoeaeU_fOLN]A6_Y<U]`0:_nOC8feZD<N9oj8Zfe[UHgEaoAo="
    A$ = A$ + "ILSMCT5DgO[M^9kQeo32ZOIE=G8XFUDmkFgJUo[6[V7lOgFG3ejFEHn6mlTh"
    A$ = A$ + "oTT5lO]NMok6OM\V=nAJ]a:6?X`=<R]kiJYa^=LlW23I?a^[PoCkg[MgalZa"
    A$ = A$ + "jif?]=ehJPemPmQmS`nBiBk9gZ7miEj;RVom]HOne[gWm5=F\Uf5_>U5m9]["
    A$ = A$ + "3_NhomijHBnZj\_Ccoe1GmoM>iKc6?ekedbhiA_FN5o=jiJEo_dabiob>o9i"
    A$ = A$ + "nhokmb\[oWD>YEGogji9oJf?Jo_D^DO]7[>R#^G_i0JYF\[\GgVKCN?KO[KL"
    A$ = A$ + "O]a1mFCmGLlWVOIFn_F[i;aU=KN=ne#b>iaF[CmHkKm95=ceE;nb2n_N_VGc"
    A$ = A$ + "c]jNIjoJUJgc6oekeP?n>MlO7G[4o7ocjR3T5O9mK0:]]bHZiROd^GbSLoC3"
    A$ = A$ + "caN:f_fmjKUmeKCnGg?gGWGkP>gZdaHIkBb__fi1=`oi83VlhnkUo;IE[_?`"
    A$ = A$ + "Fc]dRfMn_fRYlBgcKD;VZEn_AREYSGF4?=jek]boY=f>BK`R[5WE[eikB<TL"
    A$ = A$ + ">`I7CGIM?Y=N^=]Si9JO=o_7fG?^k_Qd7g__3;IO;UkT>Wb:NPJc_jmI^IUO"
    A$ = A$ + "9SakdOCZSafWGc5KYVZ7f^FlPglOgHoHaoF_V=F<7nWRokPW?QlZdkUTfaZN"
    A$ = A$ + "M9i>X_bn\KeH;DK?_FLm[K]h\IRW6mJ1n_hioBKDF]d6mhh?;GncjEjJZ]O_"
    A$ = A$ + "S[VeFlg;EGVonWXmeloNHoDKh>WW2oWA<8Ii#5FC_BBjLja^JigYRkoKiL6="
    A$ = A$ + "Gb]a09NKWio^kW_cm=;SKOf_L<Q;foPn_;7iaoWLF65ko:ioZadeSZMNBlOB"
    A$ = A$ + ":M_V4oHJN<W9lfae`e]dHf<a0cLM0oGllOB?WF>[gGa?Vdf8[aG[iAkQoKfL"
    A$ = A$ + "cda`D<<gN]L<F43];fGcokQm?73?cK^>n_[LZ]7k`I3jMnkFcoalgbS?fcoa"
    A$ = A$ + "SidH^hkg;kcK3Jc5\enGnN>3HfOK#lo[To;4Mon5UT6oGfcNiS`a=hJEgCme"
    A$ = A$ + "BnnaGk?K^GZA_FFd6VaffU_Nl[U437Wek[TH2C\Sm`0:FCGIn_FnoI^VEmST"
    A$ = A$ + "=^mJiHV=6VOMU\_daiYmUTefo\=#6k::3ZoaW7fKOQ?g[gcmPVkFi_EioZLN"
    A$ = A$ + "CU?AI>DYmIMlgQbeOEcoT\_Wco_^nGiab6gc\99GgTe=;i[]nj#iPbIelQoC"
    A$ = A$ + "J\YJN5SE?fV7GUV7GRo[ULe]<^=JL`XG3;cU<jeRVkNdLVcL=JMLZ^oO\[Sd"
    A$ = A$ + "JoUnL=V#jaVfJUo;;of=F=mlmYfYfnkmJF;F^D>YF>VIRSK=?jXcGgMkgbLh"
    A$ = A$ + "F?^Vkc:cO[U?MfinBg[NVnX`oe`iIFnD^o`8on=kmANMgViHoE\?mJWFO_\["
    A$ = A$ + "oaMN`da<KofRiamLMXe[XW[5f?oJ:=Gn88MamFBJ\NI<RO4>^Oeeo;[FmkTo"
    A$ = A$ + "[fHTWGS4kfg=nWco\_BR;\daOK<R?_P7Y:`[ERoKd[YNkkjN[dZgGkHVAk0o"
    A$ = A$ + "EdfoL<\Rm]R3Q>o]6O7On==Wl<cm;aa]Jn?=VgJ\`F5gAWGE[=b?WOEkC_^g"
    A$ = A$ + "[UVWGS_iah\WG3;SYjiJUWKQEOh\>Q`kUTfaZNM9lOdGIOV6o7?OT8oGU[K;"
    A$ = A$ + "amS4?=je8U3o8U;Obi_SL]N[lOOgdFk__J4>?jcYPoJfl_B\JTi;dnW4oWhe"
    A$ = A$ + "KBn?Y]KcoZL<cXAh_\`^cHo`hoJhhJ^?Cb?c[O`SXTf_D^jF]K=YboEilVS;"
    A$ = A$ + "P?7jSjWKehn8[O`<[KANoe6k?K=<nH]4oWla<FM[I_FSL=Z5gKiL8En?ej>5"
    A$ = A$ + "foXWgW[i?5Wg:UKAX?LlA97EU[k^<nW=NHD^TA_F_=n?ngU4]WK[6KQ6G8ol"
    A$ = A$ + "\Po[=94b[Lmj9FVonN>VId>`O5]m?73[HoF>^f]InLXdH[Dm5jnT>_^le=8A"
    A$ = A$ + "n_6ddlOIBKnVMamLiaiD;F>5?gSmiWkX]1]Wc;U1T_U>nA\m[Uo;49O_TLYa"
    A$ = A$ + "jEmcjhjFJnc8a#SNMRfncf66af]ce8OmVmloZBLO9=cci]LO_2[6QGC:_bmk"
    A$ = A$ + "gFH^fTlOYLjdo^WSI6A[WD=7:ho<K=Xhi#c7WKKOSTkZ#1SC53ogHiF<IL_a"
    A$ = A$ + "adA>7]nZEl?SjCbbUY`0FKM1]X^U7eaj=^_GkgkLPA[QJA]gA?fBOF_GGjag"
    A$ = A$ + "Z?KTlG]=n9c:gmLV1^>Wn0Q]F>gBKJW_Z?CSMGHlOVc_5=bc5Nha[2lO]91g"
    A$ = A$ + "a4lOlaE]iOU>VI4mJGKnC[aZoJf_Ui_]NLmIgLF^FFo?jagKkhlJCV[:mgZl"
    A$ = A$ + "OE>_Il;oYoX<fFJOC?VW=_]aao6?WJaaS<GF;O#_]QJ?WgdWUKWlS_EKG[fE"
    A$ = A$ + "_cokmJDSKXUhgA^6ei5lDiiGdd8cYjmjfR_[9nW1_>]=>d2kFKnmASOWiLk>"
    A$ = A$ + "fO3hoTNV]LUf6Q1\jHFZEg`hOca0MOmb7KSPo[dm_EKoFJcjeO]Y]d2Wo87k"
    A$ = A$ + "\]SFFo_IkgebKO8do:>OORkkkV_X#><]m=^OGXGD=n[_cYdh<OmkZ=^JaePN"
    A$ = A$ + "]h[YG[Oooh7O[moA[OIaeH6fQI^6Ia<lj=7TCSoN9YM\ZGG2o7mEfW=ENT:G"
    A$ = A$ + "gAD;anc9YQ]N\_f#_LOAjceRKUJ3e>?ni:EoB\178o7Wk;mnF?nBlRRi\e4I"
    A$ = A$ + "^Bge>ZZfOn_UbQeba<ZRbnUV3HiiDM<D;:nSB>l:7k\S5WccIZejj]ig[8]i"
    A$ = A$ + "o>aoeB=PNiKJNnKSSWSL>glk=j7;E3Jf[1O>M[?WgBKmTW[U_O=NL=f2n?ah"
    A$ = A$ + "V2aDUD]ck_eObhdTT5lO5^^=U_YeHo>mBeieTD9n_N^>GG[FSKeROkmlUnnS"
    A$ = A$ + "Y=69:]lo3NnLMn<U>jK=mB7?oeJGSjSMCnMWIR[YfH[4oE?i:kYO4Qm7iJJI"
    A$ = A$ + "kXWa??ROdKC;Po[1edlo:WghS3]nlK6cG<bhi\a0Fh3]NLXE6`AiedR][9?^"
    A$ = A$ + "6AIoah6\B]aO=5oG3lGe>^FJ;Poc1n_2bbcO7TnhWA[S`PGcfcQdG^ZMgnFW"
    A$ = A$ + "oeBkgCogZaQFJKNN]W]o?Jk\e[QUnTAj3cf_]`7jah#_GC?SkOZJFOl\S=N="
    A$ = A$ + "6fbeeZHZ8lKFHO;l1N?nkmi_;bSfh_#o6222j][F[_5Mk42222222b3m6__e"
    A$ = A$ + "_maS?UOnF_1o0DN<Ad]1Xe?VoFbi][:jJ?B[?Odn48XEYo`ldi_QSOIUHkJQ"
    A$ = A$ + "okhQk;P8Sk3nmO4b^aPH6gS?WGdl?A>>leNFnkHYkaOFnNL_o#_9AWo5aL`E"
    A$ = A$ + ";`o1aeKRoK7onjm7k607f>`oAK3[^]TbmCGo[EG38:n_cLm7<n_6nM[31mD4"
    A$ = A$ + "ho0ogKF9f_Jo^SO2johk6ogn\K]Y\om:J=fNGN^7AaoU\W4ogZJ7ANo7Po32"
    A$ = A$ + "joD4ggGDjX#n6nW3n_W]h\O?M6#`oa7kg7n_Eg>f5n??ngb`Vko_#n_JLfhk"
    A$ = A$ + "4kkC_=n_TViHPN6j=]nOYnk>mlOSPoSbn#O=J6`Uol?9<WWgck2i#g9n_S?_"
    A$ = A$ + "7n?]ahE?n3Mig3mkN3Qok9?^gB]^X[725CLaKPm;eGgUenk\m0n_#\?O]7SH"
    A$ = A$ + "=8gRWoKWooFc_\X<gdaJjLRgbJ1];:beOSO?H?iaMaWg7_0h;iI12mnNn_Yn"
    A$ = A$ + "lKVoSGWSonXI`Rbnk#o?4K;\>P?iioYn=?V7\Oa=F4emoaS5N3SmgZioAim?"
    A$ = A$ + "L>08ihQg`H^>3HPofO1oGHfWFoi=aoMJoG`cmEZOC[ioFZo_C:igCiP`coMM"
    A$ = A$ + "miJlO_1o0DNl`ZonGAOf;aDg?Ff_cfa2ioXnK>gCTiOSRo:e62UoJSioNbO?"
    A$ = A$ + "PNSen7aohagC1YeL=bL`[PoLWR_>ckbhof]i1AmmSIgU5nUXNn_lj][^n[Gi"
    A$ = A$ + "d6^]\Hn?nh`ZkceR7NCfWcoeR<ef<A_nlm7im7hU]GE]oOAYoLBVkNeX[gJT"
    A$ = A$ + "ckGI<`U_lZVGdS_G][mT]R^f0lLTAiOf1OTnlbiI0G5kW4og:b5D>WfcokoW"
    A$ = A$ + "dHa:k_bS7b[og:Vk5UmeHkX[52og6\eeX^^ooc9Oic9Ii6F=3h:h?;Ek_ENL"
    A$ = A$ + "?ICSbnGGkbi:kenlhjBWkZjo[UokPlnhiNi3ZAgVhSmBKc>VgJLcIKPiORd7"
    A$ = A$ + "i1oBR1LU\OJlOl?gSlL]V7IIiIEhoF=oa87S7a4DEJOFd^RbnljPlW3FBUfg"
    A$ = A$ + "\mocLK<n_[?GVoKIa5lfPCSod[AYaodVdhf_ZmEKCWakUZeLYAV_eBmGngAI"
    A$ = A$ + "=IQoW7;ecnJc>gio6EV>7SX8K?Ja9BKJk_gn\fl^\lP:n8[kcm53=?3h7NnE"
    A$ = A$ + "fJ0Jmh\DmdNoL;[o:IcJ7S7aodl][bnkBo?ISBcg[U;hkf\f?EWAJ[dnVanY"
    A$ = A$ + "jKdO32ljSJkc:kO#_VllN:o^0Ud<aoUKK2_JTmYnO9o;OoFcO4]m;e^Xg?ZU"
    A$ = A$ + "eoUjce>^dL#_hohnl\jo=^_VlY\jdeVCiml==n_6Q<bT;co;\=2oG9N^Nm3J"
    A$ = A$ + "\CNVG\7n_dkKc?OWm[Ui6m>oODn??Zog3oSWl7WS[2]Qg#oOVl_FbO6Ym;]n"
    A$ = A$ + "NHmolcnBleLom:hoRbnUJGoamWllO^_N0cNm;mmo;=_KUlOUbaIAn?An_f:V"
    A$ = A$ + "k6_5hodIiN;lOGnjkc[mXn?mJ:E[eCncknblfB]H#?ZoCK;l[eKXoGjJ]:>S"
    A$ = A$ + "8]Ob>B[5BbVDf?[]k1M<>5CTn<N>>7m1b][kiLm`_[aK]:n_X\Oii4ieCLI<"
    A$ = A$ + "nhn_oG9f`Fd\]3]LL]^_nlYO8_>V<MN6K>FD]WLOeMO<OL`RnkI>_G>oWFm?"
    A$ = A$ + "?ZoGJ^UfaIMLF;GK?]O9OlZ\?mJ?Z?2b^a2]H`B?W\Y7oYaOloVnI>?nWUc?"
    A$ = A$ + "UKeaJ<BfUog[Po:JkG\MUZRiX_W_6OYGm:V_ToGZnG[k[=kLWocknG_moMXm"
    A$ = A$ + "`I2\Pm;kj;TCCS[A2`::OE?lOSh_G9oA9k:MLN`ndBOc;kgZO`Ckgbefkn?D"
    A$ = A$ + "^_^W?g\H0ZH\O[Xf`mf`jF[aJ][Fe<f#SeI5f_HofIn?JoWbmm4cg`InNJm?"
    A$ = A$ + "[lAB\NF7[gjeBR1<Nf_J<Pm_FLA`O4=oEdf_ef1hoPlBWifH?SG:kGD]QgBl"
    A$ = A$ + "F9n_XJ?cFCIXHPSWoookmDkGF63`Iola>GZE6#?h?knL>^olMWMNjKVo8Jkg"
    A$ = A$ + "R=N3mOXe;A^[0h_bJ7OF_mSFPoSJggch>DnHOYePbJKimjWgDKXSnIfJaWa0"
    A$ = A$ + "JgcPHel7]\nK]^6MoRf_5Kl6jo#aXKlOOf0n_GfjoUVCie__WaKC[Wo3jMZE"
    A$ = A$ + "cn9No^=\>PFg>XOg:Za`U=WdHODTl7laM9iE\Adf_efaC_o35SfUeo;[]lim"
    A$ = A$ + "`nUjglO__AgVB];JmYXK?#?C];\OQ`omAXEX]6<Wkgnk7;Jn3^=TflH=8Sfn"
    A$ = A$ + "md>NbmOXhdeLlHGk]<FD`o5^0o7T7Zdj;hMLFdlOJ[_B67Xdn?>^M<fkGRSo"
    A$ = A$ + "PJ3\nOHmoPF[fQeNk=coUH0o\9mkcJBhio2IXdZW\Zhn?Tl;B_^4n_SB4X74"
    A$ = A$ + "N?2Gh]GmQo;2n3^6iHnE]O;fh=doQRGA>nbi?O;lO9^?no>?7MOofJ>0n?83"
    A$ = A$ + "4M=TXL5[:fBSoklc3I=0__fNZlO>^nCA`O011m^Efjnm2o]O\SlOYf6hoP\D"
    A$ = A$ + "Ln?jO_>koAne5a0FM=0;^nOH>844dc#R\O_D6#j[AgVB];`o1IYFacD\Vmeh"
    A$ = A$ + "oFiJLEMmoDDdSO####FY<n?QGO;ilfeLlkJk2jgEB\O[<njRo<oeEk3:]nOA"
    A$ = A$ + "?61111]2UH0UN=jf644TmJ7FG;>7Hdn0LOF###_AUbkaO5222bC1^;8888XO"
    A$ = A$ + "EQeA02J?4Vo5WO?jf04dKFA?7l]b0Ao]3_Co6BPPNKRoK:9jfcK#AnLlQ^?F"
    A$ = A$ + "4MK0:VamXoNkUb3\Zo]lJ7DZ>3hoROL8jf0DlBkgFLd][W\f1n?<6Wo__C[f"
    A$ = A$ + "^A=?SKcgHL`e_SgS`H0O[\OD^?`o5gh#dgk3DLSmLYm_a<AgFORJ7bkOnkin"
    A$ = A$ + "5?6CoMm_jO?o9K6Q]YeKiomKAIlO1a0Fjn]ObS7dj>_aH_XmiWeOHaOHMON7"
    A$ = A$ + ":Soh5boYmkHN5c1h\OA`0Nbnmbog_Wg6oGbNBlOA\6XQ?fCio2P1D;?kC?o;"
    A$ = A$ + "]O2n_ei[YlNLn_gfonEnf5U3Q7?LlPcolOlM7=Xea06bcN4lOQMO_D^C`o5g"
    A$ = A$ + "HOdlOGS9Ob6?N3??HY_oOH=X^l=NL=cZa[lng^_o=9=^_WL\`>`oAmmQn\OO"
    A$ = A$ + "alOA]fOLk75gInc2:>o#XSo1aoEki`mFio`g7#oFCdKaKLQ_go_>Ym\8OjiO"
    A$ = A$ + "`co5lOGS5a`n41o7_?7aJ#^;::n_?2eMcN6<?lL_Do0hoDR?<Nnh]J>dHOFL"
    A$ = A$ + "hK8f3B9^hEao5oJoQWok>47laUL^e7oSSmRnLPOS\OWn0F=`UanaZ5_bkoLG"
    A$ = A$ + "4Nn_Um9Fi3^Mo6ThndlOYmoF73NCZ4ogCNl?Jn?Z_7?oghR1XlGAmLHSRoSb"
    A$ = A$ + "lnJ7o9lO;K>O:W;iegZo7[gW#lQ3i4TFo?jlO?Fo_g>;o_RFmcoLGT>3hJGk"
    A$ = A$ + "_glcoU6[5ALGD?ogMPo:ZWolZkSJng`ioHeRSfG5iHSEc1dZUm[DCcSeoSN]"
    A$ = A$ + "YggA6oWAOWoYnJYef=Jok:77S<f[Gk?jcS<jnY=nYe^^Och_=]O7<o7Wo82N"
    A$ = A$ + "4JLK4f>Bn[EIO][oB^?;RXfCjIR]\fcaJ]k>[4WP]\Oam<M<96aYk7UO_7gh"
    A$ = A$ + "o<hNAhLO]n_agdJ0dGo55]NB4?OYCkcbad23H?]cXFo<[mCAa`VVg55kETlO"
    A$ = A$ + "BiiFmJaa]W7iKeR[h<WNdOSfn9kXUggKkB[ea[]M]oc00g73X\OFV[YDN\ET"
    A$ = A$ + "GK6kK1oG^=dHoFkl\AloLfYnZ3[?7_TXco]8>I4n_[a]lGm8F]5oV5GCY]E`"
    A$ = A$ + "FTU[QYBaTlcYUHeJcelNlKNoT_]oRnj5llO[FogIn_bmoli5UnL?jodSIFkE"
    A$ = A$ + ";o:On_fn\\O^BkG[MYmlO\XfOYnoQdl\Kkg?n_KiQMjIm:EW]Dm7nLaI[;5]"
    A$ = A$ + "m;W7Waoi#\N9NWT_XUhlAWCfcLLYmK9GB=OQd_cW[Ja\Gok\fAWoGCl0TJnP"
    A$ = A$ + "FfhnLYm?Z_ERI#RQXdT09f3]cA[]N=>EOnVUccj?_#ijoUR=Ve>eZab77FEm"
    A$ = A$ + "oKWgTaTSHoNoL_jolcOdiWef:UCH6kfZmeZ7CgWGaOebkKegeYRi5oTon\lo"
    A$ = A$ + "G343e6ZFOI1O?oJYVKb7cSm\hgOAdf_iJnYA2S73JUo[fcoLDOAdcok=F#VK"
    A$ = A$ + "ILn_6QA^c19lIchWCnaJkODOKdlOGkJ_hoVYnoX<7m4GXES?=F<O]_a]_5i3"
    A$ = A$ + "kenFco=JoG:6bkh_NICo5\O9o>mOGgXfT_??ZoO8T[khfn?K#3>g_1^c?ifN"
    A$ = A$ + "ViJBZ7n;YoVnj_Xm;5?LngYA57Z;e3oWdL]dlRAW7dcLL?VogK\P<[1hoZ?>"
    A$ = A$ + "K4oG3OVTohJGk5oG[S9Nao=2o9ohVYoo[JodW9M>mdV6anU>G[R;;M]md^[f"
    A$ = A$ + "nUloUFo?=61[joo99d=N\SlLNG17f?gG`nN<>?;oe:Go??\OKSAnEGZD<0?G"
    A$ = A$ + "TdLQB\QSHoB][Ffg\nRJa0bJLn_FmoRc?9b2OPDM7Jm7_beOcn:m?]aMni8G"
    A$ = A$ + "[L?ioZ=W[Ujoda7c7;4^f]dfNbfGK^ReiRZ=f^2o`KDUhkBk[Dn8[J3I9Tb7"
    A$ = A$ + "X=Qo[7kkE\E?lGBimWe_7]mKILhT2?`igLF?nJ3n4bmd2oWhhS0oWg]C?ho^"
    A$ = A$ + "j?beeFAM696`FVSejLaMSo[UaQBeomRok<>CHlNEL7kZmGEk8JkoFEYk9Cjn"
    A$ = A$ + "cl<n;;OX43XSl7;S_YA9M^cbN<SmGF\8Qo;J6#:cGjm?Ul>daJ9foBWWd[[Z"
    A$ = A$ + "]jAMWBikF53X_m_b\Ok23H]joAaoiYMgMk7]oOen18maVEaMWa0nI=?KfMGF"
    A$ = A$ + "`o]kB^Fen\>P?EOOdLoeJGIi0FhmYmDF_1M6`oni3do\N<8jjoU\O]ffCgn["
    A$ = A$ + "XM4]mQZ?f\BOo]ln_L6#`o5IKjm5_5]n`HnTN_gS9??6#^HIFK\omWceHoAT"
    A$ = A$ + "eo;aF^ReMJW]o:J7AKOXjS?Qco9\60AkGFYoWbomDkkk8o7D<a1lkgClmP1L"
    A$ = A$ + "jnfoaaEN^f=^a>i5KZM4<o1O<V:_7ogMkkMk8Jk3EN\AB[`^lLm_In_Elk_M"
    A$ = A$ + "7T7eGPnMd=f_S?D05aL2P1LlneYK]`L^\iTW7W]lOk0o1g6Lki=oe>KO?K7A"
    A$ = A$ + "KOXbS=Nn_m;ES;4F;PgfH?hoPN;ZUke<\k7UD3JefgEom1QYCYoain\d74Mm"
    A$ = A$ + "oMOmgRfnHmoN_:Bn_cH3RNKSkdhOnof\4MKcWn:Nn__MA30ViH\FUZ5m[6WN"
    A$ = A$ + "bfmihn[WkCHmohb0n_8i?dHIG1[o>KoEd>Rfn#m=f\JOoKN<WbOcOOd]=O6W"
    A$ = A$ + "__F4Ag^PF[>:T_i6C#0iRhL:oj[7A6OG=n?bmUIENIDo72JOeCWkHWe[Vok1"
    A$ = A$ + "f7QZ[4oG2fPcoAolXhoh[;e_N\Zhj0:aoIlJo111]gjYcM\kRn\OObS1Po3j"
    A$ = A$ + "[n5hoTNFUAkg\X_YZ2[oGd]K888o4FgmhEb_odmo8>3JgioTH0SfWiNO6[m7"
    A$ = A$ + "444444TcZEn_XJK_]kCI7nNP3111111m\E[on?R^M211]7jo3#EK%%h1"
    btemp$ = ""
    For i& = 1 To Len(A$) Step 4: B$ = Mid$(A$, i&, 4)
        If InStr(1, B$, "%") Then
            For C% = 1 To Len(B$): F$ = Mid$(B$, C%, 1)
                If F$ <> "%" Then C$ = C$ + F$
            Next: B$ = C$: End If: For j = 1 To Len(B$)
            If Mid$(B$, j, 1) = "#" Then
        Mid$(B$, j) = "@": End If: Next
        For t% = Len(B$) To 1 Step -1
            B& = B& * 64 + Asc(Mid$(B$, t%)) - 48
            Next: X$ = "": For t% = 1 To Len(B$) - 1
            X$ = X$ + Chr$(B& And 255): B& = B& \ 256
    Next: btemp$ = btemp$ + X$: Next
    btemp$ = _Inflate$(btemp$)
    _MemPut m, m.OFFSET, btemp$: _MemFree m
    BASIMAGE1& = _CopyImage(v&): _FreeImage v&
End Function

Print this item

  Alchemy is fixed!
Posted by: PhilOfPerth - 11-21-2022, 05:54 AM - Forum: Programs - Replies (30)

To those of you who helped with my previous feeble attempt at this programme, thank you!

Alchemy has been completely re-worked and has a few extra features:

  • The previous best train of changes for each pair can be viewed.
  • Selection of a pair is simplified
  • An additional set of word-pairs can be substituted by "commenting out" the first two data lines.
  • All files are now correctly attached as a .zip file and can be extracted to the Alchemy folder.

I would appreciate any feedback on the new version.
Code: (Select All)
Screen 9
_FullScreen
Clear
DefInt A-Z
Common Shared try$, fail, tries, prev$, tryvert, targets(), target, firstwords$(), first$, lastwords$(), last$, pairnumber$, pairnumber, names$(), name$, ok$, fail$, temp$
Common Shared added$, removed$, ln$, train$()

maxtries = 20: minsize = 2: ok$ = "o3l32cego4c": fail$ = "o2l16co1gec"
Dim firstwords$(20), lastwords$(20), targets(20), names$(20), train$(20)
Randomize Timer

Data "BIG","SMALL","LION","TIGER","CAR","TRUCK","BLACK","WHITE","WEED","FLOWER","BEDROOM","KITCHEN","COPPER","BRASS","DESERT","OASIS","MILK","HONEY","HORSE","SHEEP"
Data "BADGE","MEDAL","MARRY","DIVORCE","SHED","HOUSE","WAR","PEACE","SUIT","DRESS","BOX","CARTON","ROAD","STREET","DUNCE","GENIUS","CUP","PLATE","STEAK","EGGS"

Data "ORB","SCEPTRE","TOWN","VILLAGE","BURGER","CHIPS","YOUTH","MAIDEN","OLD","NEW","FAKE","GENUINE","TEA","COFFEE","DRESS","SKIRT","PLANTS","WEEDS","PENCIL","CRAYON"
Data "GLASS","BEAKER","GUITAR","PIANO","SLATE","STONE","CORD","ROPE","JUNGLE","DESERT","PANTRY","CUPBOARD","BROOM","SHOVEL","FOOD","DRINK","ORANGE","LEMON","SINNER","SAINT"


AlchemyDescription:
Print
Color 14
Print Tab(36); "ALCHEMY": Color 15
Print
Print " Alchemy (al/ke/mi) can be defined as the process of changing something into"
Print " something different in a mystical way, such as changing ";: Color 14: Print "STONE";: Color 15
Print " into ";: Color 14: Print "GOLD.": Color 15
Print
Print " This game calls upon your skills in this art, to change a word into a"
Print " totally different one, with the least number of changes."
Print
Print " In the usual word-swap game, you repeatedly change one letter of a word for a"
Print " different one, creating a new word, until the target word is produced."
Print
Print " But in Alchemy, you have another tool available to you for the transformation."
Print " You can also ";: Color 14: Print "add";: Color 15: Print " or ";: Color 14: Print "remove";: Color 15: Print " a letter, before re-arranging them, so the word may"
Print " change in length several times as you progress."
Print
Print " As an example, we can change STONE into GOLD with 4 changes:"
Color 14: Print Tab(23); "STONE - TONE - GONE - LONG - GOLD": Color 15
Print
Print " If the wordslists directory is present, each word entered is checked against"
Print " these. If not, they are assumed to be legitimate words."
Print " The wordlist files are the Complete Collins Scrabble Words (2019)."
Print: Color 14
Print Tab(29); "Press a key to continue"
While InKey$ = "": Wend
Play ok$
LoadPairs

Choice: '                                                                                     invites replacing best scores in file with defaults
Color 14
Locate 23, 17
Print "Would you like to delete all previous results (y/n)";
Sleep
Color 15: y$ = UCase$(InKey$)
If y$ = "Y" Then
    Refresh
    Play ok$
    LoadPairs
End If

SetPair: '                                                                                     Select pair of words
LoadPairs
Color 14: Print Tab(22); "Which pair would you like, from A to T";
getpair:
pair$ = UCase$(InKey$)
If pair$ < "A" Or pair$ > "T" Then GoTo getpair
If pair$ = Chr$(27) Then Stop
pairnumber = Asc(pair$) - 64
Locate 23, 15: Print "Would you like to peek at the previous best solution (y/n)"
showchain:
k$ = InKey$
If k$ = "" Then GoTo showchain
If UCase$(k$) = "Y" Then ShowBest
StartGame:
Cls
remain = 21: tries = 0: fail = 0 '                                                             start each game with 21 tries remaining
first$ = firstwords$(pairnumber): last$ = lastwords$(pairnumber)
train$(pairnumber) = first$
target = targets(pairnumber): name$ = names$(pairnumber) '                                      get  selected pair details
prev$ = first$ '                                                                                pretend the first was a previous try
Color 14
Locate 1, 39 - Int(Len(first$) / 2): Print first$; Tab(52); "Record:"; target '                 display the first word in yellow on row 2
Color 15
For a = 2 To maxtries + 1: Locate a, 35
Print String$(9, "."): Next '                                                                   show 9 dots for each try (rows 2 to 21)
Color 14
Locate 22, 39 - Int(Len(last$) / 2): Print last$; '                                             display the last word in yellow on row 23
tryvert = 2 '                                                                                   row 3 will take the first try

InviteTry:
If tries = maxtries Then
    Play fail$
    WIPE "23": Color 3:
    Locate 23, 21: Print "You've Used up all of your tries, sorry!"
    WIPE "24"
    Color 15
    Sleep 3
    GoTo StartGame '                                                                             ran out of tries, restart the same pair
Else
    Locate tryvert, 35: Print String$(9, "."); Tab(46); Space$(30)
    WIPE "23": Color 14 '                                                                        refresh remaining tries advice
    Locate 23, 27
    Print "You have"; 20 - tries; "tries remaining"
    Locate tryvert, 3 '                                                                          display invite at tab 10 of current try-line
    Print "Your word (q to quit)";
End If

DealWithTry:
Locate tryvert, 25
Input try$ '                                                                                     show ? outside try-line and set try to first dot
Color 15
try$ = UCase$(try$)
If try$ = "Q" Then Stop
If try$ < "A" Or try$ > "Z" Then Play fail$: GoTo SetPair
tries = tries + 1
Locate tryvert, 35: Print Space$(12)
Locate tryvert, 39 - Int(Len(try$) / 2): Print try$
CheckWord '                                                                                       Call Sub to Check the Player's Word

DealWithCheck:
Locate tryvert, 1: Print Space$(35)
If fail = 1 Then
    Locate tryvert, 35: Print "         "
    Color 3
    Locate tryvert, 39 - Len(try$) / 2
    Print try$
    Color 15
    tryvert = tryvert + 1
    GoTo InviteTry
Else
    If try$ = last$ Then
        Finished
        GoTo SetPair
    Else
        Locate 23, 30
        Print Space$(50)
        tryvert = tryvert + 1
        GoTo InviteTry
    End If
End If

Sub Refresh
    Restore
    target = 21: name$ = "UNSOLVED!"
    Open "alchpairs" For Output As #1
    For a = 1 To 20
        train$(a) = "UNSOLVED!"
        Read first$, last$
        Write #1, first$, last$, target, name$, train$(a)
        Print first$; " "; last$; target; name$
    Next
    Close
    Cls
End Sub

Sub WIPE (ln$) '                                                                                  call with ln$ string of 2-digit line numbers only  eg "012223"  for lines 1, 22 and 23
    For a = 1 To Len(ln$) - 1 Step 2
        Locate Val(Mid$(ln$, a, 2)): Print Space$(80);
    Next
End Sub

Sub LoadPairs
    Restore
    Cls
    Color 14: Print Tab(37); "Word Pairs"
    Print Tab(20); "Pair"; Tab(30); "From"; Tab(41); "To"; Tab(50); "Best"; Tab(62); "By"
    Color 15
    If _FileExists("alchpairs") Then
        Open "alchpairs" For Input As #1
        For a = 1 To 20
            Input #1, firstwords$(a), lastwords$(a), targets(a), names$(a), train$(a) '                      loads word-pairs from "alchpairs" file
            Color 14: Print Tab(20); Chr$(a + 64);: Color 15: Print Tab(30); firstwords$(a); Tab(40); lastwords$(a); Tab(50); targets(a); Tab(60); names$(a)
        Next
        Close #1
    Else Refresh
    End If
End Sub

Sub ShowBest
    Cls: Locate 12, 2
    If train$(pairnumber) = "UNSOLVED!" Then Print Tab(35);
    Print train$(pairnumber): Sleep 2: Cls
End Sub

Sub CheckWord
    added = 0: added$ = "": removed = 0: removed$ = "": fail = 0 '                                 initialise added, removed and fail flag
    Locate tryvert, 48: Print Space$(32)
    Locate tryvert, 48
    CountAdded:
    temp$ = prev$ '                                                                                 use temp$ as sacrificial to keep prev$ intact while checking for added
    For a = 1 To Len(try$) '                                                                        for each letter in try$...
        l$ = Mid$(try$, a, 1) '                                                                     take a letter l$ of temp$
        po = InStr(temp$, l$) '                                                                     find its position po in temp$ (if any)
        If po < 1 Then '                                                                            if not found...
            added = added + 1
            added$ = added$ + l$ '                                                                   count it and add to added$
        Else
            Mid$(temp$, po, 1) = " "
        End If
    Next

    CountRemoved:
    temp$ = try$ '                                                                                     use temp$ as sacrificial to keep prev$ intact while checking for added
    For a = 1 To Len(prev$) '                                                                          for each letter in try$...
        l$ = Mid$(prev$, a, 1) '                                                                       take a letter l$ of temp$
        po = InStr(temp$, l$) '                                                                        find its position po in temp$ (if any)
        If po < 1 Then '                                                                               if not found...
            removed = removed + 1
            removed$ = removed$ + l$ '                                                                 add it to added$
        Else
            Mid$(temp$, po, 1) = " "
        End If
    Next
    If added > 1 Then Color 3 Else Color 15
    Print "Added "; added$;
    If removed > 1 Then Color 3 Else Color 15
    Print Tab(60); "Removed "; removed$ '                                                               show letters that have been added or removed, colour cyan if too many

    DictionaryCheck:
    If Not _DirExists("wordlists") Then isaword = 1: GoTo checksfinished
    WIPE "23"
    filename$ = "wordlists/" + Left$(try$, 1) '                                                        select dictionary file of first letter of try-word
    Open filename$ For Input As #1
    getaword:
    isaword = 0
    While Not EOF(1)
        Input #1, dictword$ '                                                                          read each word from dictionary
        If try$ = dictword$ Then isaword = 1: Exit While '                                             if word is found, don't look any further
    Wend
    Close
    checksfinished:
    Locate 23, 1
    If added > 1 Or removed > 1 Or isaword = 0 Then '                                                  if more than one letter added or removed, or word not found, set fail flag
        Play fail$
        Color 3 '                                                                                      colour of try changed to cyan if word failed
        Print Tab(35); "Word failed";
        Color 15
        fail = 1
    Else
        Play ok$
        Print Tab(37); "Word ok"; '                                                                     otherwise, declare word as ok and make this the new prev$
        prev$ = try$
        train$(pairnumber) = train$(pairnumber) + "-" + try$
    End If
    Sleep 1
    WIPE "23"
End Sub

Sub Finished
    Play ok$: Play ok$
    Locate tryvert, 35: Print Space$(12)
    Locate tryvert, 39 - Len(try$) / 2: Print try$
    WIPE "2223"
    Locate 22, 21: Color 14: Print "You did it in"; tries; "changes.  Target was"; targets(pairnumber)
    Sleep 2
    If tries >= targets(pairnumber) Then '                                                              if target is not beaten,
        Exit Sub '                                                                                      go back for next game
    Else
        targets(pairnumber) = tries '                                                                   change the target for that pair to the new best score
        Cls
        Locate 10, 4
        Input "Enter a name for the Best Scores list (or <ENTER> for anonymous)"; winname$ '            get the player's name
        If Len(winname$) < 2 Then winname$ = "ANONYMOUS" '                                              if <ENTER> (or only one character) is given, name is Anonymous
        names$(pairnumber) = UCase$(winname$) '                                                         change the name for that pair to the new name
        Open "alchpairs" For Output As #1
        For a = 1 To 20
            Write #1, firstwords$(a), lastwords$(a), targets(a), names$(a), train$(a) '                            re-write the alchpairs file with the new details
        Next
        Close
    End If
    Cls
    Locate 10, 40 - Len(train$(pairnumber)) / 2: Print train$(pairnumber)
    Print: Print Tab(36); "Press a key"
    Sleep
End Sub



Attached Files
.zip   wordlists.zip (Size: 713.77 KB / Downloads: 50)
Print this item