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

Username/Email:
  

Password
  





Search Forums

(Advanced Search)

Forum Statistics
» Members: 308
» Latest member: Donaldvem
» Forum threads: 1,741
» Forum posts: 17,901

Full Statistics

Latest Threads
The QB64 IDE shell
Forum: Utilities
Last Post: JasonPag
09-16-2024, 05:37 PM
» Replies: 9
» Views: 764
Importance regarding Ches...
Forum: Utilities
Last Post: JasonPag
09-01-2024, 06:34 PM
» Replies: 0
» Views: 31
Chess and Analysis and En...
Forum: Utilities
Last Post: JasonPag
08-28-2024, 02:37 PM
» Replies: 0
» Views: 32
DAY 009:_PutImage
Forum: Keyword of the Day!
Last Post: grymmjack
09-02-2023, 02:57 PM
» Replies: 54
» Views: 2,034
Fall Banner Contest?
Forum: Site Suggestions
Last Post: grymmjack
08-31-2023, 11:50 PM
» Replies: 36
» Views: 1,261
ColorPicker - Function th...
Forum: Dav
Last Post: Dav
08-31-2023, 11:04 PM
» Replies: 3
» Views: 315
Goals(1) = New Tile()
Forum: Works in Progress
Last Post: RhoSigma
08-31-2023, 09:45 PM
» Replies: 3
» Views: 127
micro(A)v11
Forum: QBJS, BAM, and Other BASICs
Last Post: bplus
08-31-2023, 09:14 PM
» Replies: 90
» Views: 3,589
Updating The Single Most ...
Forum: QBJS, BAM, and Other BASICs
Last Post: bplus
08-31-2023, 09:13 PM
» Replies: 7
» Views: 254
QBJS Image Question
Forum: QBJS, BAM, and Other BASICs
Last Post: bplus
08-31-2023, 05:49 PM
» Replies: 5
» Views: 155

 
  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: 41)
Print this item

  Make5 - Board clearing puzzle game
Posted by: Dav - 11-21-2022, 01:55 AM - Forum: Dav - Replies (9)

Make5.bas is a small puzzle game where you try to clear the board by removing pieces of the same color.  You remove them by making combinations of 5 or more pieces of the same color in the same row or column.  Click on the ball to move, then click where you want to move it to.  Only large balls can be moved.

Points are scored for pieces that you clear off the board.  When the board gets full and no possible moves left then the game is over.  See how many points you can make before it's over.

This is an updated and enhanced version of the one posted at the old forum.  This new one auto sizes to fit users desktop (not hard coded to a small resolution), the Hi Score is now saved to file, matches are now found both ways at the same time (row+col), and the board and pieces have a better look.

- Dav

Code: (Select All)
'=========
'MAKE5.bas v2.1
'=========
'A board clearing puzzle game.
'Clear the board of balls and score points.
'Make rows/colums of 5 or more of same color.
'Coded by Dav, JUL/2023 for QB64-Phoenix Edition.

'New for version 2.1:
'
'                    - Added _ICON call for Linux users.
'                      (Needed for QB64PE icon to be used by program)
'                    - Removed slow _MOUSEINPUT polling for faster method.
'                    - Because mouse is faster, the board size can now be
'                      bigger on larger desktops (not capped out as before).

'===========
'HOW TO PLAY:
'===========

'Colored balls will appear randomly on the playing board.
'Move bigger balls of same color next to each other to form
'rows and columns of the same color. Make a row/column of 5
'or more of same color to erase them and score points.

'Three new smaller balls will appear after every move.
'The smaller balls will grow into big ones on the next move.
'You may move the big balls on top of the smaller ones.

'The goal is to see how many points you can score before
'running out of board space, in which the game will end.

'High score is save to a 'make5.dat' file.

'You can press SPACE to restart game.

'=========================================================

_ICON

RANDOMIZE TIMER

'This game was originally designed in 600x650.
'Here's a way to adapt that code to adjust larger screens.
'The df is a small display fix for autosizing to desktop.
'The .80 means it will size up to 80% of desktop height
'We will add a *df to any x/y used in a command.
DIM SHARED df: df = (_DESKTOPHEIGHT / 600) * .80

'set original screen size, but use the df value.
SCREEN _NEWIMAGE(600 * df, 650 * df, 32)

DO: LOOP UNTIL _SCREENEXISTS
_TITLE "Make5 Puzzle"

'=== define board info
DIM SHARED rows, cols, size, score, hiscore
rows = 9: cols = 9: size = _WIDTH / cols
DIM SHARED box.v(rows * cols), box.s(rows * cols) 'value, size
DIM SHARED box.x(rows * cols), box.y(rows * cols) 'x/y's
DIM SHARED checks(rows * cols) 'extra array for checking
'
'=== load hi score from file
IF _FILEEXISTS("make5.dat") THEN
    scr = FREEFILE
    OPEN "make5.dat" FOR BINARY AS #scr
    hiscore = CVL(INPUT$(4, scr))
    IF hiscore < 0 THEN hiscore = 0 'a failsafe
    CLOSE #scr
END IF

'=======
restart:
'=======

PLAY "MBL32O3CEGEC"

score = 0

'CLS , _RGB(13, 13, 13)

bc = 1 'counter
FOR c = 1 TO cols
    FOR r = 1 TO rows
        x = (r * size) '(df is already computed in the 'size')
        y = (50 * df) + (c * size)
        box.x(bc) = x - size
        box.y(bc) = y - size
        box.v(bc) = 0 'zero means no color, empty box
        box.s(bc) = 1 ' 1 = small size piece
        bc = bc + 1
    NEXT
NEXT

MakeNewBalls 3, 1 'put 3 big balls on board
MakeNewBalls 3, 2 'put 3 small balls on board

'====
main:
'====

selected = 0

UpdateBoard

second: 'Go back here when making second choice
_DISPLAY

DO

    'wait until mouse button up to continue
    WHILE _MOUSEBUTTON(1) <> 0: n = _MOUSEINPUT: WEND

    WHILE _MOUSEINPUT: WEND

    'highlight box when a box is selected
    IF selected = 1 THEN
        LINE (box.x(t) + 2, box.y(t) + 2)-(box.x(t) + size - 2, box.y(t) + size - 2), _RGB(RND * 255, RND * 255, RND * 255), B
        LINE (box.x(t) + 3, box.y(t) + 3)-(box.x(t) + size - 3, box.y(t) + size - 3), _RGB(RND * 255, RND * 255, RND * 255), B
        LINE (box.x(t) + 4, box.y(t) + 4)-(box.x(t) + size - 4, box.y(t) + size - 4), _RGB(RND * 255, RND * 255, RND * 255), B
        _DISPLAY
    END IF


    'If user clicked mouse
    IF _MOUSEBUTTON(1) THEN

        'see where they clicked
        mx = _MOUSEX: my = _MOUSEY

        'cycle through all Check blocks...
        FOR t = 1 TO (rows * cols)

            'Block loction...
            tx = box.x(t): tx2 = box.x(t) + size
            ty = box.y(t): ty2 = box.y(t) + size

            'if clicked on a box clicked
            IF mx >= tx AND mx <= tx2 THEN
                IF my >= ty AND my <= ty2 THEN

                    'if this is a first choice...
                    IF selected = 0 THEN

                        'only select boxes not empty, with big size balls
                        IF box.v(t) <> 0 AND box.s(t) = 2 THEN
                            selected = 1
                            SOUND 3000, .1 'made a select
                            oldt = t
                            oldtv = box.v(t) 'save picked box number color
                            GOTO second 'now get second choice
                        END IF

                    END IF

                    IF selected = 1 THEN 'making second choice

                        'if selected an empty box or small ball
                        IF box.v(t) = 0 OR box.s(t) = 1 THEN

                            'swap 2nd box data
                            box.v(t) = oldtv
                            box.s(t) = 2
                            'erase 1st box data
                            box.v(oldt) = 0
                            box.s(oldt) = 1
                            SOUND 2000, .1
                            UpdateBoard
                            '===============================

                            'Grow small balls
                            FOR d = 1 TO rows * cols
                                IF box.v(d) <> 0 AND box.s(d) = 1 THEN box.s(d) = 2
                            NEXT

                            UpdateBoard

                            'copy current box values into checking array
                            FOR i = 1 TO (rows * cols)
                                checks(i) = box.v(i)
                            NEXT

                            'check Rows for 5 or more done
                            FOR i = 1 TO (rows * cols) STEP 9
                                CheckRow i
                            NEXT

                            'Check Cols for 5 or more
                            FOR i = 1 TO 9
                                CheckCol i
                            NEXT

                            'copy checking values back into box values
                            FOR i = 1 TO (rows * cols)
                                IF checks(i) = 0 THEN
                                    box.v(i) = 0: box.s(i) = 1
                                END IF
                            NEXT

                            'See how many boxes left to use...
                            howmany = 0
                            FOR h = 1 TO rows * cols
                                'empty ones
                                IF box.v(h) = 0 THEN howmany = howmany + 1
                            NEXT

                            'If not enough spaces left, game over
                            IF howmany < 3 THEN
                                LINE (200 * df, 250 * df)-(400 * df, 350 * df), _RGB(0, 0, 0), BF
                                LINE (200 * df, 250 * df)-(400 * df, 350 * df), _RGB(255, 255, 255), B
                                PPRINT 233 * df, 285 * df, 18 * df, _RGB(255, 255, 255), 0, "GAME OVER"
                                PLAY "mbl16o2bagfedc"
                                _DISPLAY: SLEEP 6
                                GOTO restart
                            END IF

                            'make 3 more random small balls
                            MakeNewBalls 3, 1
                            GOTO main

                        ELSE

                            'if clicked on another big ball instead...
                            IF box.s(t) = 2 THEN
                                'clear previous highlighted selection
                                selected = 0
                                UpdateBoard
                                selected = 1
                                oldt = t
                                oldtv = box.v(t) 'save picked box number color
                                SOUND 3000, .1
                                GOTO second
                            END IF

                        END IF

                    END IF

                END IF
            END IF

        NEXT

    END IF

    _DISPLAY

    IF INKEY$ = " " THEN GOTO restart

LOOP

SUB CheckRow (num)

    'space to hold box nums to clear
    REDIM nums(9)

    'found some to clear flag
    rdone = 0

    'set place and num
    rc = 1
    nums(1) = num

    'step through the boxes

    FOR r = (num + 1) TO (num + 8)

        'if this box is same as previous...
        IF box.s(r) = 2 AND box.v(r) = box.v(nums(rc)) THEN
            'store this box value in nums too
            nums(rc + 1) = r
            'increase how many so far
            rc = rc + 1
        ELSE
            'bot same, so reset

            IF rdone = 0 THEN
                'no more, so start over from here
                ERASE nums
                REDIM nums(9)
                rc = 1: nums(1) = r
            ELSE
                'no more can exists on line
                EXIT FOR
            END IF
        END IF

        'if there was 5 or more found
        IF rc >= 5 THEN rdone = 1

    NEXT

    'if group was found, clear
    IF rdone = 1 THEN
        PLAY "mbl32o3cdefga"
        'step through nums values
        FOR d = 1 TO 9
            IF nums(d) <> 0 THEN

                score = score + 55 '55 points per ball

                x = box.x(nums(d)): y = box.y(nums(d))
                LINE (x + 2, y + 2)-(x + size - 2, y + size - 2), _RGB(255, 255, 255), BF
                _DELAY .025: _DISPLAY
                LINE (x + 2, y + 2)-(x + size - 2, y + size - 2), _RGB(64, 64, 64), BF
                _DELAY .025: _DISPLAY
                checks(nums(d)) = 0 'mark checking array
            END IF
        NEXT
    END IF

    ERASE nums

END SUB

SUB CheckCol (num)

    'space to hold box nums to clear
    REDIM nums(9)

    'found some to clear flag
    rdone = 0

    'set place and num
    rc = 1
    nums(1) = num

    'step through the boxes

    FOR r = (num + 9) TO (rows * cols) STEP 9

        'if this box is same as previous...
        IF box.s(r) = 2 AND box.v(r) = box.v(nums(rc)) THEN
            'store this box value in nums too
            nums(rc + 1) = r
            'increase how many so far
            rc = rc + 1
        ELSE
            'bot same, so reset

            IF rdone = 0 THEN
                'no more, so start over from here
                ERASE nums
                REDIM nums(9)
                rc = 1: nums(1) = r
            ELSE
                'no more can exists on line
                EXIT FOR
            END IF
        END IF

        'if there was 5 or more found
        IF rc >= 5 THEN rdone = 1

    NEXT

    'if group was found, clear
    IF rdone = 1 THEN
        PLAY "mbl32o3cdefga"
        'step through nums values
        FOR d = 1 TO 9
            IF nums(d) <> 0 THEN
                score = score + 55 'add to score
                x = box.x(nums(d)): y = box.y(nums(d))
                LINE (x + 2, y + 2)-(x + size - 2, y + size - 2), _RGB(255, 255, 255), BF
                _DELAY .025: _DISPLAY
                LINE (x + 2, y + 2)-(x + size - 2, y + size - 2), _RGB(64, 64, 64), BF
                _DELAY .025: _DISPLAY
                checks(nums(d)) = 0 'mark checking array
            END IF
        NEXT
    END IF

    ERASE nums

END SUB


SUB UpdateBoard

    CLS , _RGB(96, 96, 96)

    PPRINT 20 * df, 14 * df, 15 * df, _RGB(255, 255, 0), 0, "SCORE:" + LTRIM$(STR$(score))
    IF score >= hiscore THEN
        hiscore = score
        SaveScore
    END IF
    PPRINT 475 * df, 14 * df, 15 * df, _RGB(255, 150, 150), 0, "HI:" + LTRIM$(STR$(hiscore))

    PPRINT 222 * df, 12 * df, 24 * df, _RGB(1, 1, 1), 0, "-=MAKE5=-"
    PPRINT 220 * df, 10 * df, 24 * df, _RGB(255, 255, 255), 0, "-=MAKE5=-"

    '=== draw board based on box values
    bc = 1 'counter
    FOR cl = 1 TO cols
        FOR ro = 1 TO rows
            '=== if empty box
            IF box.v(bc) = 0 THEN
                LINE (box.x(bc) + 2, box.y(bc) + 2)-(box.x(bc) + size - 2, box.y(bc) + size - 2), _RGB(32, 32, 32), BF
            ELSE
                LINE (box.x(bc) + 2, box.y(bc) + 2)-(box.x(bc) + size - 2, box.y(bc) + size - 2), _RGB(32, 32, 32), BF
                '=== draw color ball
                x2 = box.x(bc) + (size / 2) 'find middle of box
                y2 = box.y(bc) + (size / 2)
                IF box.s(bc) = 1 THEN sz = size / 4 ELSE sz = size / 2
                SELECT CASE box.v(bc)
                    CASE IS = 1: r = 255: g = 64: b = 64 'red
                    CASE IS = 2: r = 64: g = 232: b = 64 'green
                    CASE IS = 3: r = 64: g = 64: b = 255 'blue
                    CASE IS = 4: r = 255: g = 255: b = 0 'yellow
                    CASE IS = 5: r = 255: g = 255: b = 255 'white
                END SELECT
                'draw colored balls
                FOR s = 1 TO (sz - 4) STEP .3
                    CIRCLE (x2, y2), s, _RGB(r, g, b)
                    r = r - 1: g = g - 1: b = b - 1
                NEXT

            END IF
            bc = bc + 1
        NEXT
    NEXT

    'overlay a very faint QB64-PE icon on board
    _SETALPHA 16, , -11: _PUTIMAGE (0, 50 * df)-(_WIDTH, _HEIGHT), -11

    _DISPLAY
    _ICON _DISPLAY 'update app icon on taskbar
END SUB

SUB MakeNewBalls (num, ballsize)
    'Assign 3 new balls
    newball = 0
    DO
        c = INT((RND * (cols * rows)) + 1)
        IF box.v(c) = 0 THEN
            box.v(c) = INT((RND * 5) + 1)
            box.s(c) = ballsize
            newball = newball + 1
        END IF
        IF newball = num THEN EXIT DO
    LOOP
END SUB

SUB PPRINT (x, y, size, clr&, trans&, text$)
    orig& = _DEST
    bit = 32: IF _PIXELSIZE(0) = 1 THEN bit = 256
    FOR t = 0 TO LEN(text$) - 1
        pprintimg& = _NEWIMAGE(16, 16, bit)
        _DEST pprintimg&
        CLS , trans&: COLOR clr&
        PRINT MID$(text$, t + 1, 1);
        _CLEARCOLOR _RGB(0, 0, 0), pprintimg&
        _DEST orig&
        x1 = x + (t * size): x2 = x1 + size
        y1 = y: y2 = y + size
        _PUTIMAGE (x1 - (size / 2), y1)-(x2, y2 + (size / 3)), pprintimg&
        _FREEIMAGE pprintimg&
    NEXT
END SUB

SUB SaveScore
    'Out with the old
    IF _FILEEXISTS("make5.dat") THEN KILL "make5.dat"
    'In with the new
    scr = FREEFILE
    OPEN "make5.dat" FOR OUTPUT AS #scr
    hi$ = MKL$(hiscore)
    PRINT #scr, hi$;
    CLOSE #scr
END SUB

   

Print this item

  BAM Debugging features
Posted by: CharlieJV - 11-20-2022, 11:16 PM - Forum: QBJS, BAM, and Other BASICs - Replies (1)

Until I get around to building in some substantial features, the following took me all of a half hour to setup just to have something useful:

   

Print this item

  DAY 015: PRESET
Posted by: SMcNeill - 11-20-2022, 03:42 PM - Forum: Keyword of the Day! - Replies (3)

Everyone who knows graphics knows PSET.  Right?

Now, let's be honest -- How many of you guys think that PRESET is just a longhand version of PSET?  Same command, just with more typing!  After all, what's the difference between these two programs:

Code: (Select All)
$Color:32
Screen _NewImage(640, 480, 32)

For y = 0 To _Height
    For x = 0 To _Width
        If x Mod 10 < 5 Then
            If y Mod 10 < 5 Then PSet (x, y), Red Else PSet (x, y), Purple
        Else
            If y Mod 10 < 5 Then PSet (x, y), Gold Else PSet (x, y), Lime
        End If
    Next
Next

Sleep


And code 2:

Code: (Select All)
$Color:32
Screen _NewImage(640, 480, 32)

For y = 0 To _Height
    For x = 0 To _Width
        If x Mod 10 < 5 Then
            If y Mod 10 < 5 Then PReset (x, y), Red Else PReset (x, y), Purple
        Else
            If y Mod 10 < 5 Then PReset (x, y), Gold Else PReset (x, y), Lime
        End If
    Next
Next

Sleep


Stare at both those screens for a while -- try to focus one eye one each of them -- and see how long you can hold out before your brain melts.  That's got to be two of the most annoying tiling patterns possible for the human eyes to have to deal with...  Just looking at them, I somehow find them jarring and annoying.  

Yet, as annoying as those two tiling patterns are, they're exactly the same pattern.



So how the heck did PRESET behave any different at all from PSET?

Quick answer:  It didn't.  And for most folks, with the way they tend to code explicitly nowadays, it never will.



Most folks?  Code nowadays??  WTH is Steve talking about now??

Good question!

Today's modern coding practices have evolved quite a bit from back in the original days of computing.  Variable names are now long and descriptive, whereas in the past they were kept as short as possible to reduce memory usage.  Gotos are no longer in widespread use, as modern convention says to structure your programs better with DO..LOOPs and such.  Line numbers have faded from the wayside of coding practices...

...and so has the practice of writing code that relies implicitly upon previous settings.  For example:

Code: (Select All)
$Color:32
Screen _NewImage(640, 480, 32)

Color Pink

For y = 100 To 200
    For x = 100 To 200
        PSet (x, y)
    Next
Next

Sleep


Most modern programmers would set that PSET to become PSET (x, y), Pink, defining it explicitly in their code.  Old code used to use the style above, just to save a few bytes of memory when possible (not something we're so obsessed over with modern machines running 32GB+ of ram).  Don't specify a color -- just use the default color...

But, now that we have this older style in mind, let's take a look at PRESET:

Code: (Select All)
$Color:32
Screen _NewImage(640, 480, 32)

Cls , White
Color Pink

For y = 100 To 200
    For x = 100 To 200
        PReset (x, y)
    Next
Next

Sleep

If you notice, I cleared the whole screen white.  Specified my color to be Pink...  and somehow I drew a BLACK box??

WTH??  How'd that happen??

PSET, when no color is specified, defaults to your _DEFAULTCOLOR.   PRESET, when no color is specified, defaults to your _BACKGROUNDCOLOR.

Add a simple Print "Hello World" to the last program and see what you get -- pink text on a black background.

Black is the background color, and thus PRESET plots the points specified in black.

And that's the difference in the two commands in a nutshell:  PSET defaults to your primary color; PRESET defaults to your background color.  As long as you specify the color yourself, they both perform exactly the same.  It's only when no color is specified that you'll see the difference in the two commands.  Wink

Print this item

  3d surface images
Posted by: james2464 - 11-20-2022, 04:58 AM - Forum: Help Me! - Replies (45)

I've been trying to make this work but I'm stumped.

I messed around with a 3d points program by MasterGy and managed to get a sense of the space and coordinates.   There's something that I can't seem to grasp though...that's placing an image onto a surface (using _maptriangle).

In this program, I wanted to place an image on the 'floor'.   So I started by placing about 600 small tiles in a grid, exactly where I want to place the image.   But images always rotate towards the viewer.   Even the small tiles do this.   The grid of tiles (as a whole) doesn't do this - only each individual tile.   How to lay the image flat is what I'm trying to figure out.   

So if anyone here knows how this works....

I'll attach the image I'm trying to use but any 750x750 image will do.


Code: (Select All)
'Modified 3d points program by MasterGy


Screen _NewImage(1000, 600, 32)

whitewall = _NewImage(1000, 600, 32)
Line (1, 1)-(1000, 600), _RGB(180, 180, 180), BF
_PutImage (1, 1)-(1000, 600), 0, whitewall, (1, 1)-(1000, 600)
Cls
bluewall = _NewImage(100, 100, 32)
Line (1, 1)-(100, 100), _RGB(10, 10, 20), BF
_PutImage (1, 1)-(100, 100), 0, bluewall, (1, 1)-(100, 100)


octo = _LoadImage("octo.png", 32)
wall2 = _CopyImage(whitewall, 33)
floor = _CopyImage(bluewall, 33)
floor2 = _CopyImage(octo, 33)

'create spectator
Dim Shared sp(6)
sp(0) = 500
sp(1) = 1500
sp(2) = 400
sp(3) = 0 'looking in the direction of the observer XZ
sp(4) = 0 'looking in the direction of the observer YZ
sp(5) = 1 'multiplier X-Y see
sp(6) = 1 'multiplier Z see

'create screen
scr = _NewImage(1000, 1000 / _DesktopWidth * _DesktopHeight, 32)
Screen scr
_MouseHide
_FullScreen
_Dest scr
_DisplayOrder _Hardware , _Software

Do
    _Limit 40
    _PutImage (1, 1), wall2



    'draw floor tiles
    For ctx = 1 To 500 Step 20
        For cty = 1 To 500 Step 20
            ps = 2
            x = 0 + ps * ctx
            y = 0 + ps * cty
            z = 530
            rotate_to_maptriangle x, y, z 'position of floor tiles from the point of view of the observer

            _MapTriangle (0, 0)-(100, 0)-(0, 100), floor To(x - ps, y - ps, z)-(x + ps, y - ps, z)-(x - ps, y + ps, z)
            _MapTriangle (100, 100)-(100, 0)-(0, 100), floor To(x + ps, y + ps, z)-(x + ps, y - ps, z)-(x - ps, y + ps, z)
        Next cty
    Next ctx


    'draw octo floor

    ps = 500
    x = 500
    y = 500
    z = 30
    rotate_to_maptriangle x, y, z 'octo floor

    _MapTriangle (0, 0)-(750, 0)-(0, 750), floor2 To(x - ps, y - ps, z)-(x + ps, y - ps, z)-(x - ps, y + ps, z), , _Smooth
    _MapTriangle (750, 750)-(750, 0)-(0, 750), floor2 To(x + ps, y + ps, z)-(x + ps, y - ps, z)-(x - ps, y + ps, z), , _Smooth

    _Display





    'mouse input axis movement and mousewheel
    mousex = mousex * .6
    mousey = mousey * .6
    mw = 0
    While _MouseInput: mousex = mousex + _MouseMovementX: mousey = mousey + _MouseMovementY: mw = mw + _MouseWheel: Wend 'movement data read

    'control spectator
    mouse_sens = .001 'mouse rotating sensitive
    sp(3) = sp(3) - mousex * mouse_sens
    sp(4) = sp(4) + mousey * mouse_sens
    If Abs(sp(4)) > _Pi / 2 Then sp(4) = _Pi / 2 * Sgn(sp(4))
    vec_x = (Sin(sp(3)) * (Cos(sp(4) + _Pi)))
    vec_y = (Cos(sp(3)) * (Cos(sp(4) + _Pi)))
    vec_z = -Sin(sp(4) + _Pi)
    speed = 40 'moving speed
    moving = Abs(_MouseButton(1) Or _KeyDown(Asc("w"))) * speed - Abs(_MouseButton(2) Or _KeyDown(Asc("s"))) * speed
    sp(0) = sp(0) + vec_x * moving
    sp(1) = sp(1) + vec_y * moving
    sp(2) = sp(2) + vec_z * moving



Loop Until _KeyDown(27)

Sub rotate_to_maptriangle (x, y, z)
    x2 = x - sp(0)
    y2 = y - sp(1)
    z2 = z - sp(2)
    rotate_2d x2, y2, sp(3)
    rotate_2d y2, z2, sp(4) + _Pi / 2
    x = x2 * sp(5)
    y = y2 * sp(5)
    z = z2 * sp(6)
End Sub

Sub rotate_2d (x, y, ang)
    x1 = x * Cos(ang) - y * Sin(ang)
    y1 = x * Sin(ang) + y * Cos(ang)
    x = x1: y = y1
End Sub



Attached Files Thumbnail(s)
   
Print this item

  Extra Commas
Posted by: james2464 - 11-19-2022, 09:54 PM - Forum: Help Me! - Replies (7)

Just a little comma confusion on my part.

https://qb64phoenix.com/qb64wiki/index.php/MAPTRIANGLE

This is from example 3 - about the half-way point in the program:

Code: (Select All)
_MapTriangle (0, 0)-(255, 255)-(255, 0), TextureImage& To(xx3%, yy3%)-(xx1%, yy1%)-(xx4%, yy4%), , _Smooth

I'm not sure what the commas do at the end of the line. 


The same thing can be found in this example:

Code: (Select All)
Circle (400, 450), 10, _RGB32(100, 100, 100), , , .5


The only wording I've seen so far is on the circle wiki page which seems to suggest this is about "aspect".   I believe this changes the circle to an ellipse.   But no real mention of using 3 commas in a row as a plan of attack.   I'm starting to expect to see more inexplicable multiple commas as I read more program examples.
 
If anyone can explain this a bit more, please do.   Cheers!

Print this item

  Bitwise NOT, is this getting "opposite" colors???
Posted by: CharlieJV - 11-19-2022, 04:08 AM - Forum: General Discussion - Replies (5)

I was studying "Bitwise NOT", and just had this thought about what impact that would have on color when applied to each of the RGB values.

Is there any related "color theory" that discusses anything similar to this sample code I just wrote?

Code: (Select All)
screen _newimage(600,400,32)

dim as _unsigned _byte r,g,b,r2,g2,b2

again:
r = int(rnd*256)
g = int(rnd*256)
b = int(rnd*256)

r2 = not r
g2 = not g
b2 = not b

line (0, 0)-(200, 200),_rgb32(r,g,b),BF
line (300, 0)-(500, 200),_rgb32(r2,g2,b2),BF

_delay 0.5
goto again

Print this item

  Retro-Style Calculator
Posted by: CharlieJV - 11-18-2022, 11:26 PM - Forum: QBJS, BAM, and Other BASICs - Replies (3)

Note: I've got a few things I need to fix up to make this a QB64-compatible program.

As-is, it is a fun for-the-giggles bit of code to glance at.



EDIT: You'll notice a bit of a mixed bag of choices (like using GOSUB's and SUB's; every BAM program is an opportunity to do sanity checks on as many statements/styles I can squeeze in there without getting too messy.

Print this item

  efficient way to compare 2 images?
Posted by: madscijr - 11-18-2022, 07:51 PM - Forum: Help Me! - Replies (62)

Is there a fast way to test whether 2 images are exactly the same? 

Code: (Select All)
' ?????????????????????????????????????????????????????????????????????????????
' HOW MIGHT WE EFFICIENTLY COMPARE TWO IMAGES?
' ?????????????????????????????????????????????????????????????????????????????

Const FALSE = 0
Const TRUE = Not FALSE

_AutoDisplay
Screen _NewImage(1024, 768, 32): _Dest 0: Cls , cBlack
image1& = _NewImage(1024, 768, 32)
image2& = _NewImage(1024, 768, 32)

DrawSquare image1&, 50, 80, 100, cRed, cBlue
DrawSquare image2&, 50, 80, 100, cRed, cYellow

_Dest 0: Cls , cBlack
If image1& < -1 Then _PutImage , image1&, 0
Print "image1 (press any key)"
Sleep

_Dest 0: Cls , cBlack
If image2& < -1 Then _PutImage , image2&, 0
Print "image2 (press any key)"
Sleep

'compare image1& to image2&, the same?

' UPDATE image2 TO MATCH image1
_Dest image2&
Paint (55, 85), cBlue, cRed
'PAINT [STEP] (column%, row%), fillColor[, borderColor%]

_Dest 0: Cls , cBlack
If image2& < -1 Then _PutImage , image2&, 0
Print "image2 after change (press any key)"
Sleep

'compare image1& to image2&, the same?

' WAIT FOR KEYS
Sleep

' CLEAR IMAGES
Screen 0
If image1& < -1 Then _FreeImage image1&
If image2& < -1 Then _FreeImage image2&

System

Sub DrawSquare (img&, x1%, y1%, size%, fgcolor~&, bgcolor~&)
    Dim x2%, y2%
    If img& < -1 Then
        _Dest img& ': Cls , cEmpty

        x2% = (x1% + size%) - 1
        y2% = (y1% + size%) - 1

        Line (x1%, y1%)-(x2%, y1%), fgcolor~&, , 65535
        Line (x2%, y1%)-(x2%, y2%), fgcolor~&, , 65535
        Line (x2%, y2%)-(x1%, y2%), fgcolor~&, , 65535
        Line (x1%, y2%)-(x1%, y1%), fgcolor~&, , 65535

        If bgcolor~& <> cEmpty Then
            'PAINT [STEP] (column%, row%), fillColor[, borderColor%]
            Paint (x1% + 1, y1% + 1), bgcolor~&, fgcolor~&
        End If
    End If
End Sub ' Draw Square

Function cBlack~& ()
    cBlack = _RGB32(0, 0, 0)
End Function ' cBlack~&
Function cGray~& ()
    cGray = _RGB32(128, 128, 128)
End Function ' cGray~&
Function cWhite~& ()
    cWhite = _RGB32(255, 255, 255)
End Function ' cWhite~&
Function cRed~& ()
    cRed = _RGB32(255, 0, 0)
End Function
Function cOrange~& ()
    cOrange = _RGB32(255, 165, 0)
End Function ' cOrange~&
Function cYellow~& ()
    cYellow = _RGB32(255, 255, 0)
End Function ' cYellow~&
Function cLime~& ()
    cLime = _RGB32(0, 255, 0)
End Function ' cLime~&
Function cCyan~& ()
    cCyan = _RGB32(0, 255, 255)
End Function ' cCyan~&
Function cBlue~& ()
    cBlue = _RGB32(0, 0, 255)
End Function ' cBlue~&
Function cPurple~& ()
    cPurple = _RGB32(128, 0, 255)
End Function ' cPurple~&
Function cMagenta~& ()
    cMagenta = _RGB32(255, 0, 255)
End Function ' cMagenta~&
Function cEmpty~& ()
    cEmpty = _RGB32(0, 0, 0, 0)
End Function ' cEmpty~&

Print this item