Welcome, Guest |
You have to register before you can post on our site.
|
Latest Threads |
1990's 3D Doom-Like Walls...
Forum: Programs
Last Post: a740g
32 minutes ago
» Replies: 10
» Views: 270
|
QBJS v0.9.0 - Release
Forum: QBJS, BAM, and Other BASICs
Last Post: grymmjack
1 hour ago
» Replies: 16
» Views: 254
|
Editor WIP
Forum: bplus
Last Post: aadityap0901
9 hours ago
» Replies: 12
» Views: 674
|
Fun with Ray Casting
Forum: a740g
Last Post: a740g
Today, 02:36 AM
» Replies: 2
» Views: 71
|
Big problem for me.
Forum: General Discussion
Last Post: bplus
Today, 12:20 AM
» Replies: 7
» Views: 110
|
discover graphics with xa...
Forum: Programs
Last Post: hsiangch_ong
Yesterday, 10:39 PM
» Replies: 0
» Views: 29
|
another variation of "10 ...
Forum: Programs
Last Post: Jack002
Yesterday, 10:05 PM
» Replies: 37
» Views: 717
|
Aloha from Maui guys.
Forum: General Discussion
Last Post: doppler
Yesterday, 03:32 PM
» Replies: 14
» Views: 368
|
Cautionary tale of open, ...
Forum: General Discussion
Last Post: doppler
Yesterday, 03:28 PM
» Replies: 0
» Views: 37
|
Extended KotD #22: _MOUSE...
Forum: Keyword of the Day!
Last Post: SMcNeill
Yesterday, 12:29 AM
» Replies: 0
» Views: 59
|
|
|
Day 026: ERASE |
Posted by: Pete - 12-07-2022, 07:24 AM - Forum: Keyword of the Day!
- Replies (12)
|
|
ERASE probably should be renamed ARRase, because all it erases is the values stored in a specified array.
ERRASE makes the strings assigned to an array null or makes the numeric values assigned to a numeric array zero.
ERASE ArrayName [, others...]
Example:
Code: (Select All) DIM Pete(10) AS STRING, var(100) AS INTEGER, cnt(20) AS LONG
ERASE Pete, var, cnt
ERASE can be used with STATIC or DYNAMIC arrays, but there is an important difference. Try running the two following code snippets.
Code: (Select All) DIM Pete(1 TO 20) AS INTEGER ' DIM makes Pete a STATIC array.
FOR i = 1 TO 20
Pete(i) = -i
NEXT
FOR i = 1 TO UBOUND(Pete)
PRINT Pete(i)
NEXT
SLEEP
ERASE Pete
' All zeros will now be output.
CLS
FOR i = 1 TO 20
PRINT Pete(i)
NEXT
PRINT " ubound(Pete) is still ="; UBOUND(Pete)
Pete(15) = 101
PRINT: PRINT " Pete(15) ="; Pete(15)
Note: This routine will error out unless we Re-initialize the Pete array.
Code: (Select All) REDIM Pete(1 TO 20) AS INTEGER ' REDIM makes Pete a DYNAMIC array.
FOR i = 1 TO 20
Pete(i) = -i
NEXT
FOR i = 1 TO UBOUND(Pete)
PRINT Pete(i)
NEXT
SLEEP
ERASE Pete
' This will error out unless we do a REDIM Pete(1 TO 20) here.
CLS
FOR i = 1 TO 20
PRINT Pete(i)
NEXT
PRINT " ubound(Pete) is still ="; UBOUND(Pete)
Pete(15) = 101
PRINT: PRINT " Pete(15) ="; Pete(15)
So ERASE appears to have more value and versatility when used with STATIC arrays, if you consider not de-initialing your array as a benefit.
And what makes an array either static or dynamic? Well...
DIM makes the array static.
REDIM makes the array dynamic
And this important note...
REM $DYNAMIC makes ALL arrays dynamic. So even...
Code: (Select All) REM $DYNAMIC
DIM Pete(1 to 20)
ERASE Pete
REDIM Pete(1 to 20)
...makes the otherwise static DIM array, of Pete, dynamic. So if you use REM $DYNAMIC at the top of your code, use REDIM because a DIM statement after an ERASE statement won't work with REM DYNAMIC in your code.
REM $STATIC makes ALL arrays static. but...
Code: (Select All) REM $STATIC
REDIM Pete(1 to 20) ' Change to DIM to get this to work.
ERASE Pete
PRINT Pete(15) ' Errors out because even though we used REM $STATIC REDIM messed it up.
So we've kicked the tires quite a bit here. Anyone want to add anything more?
Pete
|
|
|
Color Valuenator(tm) by Steve the Awesome(tm)(c) |
Posted by: SMcNeill - 12-07-2022, 06:40 AM - Forum: Utilities
- Replies (12)
|
|
This... This was something to work up...
I thought I was starting with a simple little idea for a quick project, and then I ended up over-engineering the BLEEP out of this little booger!
Code: (Select All) _Title "Color Valuenator(tm) by Steve the Awesome(tm)(c)"
$Color:32
Color 15
Print "Hello World! Be in awe of my Color Valuenator!!(tm)"
Print ColorValue("_RGB32(128,128,128)"), _RGB32(128, 128, 128)
Print ColorValue("15"), 15
Print ColorValue("RGB(255,0,0)"), _RGB(255, 0, 0)
Print ColorValue("Black"), Black
Print ColorValue("Red"), Red
Print ColorValue("_RGB32(37)"), _RGB32(37)
Print ColorValue("Frog"), Frog, "<-- -1 says invalid color value"
Function ColorValue&& (text$)
ReDim values(1000) As String
ColorValue = -1 'This is to report a failed attempt to get a valid color.
' All valid colors will be greater than -1, so be certain the return variable is an _INTEGER64 type
' so that this -1 value doesn't overflow and become bright white (most likely), or some other color
If IsNum(text$) Then 'our color is either in plain number form (COLOR 15, for example), or hex form (&HFFFFFFFF, for example)
temp&& = Val(text$)
If temp&& >= 0 Then
ColorValue = temp&&
Else
If temp&& >= -2147483648 Then 'it's probably a color, but in LONG (signed) format. Let's convert it automagically and roll with it.
temp& = temp&&
ColorValue = temp&
End If
End If
Else
temp$ = _Trim$(UCase$(text$))
If Left$(temp$, 7) = "_RGBA32" Or Left$(temp$, 6) = "RGBA32" Then 'It's in RGBA32 format
If ParseValues(text$, values()) <> 4 Then ColorValue = -1: Exit Function
r% = Val(values(1))
g% = Val(values(2))
b% = Val(values(3))
a% = Val(values(4))
ColorValue = _RGBA32(r%, g%, b%, a%)
ElseIf Left$(temp$, 5) = "_RGBA" Or Left$(temp$, 4) = "RGBA" Then 'It's in RGBA format
p = ParseValues(text$, values())
If p < 4 Or p > 5 Then ColorValue = -1: Exit Function
r% = Val(values(1))
g% = Val(values(2))
b% = Val(values(3))
a% = Val(values(4))
If p = 5 Then
d% = Val(values(5)) 'the destination of the screen whose palette we're matching against
ColorValue = _RGBA(r%, g%, b%, a%, d%)
Else
ColorValue = _RGBA(r%, g%, b%, a%) 'note that this value will change depending upon the screen that it's called from
'RGBA tries to match the called value to the closest possible color match that the existing palette has.
End If
ElseIf Left$(temp$, 6) = "_RGB32" Or Left$(temp$, 5) = "RGB32" Then 'It's in RGB32 format
p = ParseValues(text$, values())
Select Case p
Case 4 '_RGB32(num, num2, num3, num4) <-- this is RGBA format
r% = Val(values(1))
g% = Val(values(2))
b% = Val(values(3))
a% = Val(values(4))
ColorValue = _RGBA32(r%, g%, b%, a%)
Case 3 ' _RGB32(num, num2, num3) <-- this is RGB format
r% = Val(values(1))
g% = Val(values(2))
b% = Val(values(3))
ColorValue = _RGB32(r%, g%, b%)
Case 2 ' _RGB32(num, num2) <-- Grayscale with alpha
r% = Val(values(1))
g% = Val(values(2))
ColorValue = _RGB32(r%, g%)
Case 1 ' _RGB32(num) <-- Grayscale alone
r% = Val(values(1))
ColorValue = _RGB32(r%)
Case Else
ColorValue = -1: Exit Function '<-- can not return a valid color value
End Select
ElseIf Left$(temp$, 4) = "_RGB" Or Left$(temp$, 3) = "RGB" Then 'It's in RGB format
p = ParseValues(text$, values())
If p < 3 Or p > 4 Then ColorValue = -1: Exit Function
r% = Val(values(1))
g% = Val(values(2))
b% = Val(values(3))
If p = 4 Then
d% = Val(values(4)) 'the destination of the screen whose palette we're matching against
ColorValue = _RGB(r%, g%, b%, d%)
Else
ColorValue = _RGB(r%, g%, b%) 'note that this value will change depending upon the screen that it's called from
'RGBA tries to match the called value to the closest possible color match that the existing palette has.
End If
Else 'check to see if it's a color name value
ReDim kolor$(1000), value(1000) As _Integer64
count = count + 1: kolor$(count) = "AliceBlue": value(count) = 4293982463
count = count + 1: kolor$(count) = "Almond": value(count) = 4293910221
count = count + 1: kolor$(count) = "AntiqueBrass": value(count) = 4291663221
count = count + 1: kolor$(count) = "AntiqueWhite": value(count) = 4294634455
count = count + 1: kolor$(count) = "Apricot": value(count) = 4294826421
count = count + 1: kolor$(count) = "Aqua": value(count) = 4278255615
count = count + 1: kolor$(count) = "Aquamarine": value(count) = 4286578644
count = count + 1: kolor$(count) = "Asparagus": value(count) = 4287080811
count = count + 1: kolor$(count) = "AtomicTangerine": value(count) = 4294943860
count = count + 1: kolor$(count) = "Azure": value(count) = 4293984255
count = count + 1: kolor$(count) = "BananaMania": value(count) = 4294633397
count = count + 1: kolor$(count) = "Beaver": value(count) = 4288643440
count = count + 1: kolor$(count) = "Beige": value(count) = 4294309340
count = count + 1: kolor$(count) = "Bisque": value(count) = 4294960324
count = count + 1: kolor$(count) = "Bittersweet": value(count) = 4294802542
count = count + 1: kolor$(count) = "Black": value(count) = 4278190080
count = count + 1: kolor$(count) = "BlanchedAlmond": value(count) = 4294962125
count = count + 1: kolor$(count) = "BlizzardBlue": value(count) = 4289521134
count = count + 1: kolor$(count) = "Blue": value(count) = 4278190335
count = count + 1: kolor$(count) = "BlueBell": value(count) = 4288848592
count = count + 1: kolor$(count) = "BlueGray": value(count) = 4284914124
count = count + 1: kolor$(count) = "BlueGreen": value(count) = 4279081146
count = count + 1: kolor$(count) = "BlueViolet": value(count) = 4287245282
count = count + 1: kolor$(count) = "Blush": value(count) = 4292763011
count = count + 1: kolor$(count) = "BrickRed": value(count) = 4291510612
count = count + 1: kolor$(count) = "Brown": value(count) = 4289014314
count = count + 1: kolor$(count) = "BurlyWood": value(count) = 4292786311
count = count + 1: kolor$(count) = "BurntOrange": value(count) = 4294934345
count = count + 1: kolor$(count) = "BurntSienna": value(count) = 4293557853
count = count + 1: kolor$(count) = "CadetBlue": value(count) = 4284456608
count = count + 1: kolor$(count) = "Canary": value(count) = 4294967193
count = count + 1: kolor$(count) = "CaribbeanGreen": value(count) = 4280079266
count = count + 1: kolor$(count) = "CarnationPink": value(count) = 4294945484
count = count + 1: kolor$(count) = "Cerise": value(count) = 4292691090
count = count + 1: kolor$(count) = "Cerulean": value(count) = 4280134870
count = count + 1: kolor$(count) = "ChartReuse": value(count) = 4286578432
count = count + 1: kolor$(count) = "Chestnut": value(count) = 4290534744
count = count + 1: kolor$(count) = "Chocolate": value(count) = 4291979550
count = count + 1: kolor$(count) = "Copper": value(count) = 4292711541
count = count + 1: kolor$(count) = "Coral": value(count) = 4294934352
count = count + 1: kolor$(count) = "Cornflower": value(count) = 4288335595
count = count + 1: kolor$(count) = "CornflowerBlue": value(count) = 4284782061
count = count + 1: kolor$(count) = "Cornsilk": value(count) = 4294965468
count = count + 1: kolor$(count) = "CottonCandy": value(count) = 4294950105
count = count + 1: kolor$(count) = "CrayolaAquamarine": value(count) = 4286110690
count = count + 1: kolor$(count) = "CrayolaBlue": value(count) = 4280251902
count = count + 1: kolor$(count) = "CrayolaBlueViolet": value(count) = 4285753021
count = count + 1: kolor$(count) = "CrayolaBrown": value(count) = 4290013005
count = count + 1: kolor$(count) = "CrayolaCadetBlue": value(count) = 4289771462
count = count + 1: kolor$(count) = "CrayolaForestGreen": value(count) = 4285378177
count = count + 1: kolor$(count) = "CrayolaGold": value(count) = 4293379735
count = count + 1: kolor$(count) = "CrayolaGoldenrod": value(count) = 4294760821
count = count + 1: kolor$(count) = "CrayolaGray": value(count) = 4287992204
count = count + 1: kolor$(count) = "CrayolaGreen": value(count) = 4280069240
count = count + 1: kolor$(count) = "CrayolaGreenYellow": value(count) = 4293978257
count = count + 1: kolor$(count) = "CrayolaIndigo": value(count) = 4284315339
count = count + 1: kolor$(count) = "CrayolaLavender": value(count) = 4294751445
count = count + 1: kolor$(count) = "CrayolaMagenta": value(count) = 4294337711
count = count + 1: kolor$(count) = "CrayolaMaroon": value(count) = 4291311706
count = count + 1: kolor$(count) = "CrayolaMidnightBlue": value(count) = 4279912566
count = count + 1: kolor$(count) = "CrayolaOrange": value(count) = 4294931768
count = count + 1: kolor$(count) = "CrayolaOrangeRed": value(count) = 4294912811
count = count + 1: kolor$(count) = "CrayolaOrchid": value(count) = 4293306583
count = count + 1: kolor$(count) = "CrayolaPlum": value(count) = 4287513989
count = count + 1: kolor$(count) = "CrayolaRed": value(count) = 4293795917
count = count + 1: kolor$(count) = "CrayolaSalmon": value(count) = 4294941610
count = count + 1: kolor$(count) = "CrayolaSeaGreen": value(count) = 4288668351
count = count + 1: kolor$(count) = "CrayolaSilver": value(count) = 4291675586
count = count + 1: kolor$(count) = "CrayolaSkyBlue": value(count) = 4286634731
count = count + 1: kolor$(count) = "CrayolaSpringGreen": value(count) = 4293716670
count = count + 1: kolor$(count) = "CrayolaTann": value(count) = 4294616940
count = count + 1: kolor$(count) = "CrayolaThistle": value(count) = 4293642207
count = count + 1: kolor$(count) = "CrayolaViolet": value(count) = 4287786670
count = count + 1: kolor$(count) = "CrayolaYellow": value(count) = 4294764675
count = count + 1: kolor$(count) = "CrayolaYellowGreen": value(count) = 4291158916
count = count + 1: kolor$(count) = "Crimson": value(count) = 4292613180
count = count + 1: kolor$(count) = "Cyan": value(count) = 4278255615
count = count + 1: kolor$(count) = "Dandelion": value(count) = 4294826861
count = count + 1: kolor$(count) = "DarkBlue": value(count) = 4278190219
count = count + 1: kolor$(count) = "DarkCyan": value(count) = 4278225803
count = count + 1: kolor$(count) = "DarkGoldenRod": value(count) = 4290283019
count = count + 1: kolor$(count) = "DarkGray": value(count) = 4289309097
count = count + 1: kolor$(count) = "DarkGreen": value(count) = 4278215680
count = count + 1: kolor$(count) = "DarkKhaki": value(count) = 4290623339
count = count + 1: kolor$(count) = "DarkMagenta": value(count) = 4287299723
count = count + 1: kolor$(count) = "DarkOliveGreen": value(count) = 4283788079
count = count + 1: kolor$(count) = "DarkOrange": value(count) = 4294937600
count = count + 1: kolor$(count) = "DarkOrchid": value(count) = 4288230092
count = count + 1: kolor$(count) = "DarkRed": value(count) = 4287299584
count = count + 1: kolor$(count) = "DarkSalmon": value(count) = 4293498490
count = count + 1: kolor$(count) = "DarkSeaGreen": value(count) = 4287609999
count = count + 1: kolor$(count) = "DarkSlateBlue": value(count) = 4282924427
count = count + 1: kolor$(count) = "DarkSlateGray": value(count) = 4281290575
count = count + 1: kolor$(count) = "DarkTurquoise": value(count) = 4278243025
count = count + 1: kolor$(count) = "DarkViolet": value(count) = 4287889619
count = count + 1: kolor$(count) = "DeepPink": value(count) = 4294907027
count = count + 1: kolor$(count) = "DeepSkyBlue": value(count) = 4278239231
count = count + 1: kolor$(count) = "Denim": value(count) = 4281035972
count = count + 1: kolor$(count) = "DesertSand": value(count) = 4293905848
count = count + 1: kolor$(count) = "DimGray": value(count) = 4285098345
count = count + 1: kolor$(count) = "DodgerBlue": value(count) = 4280193279
count = count + 1: kolor$(count) = "Eggplant": value(count) = 4285419872
count = count + 1: kolor$(count) = "ElectricLime": value(count) = 4291755805
count = count + 1: kolor$(count) = "Fern": value(count) = 4285643896
count = count + 1: kolor$(count) = "FireBrick": value(count) = 4289864226
count = count + 1: kolor$(count) = "Floralwhite": value(count) = 4294966000
count = count + 1: kolor$(count) = "ForestGreen": value(count) = 4280453922
count = count + 1: kolor$(count) = "Fuchsia": value(count) = 4290995397
count = count + 1: kolor$(count) = "FuzzyWuzzy": value(count) = 4291585638
count = count + 1: kolor$(count) = "Gainsboro": value(count) = 4292664540
count = count + 1: kolor$(count) = "GhostWhite": value(count) = 4294506751
count = count + 1: kolor$(count) = "Gold": value(count) = 4294956800
count = count + 1: kolor$(count) = "GoldenRod": value(count) = 4292519200
count = count + 1: kolor$(count) = "GrannySmithApple": value(count) = 4289258656
count = count + 1: kolor$(count) = "Gray": value(count) = 4286611584
count = count + 1: kolor$(count) = "Green": value(count) = 4278222848
count = count + 1: kolor$(count) = "GreenBlue": value(count) = 4279329972
count = count + 1: kolor$(count) = "GreenYellow": value(count) = 4289593135
count = count + 1: kolor$(count) = "Grey": value(count) = 4286611584
count = count + 1: kolor$(count) = "HoneyDew": value(count) = 4293984240
count = count + 1: kolor$(count) = "HotMagenta": value(count) = 4294909390
count = count + 1: kolor$(count) = "HotPink": value(count) = 4294928820
count = count + 1: kolor$(count) = "Inchworm": value(count) = 4289915997
count = count + 1: kolor$(count) = "IndianRed": value(count) = 4291648604
count = count + 1: kolor$(count) = "Indigo": value(count) = 4283105410
count = count + 1: kolor$(count) = "Ivory": value(count) = 4294967280
count = count + 1: kolor$(count) = "JazzberryJam": value(count) = 4291442535
count = count + 1: kolor$(count) = "JungleGreen": value(count) = 4282101903
count = count + 1: kolor$(count) = "Khaki": value(count) = 4293977740
count = count + 1: kolor$(count) = "LaserLemon": value(count) = 4294901282
count = count + 1: kolor$(count) = "Lavender": value(count) = 4293322490
count = count + 1: kolor$(count) = "LavenderBlush": value(count) = 4294963445
count = count + 1: kolor$(count) = "LawnGreen": value(count) = 4286381056
count = count + 1: kolor$(count) = "LemonChiffon": value(count) = 4294965965
count = count + 1: kolor$(count) = "LemonYellow": value(count) = 4294964303
count = count + 1: kolor$(count) = "LightBlue": value(count) = 4289583334
count = count + 1: kolor$(count) = "LightCoral": value(count) = 4293951616
count = count + 1: kolor$(count) = "LightCyan": value(count) = 4292935679
count = count + 1: kolor$(count) = "LightGoldenRodYellow": value(count) = 4294638290
count = count + 1: kolor$(count) = "LightGray": value(count) = 4292072403
count = count + 1: kolor$(count) = "LightGreen": value(count) = 4287688336
count = count + 1: kolor$(count) = "LightPink": value(count) = 4294948545
count = count + 1: kolor$(count) = "LightSalmon": value(count) = 4294942842
count = count + 1: kolor$(count) = "LightSeaGreen": value(count) = 4280332970
count = count + 1: kolor$(count) = "LightSkyBlue": value(count) = 4287090426
count = count + 1: kolor$(count) = "LightSlateGray": value(count) = 4286023833
count = count + 1: kolor$(count) = "LightSteelBlue": value(count) = 4289774814
count = count + 1: kolor$(count) = "LightYellow": value(count) = 4294967264
count = count + 1: kolor$(count) = "Lime": value(count) = 4278255360
count = count + 1: kolor$(count) = "LimeGreen": value(count) = 4281519410
count = count + 1: kolor$(count) = "Linen": value(count) = 4294635750
count = count + 1: kolor$(count) = "MacaroniAndCheese": value(count) = 4294950280
count = count + 1: kolor$(count) = "Magenta": value(count) = 4294902015
count = count + 1: kolor$(count) = "MagicMint": value(count) = 4289392849
count = count + 1: kolor$(count) = "Mahogany": value(count) = 4291643980
count = count + 1: kolor$(count) = "Maize": value(count) = 4293775772
count = count + 1: kolor$(count) = "Manatee": value(count) = 4288125610
count = count + 1: kolor$(count) = "MangoTango": value(count) = 4294935107
count = count + 1: kolor$(count) = "Maroon": value(count) = 4286578688
count = count + 1: kolor$(count) = "Mauvelous": value(count) = 4293892266
count = count + 1: kolor$(count) = "MediumAquamarine": value(count) = 4284927402
count = count + 1: kolor$(count) = "MediumBlue": value(count) = 4278190285
count = count + 1: kolor$(count) = "MediumOrchid": value(count) = 4290401747
count = count + 1: kolor$(count) = "MediumPurple": value(count) = 4287852763
count = count + 1: kolor$(count) = "MediumSeaGreen": value(count) = 4282168177
count = count + 1: kolor$(count) = "MediumSlateBlue": value(count) = 4286277870
count = count + 1: kolor$(count) = "MediumSpringGreen": value(count) = 4278254234
count = count + 1: kolor$(count) = "MediumTurquoise": value(count) = 4282962380
count = count + 1: kolor$(count) = "MediumVioletRed": value(count) = 4291237253
count = count + 1: kolor$(count) = "Melon": value(count) = 4294818996
count = count + 1: kolor$(count) = "MidnightBlue": value(count) = 4279834992
count = count + 1: kolor$(count) = "MintCream": value(count) = 4294311930
count = count + 1: kolor$(count) = "MistyRose": value(count) = 4294960353
count = count + 1: kolor$(count) = "Moccasin": value(count) = 4294960309
count = count + 1: kolor$(count) = "MountainMeadow": value(count) = 4281383567
count = count + 1: kolor$(count) = "Mulberry": value(count) = 4291120012
count = count + 1: kolor$(count) = "NavajoWhite": value(count) = 4294958765
count = count + 1: kolor$(count) = "Navy": value(count) = 4278190208
count = count + 1: kolor$(count) = "NavyBlue": value(count) = 4279858386
count = count + 1: kolor$(count) = "NeonCarrot": value(count) = 4294943555
count = count + 1: kolor$(count) = "OldLace": value(count) = 4294833638
count = count + 1: kolor$(count) = "Olive": value(count) = 4286611456
count = count + 1: kolor$(count) = "OliveDrab": value(count) = 4285238819
count = count + 1: kolor$(count) = "OliveGreen": value(count) = 4290426988
count = count + 1: kolor$(count) = "Orange": value(count) = 4294944000
count = count + 1: kolor$(count) = "OrangeRed": value(count) = 4294919424
count = count + 1: kolor$(count) = "OrangeYellow": value(count) = 4294497640
count = count + 1: kolor$(count) = "Orchid": value(count) = 4292505814
count = count + 1: kolor$(count) = "OuterSpace": value(count) = 4282468940
count = count + 1: kolor$(count) = "OutrageousOrange": value(count) = 4294929994
count = count + 1: kolor$(count) = "PacificBlue": value(count) = 4280068553
count = count + 1: kolor$(count) = "PaleGoldenRod": value(count) = 4293847210
count = count + 1: kolor$(count) = "PaleGreen": value(count) = 4288215960
count = count + 1: kolor$(count) = "PaleTurquoise": value(count) = 4289720046
count = count + 1: kolor$(count) = "PaleVioletRed": value(count) = 4292571283
count = count + 1: kolor$(count) = "PapayaWhip": value(count) = 4294963157
count = count + 1: kolor$(count) = "Peach": value(count) = 4294954923
count = count + 1: kolor$(count) = "PeachPuff": value(count) = 4294957753
count = count + 1: kolor$(count) = "Periwinkle": value(count) = 4291154150
count = count + 1: kolor$(count) = "Peru": value(count) = 4291659071
count = count + 1: kolor$(count) = "PiggyPink": value(count) = 4294827494
count = count + 1: kolor$(count) = "PineGreen": value(count) = 4279599224
count = count + 1: kolor$(count) = "Pink": value(count) = 4294951115
count = count + 1: kolor$(count) = "PinkFlamingo": value(count) = 4294735101
count = count + 1: kolor$(count) = "PinkSherbet": value(count) = 4294414247
count = count + 1: kolor$(count) = "Plum": value(count) = 4292714717
count = count + 1: kolor$(count) = "PowderBlue": value(count) = 4289781990
count = count + 1: kolor$(count) = "Purple": value(count) = 4286578816
count = count + 1: kolor$(count) = "PurpleHeart": value(count) = 4285809352
count = count + 1: kolor$(count) = "PurpleMountainsMajesty": value(count) = 4288512442
count = count + 1: kolor$(count) = "PurplePizzazz": value(count) = 4294856410
count = count + 1: kolor$(count) = "RadicalRed": value(count) = 4294920556
count = count + 1: kolor$(count) = "RawSienna": value(count) = 4292250201
count = count + 1: kolor$(count) = "RawUmber": value(count) = 4285614883
count = count + 1: kolor$(count) = "RazzleDazzleRose": value(count) = 4294920400
count = count + 1: kolor$(count) = "Razzmatazz": value(count) = 4293076331
count = count + 1: kolor$(count) = "Red": value(count) = 4294901760
count = count + 1: kolor$(count) = "RedOrange": value(count) = 4294923081
count = count + 1: kolor$(count) = "RedViolet": value(count) = 4290790543
count = count + 1: kolor$(count) = "RobinsEggBlue": value(count) = 4280274635
count = count + 1: kolor$(count) = "RosyBrown": value(count) = 4290547599
count = count + 1: kolor$(count) = "RoyalBlue": value(count) = 4282477025
count = count + 1: kolor$(count) = "RoyalPurple": value(count) = 4286075305
count = count + 1: kolor$(count) = "SaddleBrown": value(count) = 4287317267
count = count + 1: kolor$(count) = "Salmon": value(count) = 4294606962
count = count + 1: kolor$(count) = "SandyBrown": value(count) = 4294222944
count = count + 1: kolor$(count) = "Scarlet": value(count) = 4294715463
count = count + 1: kolor$(count) = "ScreaminGreen": value(count) = 4285988730
count = count + 1: kolor$(count) = "SeaGreen": value(count) = 4281240407
count = count + 1: kolor$(count) = "SeaShell": value(count) = 4294964718
count = count + 1: kolor$(count) = "Sepia": value(count) = 4289030479
count = count + 1: kolor$(count) = "Shadow": value(count) = 4287265117
count = count + 1: kolor$(count) = "Shamrock": value(count) = 4282764962
count = count + 1: kolor$(count) = "ShockingPink": value(count) = 4294672125
count = count + 1: kolor$(count) = "Sienna": value(count) = 4288696877
count = count + 1: kolor$(count) = "Silver": value(count) = 4290822336
count = count + 1: kolor$(count) = "SkyBlue": value(count) = 4287090411
count = count + 1: kolor$(count) = "SlateBlue": value(count) = 4285160141
count = count + 1: kolor$(count) = "SlateGray": value(count) = 4285563024
count = count + 1: kolor$(count) = "Snow": value(count) = 4294966010
count = count + 1: kolor$(count) = "SpringGreen": value(count) = 4278255487
count = count + 1: kolor$(count) = "SteelBlue": value(count) = 4282811060
count = count + 1: kolor$(count) = "Sunglow": value(count) = 4294954824
count = count + 1: kolor$(count) = "SunsetOrange": value(count) = 4294794835
count = count + 1: kolor$(count) = "Tann": value(count) = 4291998860
count = count + 1: kolor$(count) = "Teal": value(count) = 4278222976
count = count + 1: kolor$(count) = "TealBlue": value(count) = 4279805877
count = count + 1: kolor$(count) = "Thistle": value(count) = 4292394968
count = count + 1: kolor$(count) = "TickleMePink": value(count) = 4294740396
count = count + 1: kolor$(count) = "Timberwolf": value(count) = 4292597714
count = count + 1: kolor$(count) = "Tomato": value(count) = 4294927175
count = count + 1: kolor$(count) = "TropicalRainForest": value(count) = 4279730285
count = count + 1: kolor$(count) = "Tumbleweed": value(count) = 4292782728
count = count + 1: kolor$(count) = "Turquoise": value(count) = 4282441936
count = count + 1: kolor$(count) = "TurquoiseBlue": value(count) = 4286045671
count = count + 1: kolor$(count) = "UnmellowYellow": value(count) = 4294967142
count = count + 1: kolor$(count) = "Violet": value(count) = 4293821166
count = count + 1: kolor$(count) = "VioletBlue": value(count) = 4281486002
count = count + 1: kolor$(count) = "VioletRed": value(count) = 4294398868
count = count + 1: kolor$(count) = "VividTangerine": value(count) = 4294942857
count = count + 1: kolor$(count) = "VividViolet": value(count) = 4287582365
count = count + 1: kolor$(count) = "Wheat": value(count) = 4294303411
count = count + 1: kolor$(count) = "White": value(count) = 4294967295
count = count + 1: kolor$(count) = "Whitesmoke": value(count) = 4294309365
count = count + 1: kolor$(count) = "WildBlueYonder": value(count) = 4288851408
count = count + 1: kolor$(count) = "WildStrawberry": value(count) = 4294919076
count = count + 1: kolor$(count) = "WildWatermelon": value(count) = 4294732933
count = count + 1: kolor$(count) = "Wisteria": value(count) = 4291667166
count = count + 1: kolor$(count) = "Yellow": value(count) = 4294967040
count = count + 1: kolor$(count) = "YellowGreen": value(count) = 4288335154
count = count + 1: kolor$(count) = "YellowOrange": value(count) = 4294946370
ReDim _Preserve kolor$(count), value(count)
For i = 1 To count
If UCase$(temp$) = UCase$(kolor$(i)) Then ColorValue = value(i): Exit Function
Next
End If
End If
End Function
Function ParseValues (text$, values() As String)
ReDim values(1000) As String
temp$ = text$ 'preserve without changing our text
lp = InStr(temp$, "("): temp$ = Mid$(temp$, lp + 1) 'strip off any left sided parenthesis, such as _RGB32(
rp = _InStrRev(temp$, ")"): If rp Then temp$ = Left$(temp$, rp - 1) 'strip off the right sided parenthesis )
Do
p = InStr(temp$, ",")
If p Then
eval$ = Left$(temp$, p - 1)
If IsNum(eval$) = 0 Then ParseValues = -1: Exit Function
count = count + 1
If count > UBound(values) Then ReDim _Preserve values(UBound(values) + 1000) As String
values(count) = eval$
temp$ = Mid$(temp$, p + 1)
Else
eval$ = temp$
If IsNum(eval$) = 0 Then ParseValues = -1: Exit Function
count = count + 1
If count > UBound(values) Then ReDim _Preserve values(UBound(values) + 1) As String
values(count) = eval$
temp$ = ""
End If
Loop Until temp$ = ""
ReDim _Preserve values(count) As String
ParseValues = count
End Function
Function IsNum%% (PassedText As String)
text$ = _Trim$(PassedText)
special$ = UCase$(Left$(text$, 2))
Select Case special$
Case "&H", "&B", "&O"
'check for symbols on right side of value
r3$ = Right$(text$, 3)
Select Case r3$
Case "~&&", "~%%", "~%&" 'unsigned int64, unsigned byte, unsigned offset
text$ = Left$(text$, Len(text$) - 3)
Case Else
r2$ = Right$(text$, 2)
Select Case r2$
Case "~&", "##", "%&", "%%", "~%", "&&" 'unsigned long, float, offset, byte, unsigned integer, int64
text$ = Left$(text$, Len(text$) - 2)
Case Else
r$ = Right$(text$, 1)
Select Case r$
Case "&", "#", "%", "!" 'long, double, integer, single
text$ = Left$(text$, Len(text$) - 1)
End Select
End Select
End Select
check$ = "0123456789ABCDEF"
If special$ = "&O" Then check$ = "01234567"
If special$ = "&B" Then check$ = "01"
temp$ = Mid$(UCase$(text$), 2)
For i = 1 To Len(temp$)
If InStr(check$, Mid$(temp$, i, 1)) = 0 Then Exit For
Next
If i <= Len(temp$) Then IsNum = -1
Case Else
If _Trim$(Str$(Val(text$))) = text$ Then IsNum = -1
End Select
End Function
Coming in at 440 lines of code, this awesome Colornator... umm... well.. It gives you the color value of a text string, if possible.
/blush
Lots and lots of code, just to do something so simple -- but it's more complex than you'd first imagine!!
This works with plain numeric values for colors. This works with _RGB, _RGBA, _RGB32, _RGBA32 values. Hex values, Octal, and even Binary values are all fine! (&H, &O, &B prefaced values.) This lets you specify a color NAME, and it returns the 32-bit color value back from that!!
It's THE COLORNATOR!! Dr. Doofenshmirtz, eat your heart out! I just out NATORed you!
|
|
|
Picture to text converter |
Posted by: MasterGy - 12-06-2022, 07:21 PM - Forum: MasterGy
- Replies (15)
|
|
Hello !
Out of curiosity, I created a program for converting images to characters.
There are so many online, there are also online converters.
I tried to add something extra. It also works with variable character width, and the shades of the image can be adjusted.
Enter the image and font in the source code. You can change what characters it uses.
When the program starts, the optimal image can be adjusted with brightness/contrast.
It is possible to set how many lines the image is displayed.
Black characters on a white background or white characters on a black background.
The width of the letter can be adjusted. (1- original 0.5, half as wide, 2, double wide)
You can set the size of the map to work on. This is important when saving, because the image can be saved in very good quality.
The program does not require external files.
Give it a picture and start it.
Code: (Select All) 'MasterGy 2022
Dim Shared pic, contrast, brightness, contrast_ref, char_collection$
'CHANGES SETTING ! ----------------------------------------------------------------------------------------------------------------------
picture$ = "image1.jpg" ' <------ set a picture
char_collection$ = "'+0123456789.?!=:>()<%/-,ABCDEFGHIJKLMNOPQRSTVXYZUWabcdefghijklmnopqrstvxyzuw" '<----- charecters used
type_s$ = Environ$("systemroot") + "/fonts/arial.ttf" '<------ font type
'------------------------------------------------------------------------------------------------------------------------------
s$ = " Press S to save BMP file , ESC to return menu ": _Font 16
mess = _NewImage(8 * Len(s$), 16, 32): _Dest mess: Cls , _RGB32(100, 0, 0, 100): Color _RGB32(255, 255, 255, 255), _RGB32(100, 0, 0, 100): Locate 1, 1: Print s$;
pic_size = 500
temp = _LoadImage(picture$, 32): _Source temp
If _Width(temp) > _Height(temp) Then x = pic_size: y = Int(x / _Width(temp) * _Height(temp)) Else y = pic_size: x = Int(y / _Height(temp) * _Width(temp))
pic = _NewImage(x, y, 32): _Dest pic: _PutImage: _FreeImage temp
s_c = 7
s$(0) = "contrast": s(0, 0) = 1.5: s(0, 1) = 1: s(0, 2) = 7
s$(1) = "contrast_ref": s(1, 0) = 128: s(1, 1) = 0: s(1, 2) = 255
s$(2) = "brigthness": s(2, 0) = 0: s(2, 1) = -255: s(2, 2) = 255
s$(3) = "types rows": s(3, 0) = 75: s(3, 1) = 10: s(3, 2) = 200
s$(4) = "output picture size": s(4, 0) = _DesktopWidth: s(4, 1) = 300: s(4, 2) = 3000
s$(5) = "picture colors negate": s(5, 0) = 1: s(5, 1) = 0: s(5, 2) = 1
s$(6) = "type width-ratio": s(6, 0) = 1: s(6, 1) = .5: s(6, 2) = 4
s_sy = Int((y / 16) + 2): winx = x + 100: winy = (s_sy + s_c * 3 + 3) * 16 + 1: x_size = winx * .7
win = _NewImage(winx, winy, 32): Screen win: _FullScreen _SquarePixels , _Smooth
Do: _Limit 30
k$ = InKey$
Select Case k$
Case Chr$(27): System
Case "1", "2", "3": work_type = Val(k$): GoSub work
End Select
mousew = 0: While _MouseInput: mousew = mousew + _MouseWheel: Wend: If _MouseButton(1) = 0 Then mc = -1
s(3, 0) = Int(s(3, 0))
s(4, 0) = Int(s(4, 0))
s(5, 0) = CInt(s(5, 0))
s(7, 0) = CInt(s(7, 0))
For sa = 0 To s_c - 1
y1 = (s_sy + sa * 3 - 1) * 16 + 20: y2 = y1 + 14: x1 = (winx - x_size) / 2: x2 = x1 + x_size
under2 = _MouseX > x1 And _MouseX < x2: under = under2 And _MouseY > y1 And _MouseY < y2
mgrey = 128 + (CInt(s(5, 0)) * 2 - 1) * 127 * under
Color _RGB(mgrey, mgrey, mgrey)
s$ = s$(sa) + " (" + LTrim$(Str$(Int(s(sa, 0) * 100) / 100)) + ")"
If sa = 4 Then s$ = s$(sa) + " (" + LTrim$(Str$(Int(s(sa, 0)))) + " x " + LTrim$(Str$(Int(s(sa, 0) / x * y))) + ")"
Locate s_sy + sa * 3, (winx - Len(s$) * 8) / 16: Print UCase$(s$)
Color _RGB(200, 40, 40): Line (x1, y1)-(x2, y2), , B
x2 = x1 + x_size / (s(sa, 2) - s(sa, 1)) * (s(sa, 0) - s(sa, 1)): Line (x1, y1)-(x2, y2), , BF
If under And _MouseButton(1) And mc = -1 Then mc = sa
Next sa
If mc <> -1 And under2 And mc <> 5 Then s(mc, 0) = (s(mc, 2) - s(mc, 1)) * (1 / x_size * (_MouseX - (winx - x_size) / 2)) + s(mc, 1)
If mc = 5 And under2 And m5last = 0 Then s(5, 0) = 1 - s(5, 0): m5last = 1
m5last = m5last And -_MouseButton(1)
contrast = s(0, 0): contrast_ref = s(1, 0): brightness = s(2, 0)
'statistic
min = 999999: max = -min: _Dest mon: _Source pic
For tx = 0 To x - 1: For ty = 0 To y - 1: grey = pic_read(tx, ty): If grey > max Then max = grey
If grey < min Then min = grey
Next ty, tx
'draw
temp = 255 / (max - min)
sx = (winx - x) / 2: For tx = 0 To x - 1: For ty = 0 To y - 1: grey = temp * (pic_read(tx, ty) - min): PSet (sx + tx, ty), _RGB(grey, grey, grey): Next ty, tx
_Display
grey = 255 * CInt(s(5, 0))
Cls , _RGB(grey, grey, grey)
Color _RGB(50, 128, 50), 0
Locate Int(winy / 16) - 3, 3: Print "-1- work variable character width";
Locate Int(winy / 16) - 2, 3: Print "-2- work same character width";
Locate Int(winy / 16) - 1, 3: Print "-3- work random character location";
Loop
'work
work:
Cls
_AutoDisplay
monx2 = Int(s(4, 0))
mony2 = Int(s(4, 0) / x * y)
t_height = Int(mony2 / s(3, 0))
temp = _LoadImage(picture$, 32): _Source temp: pic_work = _NewImage(monx2, mony2, 32): _Dest pic_work: _PutImage: _Source pic_work: _FreeImage temp
pic_out = _NewImage(monx2, mony2, 32)
temp = 255 / (max - min)
For tx = 0 To monx2 - 1: For ty = 0 To mony2 - 1: grey = temp * (pic_read(tx, ty) - min): PSet (tx, ty), _RGB(grey, grey, grey): Next ty, tx
mon2 = _NewImage(monx2, mony2, 32): Screen mon2
negate = CInt(s(5, 0))
ReDim Shared font_collection(255, 2): font_install type_s$, t_height * 2, negate, Abs(work_type = 2): _Font 16
_Dest pic_out
Cls , _RGB(255 * negate, 255 * negate, 255 * negate)
_FullScreen _SquarePixels , _Smooth
Select Case work_type
Case 1, 2
ReDim st(499, 1)
Do: For a_row = 0 To Int(s(3, 0)) - 1
_Source pic_out: _Dest mon2: _PutImage
_Source mess: _PutImage (0, 0)-(_Width(mon2), _Width(mon2) / _Width(mess) * _Height(mess)): _Display
_Dest pic_out
a_col = 0
Do
_Source pic_work
dif_ok = 99999
For ac = 0 To Len(char_collection$) - 1
Select Case LCase$(InKey$): Case Chr$(27): GoTo return_menu: Case "s": GoTo saving: End Select
x1 = a_col
stx = Int(t_height / _Height(font_collection(ac + 1, 0)) * _Width(font_collection(ac + 1, 0)))
x2 = x1 + Int(s(6, 0) * stx)
If x2 > monx2 Then Exit Do
y1 = a_row * t_height
y2 = y1 + t_height
If st(stx, 0) = a_col Then
st = st(stx, 1)
Else
sum = 0: c = 0: For tx = x1 To x2
For ty = y1 To y2: sum = sum + _Red(Point(tx, ty)): c = c + 1: Next ty, tx
st(stx, 0) = a_col
st = sum / (255 * c)
st(stx, 1) = st
End If
dif = Abs(st - font_collection(ac + 1, 2))
If dif < dif_ok Then dif_ok = dif: st_need = ac: x2_need = x2
Next ac
_Source font_collection(st_need + 1, 0)
_PutImage (x1, y1)-(x2_need, y2)
a_col = x2_need + 1
Loop
Next a_row: Loop
Case 3
Do
cn = cn + 1: If cn > 100 Then
_Source pic_out: _Dest mon2: _PutImage
_Source mess: _PutImage (0, 0)-(_Width(mon2), _Width(mon2) / _Width(mess) * _Height(mess)): _Display
cn = 0
End If
_Dest pic_out
Select Case LCase$(InKey$): Case Chr$(27): GoTo return_menu: Case "s": GoTo saving: End Select
xsize = Int(t_height * (1 + .5 * Rnd))
ysize = Int(t_height * (1 + .5 * Rnd))
xpos = Int((monx2 - xsize) * Rnd)
ypos = Int((mony2 - ysize) * Rnd)
sum = 0: c = 0: For tx = 0 To xsize - 1
_Source pic_work
For ty = 0 To ysize - 1: sum = sum + _Red(Point(tx + xpos, ty + ypos)): c = c + 1: Next ty, tx
st = sum / (255 * c)
dif_ok = 99999
For ac = 0 To Len(char_collection$) - 1
dif = Abs(st - font_collection(ac + 1, 2))
If dif < dif_ok Then dif_ok = dif: st_need = ac
Next ac
_Source font_collection(st_need + 1, 0)
_PutImage (xpos, ypos)-(xpos + xsize, ypos + ysize)
Loop
End Select
saving: _AutoDisplay: Screen 0: _FullScreen _Off: Cls: Print "saving picture to SAVED.BMP...waiting": SaveImage pic_out, "saved.bmp": Sleep 2: System
return_menu: Screen win: _Dest win: _Source win: _Font 16: _FreeImage mon2: _FreeImage pic_work: _FreeImage pic_out: Return
Sub font_install (f$, fs, negate, mono)
If mono Then af = _LoadFont(f$, fs, "monospace") Else af = _LoadFont(f$, fs)
For ac = 0 To Len(char_collection$) - 1: ac$ = Mid$(char_collection$, ac + 1, 1): _Font af
temp2 = _NewImage(_PrintWidth(ac$), fs, 32): _Dest temp2: Cls , _RGB(255 * negate, 255 * negate, 255 * negate)
_Font af: Color _RGB(255 * (negate Xor 1), 255 * (negate Xor 1), 255 * (negate Xor 1)), 0
_PrintString (0, 0), ac$: font_collection(ac + 1, 0) = _CopyImage(temp2, 32): _Source temp2
c = 0: st = 0: For tx = 0 To _Width(temp2) - 1: For ty = 0 To _Height(temp2) - 1: c = c + 1: st = st + Abs(_Red(Point(tx, ty)) <> _Red(tc&&)): Next ty, tx
font_collection(ac + 1, 2) = 1 / c * st: _FreeImage temp2
font_collection(ac + 1, 1) = Asc(ac$): Next ac
font_collection(0, 0) = af
min_g = 99999: max_g = -min_g
For t = 0 To Len(char_collection$) - 1 'find limits
If font_collection(t + 1, 2) < min_g Then min_g = font_collection(t + 1, 2)
If font_collection(t + 1, 2) > max_g Then max_g = font_collection(t + 1, 2)
Next t
For t = 0 To Len(char_collection$) - 1 'normalizing limits
font_collection(t + 1, 2) = 1 / (max_g - min_g) * (font_collection(t + 1, 2) - min_g)
Next t
End Sub
Function pic_read (tx, ty)
p&& = Point(tx, ty): grey = (_Red(p&&) + _Green(p&&) + _Blue(p&&)) * .33333
grey = contrast_ref + (grey - contrast_ref) * contrast + brightness
If grey < 0 Then grey = 0
If grey > 255 Then grey = 255
pic_read = grey
End Function
Sub SaveImage (image As Long, filename As String)
bytesperpixel& = _PixelSize(image&)
If bytesperpixel& = 0 Then Print "Text modes unsupported!": End
If bytesperpixel& = 1 Then bpp& = 8 Else bpp& = 24
x& = _Width(image&)
y& = _Height(image&)
b$ = "BM????QB64????" + MKL$(40) + MKL$(x&) + MKL$(y&) + MKI$(1) + MKI$(bpp&) + MKL$(0) + "????" + String$(16, 0) 'partial BMP header info(???? to be filled later)
If bytesperpixel& = 1 Then
For c& = 0 To 255 ' read BGR color settings from JPG image + 1 byte spacer(CHR$(0))
cv& = _PaletteColor(c&, image&) ' color attribute to read.
b$ = b$ + Chr$(_Blue32(cv&)) + Chr$(_Green32(cv&)) + Chr$(_Red32(cv&)) + Chr$(0) 'spacer byte
Next
End If
Mid$(b$, 11, 4) = MKL$(Len(b$)) ' image pixel data offset(BMP header)
lastsource& = _Source
_Source image&
If ((x& * 3) Mod 4) Then padder$ = String$(4 - ((x& * 3) Mod 4), 0)
For py& = y& - 1 To 0 Step -1 ' read JPG image pixel color data
r$ = ""
For px& = 0 To x& - 1
c& = Point(px&, py&) 'POINT 32 bit values are large LONG values
If bytesperpixel& = 1 Then r$ = r$ + Chr$(c&) Else r$ = r$ + Left$(MKL$(c&), 3)
Next px&
d$ = d$ + r$ + padder$
Next py&
_Source lastsource&
Mid$(b$, 35, 4) = MKL$(Len(d$)) ' image size(BMP header)
b$ = b$ + d$ ' total file data bytes to create file
Mid$(b$, 3, 4) = MKL$(Len(b$)) ' size of data file(BMP header)
If LCase$(Right$(filename$, 4)) <> ".bmp" Then ext$ = ".bmp"
f& = FreeFile
Open filename$ + ext$ For Output As #f&: Close #f& ' erases an existing file
Open filename$ + ext$ For Binary As #f&
Put #f&, , b$
Close #f&
End Sub
|
|
|
$RESIZE with Word-Wrap Routine. |
Posted by: Pete - 12-06-2022, 02:39 PM - Forum: Utilities
- Replies (9)
|
|
The Thread Subject title says it all...
Code: (Select All) $RESIZE:SMOOTH
Sw = 60
Sh = 25
S& = _NEWIMAGE(Sw, Sh, 0)
SCREEN S&
DO: LOOP UNTIL _SCREENEXISTS
font& = _LOADFONT(ENVIRON$("SYSTEMROOT") + "\fonts\lucon.ttf", 18, "MONOSPACE")
_FONT font&
PALETTE 0, 8
COLOR 15, 0
_SCREENMOVE 10, 10
_DELAY .2
ml = 0: mr = ml
w = _WIDTH - (ml + mr)
DO
_LIMIT 30
x$ = "In West Los Angeles born and raised, at the yacht club is where I spent most of my days, 'til a couple of coders who were up to no good, started making trouble in my neighborhood. I got booted off Discord and my vids wouldn't play, so I moved to the hills in the State of VA. I pulled up to the forum 'bout a week into April and I yelled to the browser, 'Save password log in later!' Now I'm able to post and my speech is still free as I sit on my throne as the Prince of P.E."
x$ = "In West Los Angeles born and raised, at the yacht club is where I spent most of my days, 'til a couple of coders who were up to no good, started making trouble in my neighborhood. I got booted off Discord and my vids wouldn't play, so I moved to the hills in the State of VA. I pulled up to the forum 'bout a week into April and I yelled to the browser, 'Save password log in later!' Now I'm able to post and my speech is still free as I sit on my throne as the Prince of P.E."
w2 = w - (ml + mr)
CLS
LOCATE 2
DO
WHILE -1
t$ = MID$(x$, 1, w2)
chop = 1
IF w2 <> 1 THEN
DO
IF LEFT$(t$, 1) = " " THEN
' Only happens with more than 1 space between characters.
IF LTRIM$(t$) = "" THEN EXIT DO ELSE x$ = LTRIM$(x$): EXIT WHILE
END IF
IF MID$(x$, w2 + 1, 1) <> " " AND LTRIM$(t$) <> "" THEN ' Now we have to chop it.
IF INSTR(x$, " ") > 1 AND INSTR(t$, " ") <> 0 AND LEN(x$) > w2 THEN
t$ = MID$(t$, 1, _INSTRREV(t$, " ") - 1)
chop = 2
END IF
ELSE
chop = 2
END IF
EXIT DO
LOOP
x$ = MID$(x$, LEN(t$) + chop)
ELSE
x$ = MID$(x$, LEN(t$) + 1)
END IF
IF LEN(t$) AND CSRLIN < _HEIGHT - 1 THEN LOCATE , ml + 1: PRINT LTRIM$(t$)
EXIT WHILE
WEND
LOOP UNTIL LEN(t$) AND LEN(LTRIM$(x$)) = 0
oldsw = Sw: oldsh = Sh
IF _RESIZE THEN
Sw = _RESIZEWIDTH \ _FONTWIDTH
Sh = _RESIZEHEIGHT \ _FONTHEIGHT
IF oldsw <> Sw OR oldsh <> Sh THEN
w = Sw
S& = _NEWIMAGE(Sw, Sh, 0)
SCREEN S&
_FONT font&
PALETTE 0, 8
END IF
ELSE
DO
_LIMIT 30
IF _RESIZE THEN EXIT DO
b$ = INKEY$
IF LEN(b$) THEN
IF b$ = CHR$(27) THEN SYSTEM
SELECT CASE MID$(b$, 2, 1)
CASE "M"
IF ml < _WIDTH \ 2 THEN ml = ml + 1: mr = mr + 1
EXIT DO
CASE "K"
IF ml > 0 THEN ml = ml - 1: mr = mr - 1
EXIT DO
END SELECT
END IF
LOOP
END IF
LOOP
Now before you get too excited... and we'll pause a moment so Steve can change his pants... this little routine just clears the screen on each resize. That means if we added vertical scrolling we would also have to build an algorithm to handle vertical positioning so we don't just always return to the start of the document every time the window gets resized.
Oh, now that Steve's back, yo can use the arrow left and right keys to increase and decrease the page margins.
I need sleep. I'm having too much fun coding stuff from the past all over again... [Search Fresh Prince of Bel Air for ref to text].
Pete
|
|
|
Day 025: _CLIPBOARD$ |
Posted by: Pete - 12-06-2022, 06:34 AM - Forum: Keyword of the Day!
- Replies (3)
|
|
_CLIPBOARD$ captures the string contents of the operating system clipboard contents.
The neat thing about this platform cross-compatible feature is the ability to use it outside the immediate program. I'll explain...
_CLIPBOARD$ can be used to capture any copied text from any running application. Once captured, the string can be used inside your app, or transferred to another QB64 app. _CLIPBOARD$ is therefore one of a few ways we can communicate with other QB64 programs running simultaneously. Now as exciting as that may be, the use of _CLIPBOARD, for inter-program communications, is somewhat frowned upon by Microsoft. The preferred M$ method is to establish a TCP/IP communications, which will be discussed a bit later along with piping to the clipboard using Windows SHELL command.
Right now, let's take a look at a copying, parse and print text example.
For this demo, start the app and then come back to this page, do Ctrl + A to copy all the tet, and Ctrl + C to copy it to the clipboard. Upon copying, the app will parse and display the clipboard text capture.
Code: (Select All) $CONSOLE:ONLY
_CLIPBOARD$ = ""
COLOR 15, 1
CLS
PRINT " Copy the Keyword of the Day page..."
DO: _LIMIT 1: LOOP UNTIL LEN(_CLIPBOARD$)
CLS
a$ = _CLIPBOARD$ + CHR$(13)
DO
x$ = MID$(a$, 1, INSTR(a$, CHR$(13)))
a$ = LTRIM$(MID$(a$, LEN(x$) + 2))
x$ = _TRIM$(MID$(x$, 1, INSTR(x$, CHR$(13)) - 1))
IF LEN(x$) THEN
IF MID$(x$, 1, 11) = "IP Address:" OR INSTR(x$, "AM") AND LEFT$(x$, 1) = "(" OR INSTR(x$, "PM") AND LEFT$(x$, 1) = "(" THEN pon = 0: spacer = 0
IF pon THEN
w = _WIDTH - 2
IF MID$(a$, 1, 2) = CHR$(13) + CHR$(10) AND last = 0 THEN spacer = 1
IF w > 0 THEN
DO
t$ = MID$(x$, 1, w)
chop = 1
IF MID$(x$, w + 1, 1) <> " " THEN ' Now we have to chop it.
IF INSTR(x$, " ") > 1 AND INSTR(t$, " ") <> 0 AND LEN(x$) > w THEN
t$ = MID$(t$, 1, _INSTRREV(t$, " ") - 1)
chop = 2
END IF
ELSE
chop = 2
END IF
IF w = 1 THEN chop = 1
x$ = MID$(x$, LEN(t$) + chop)
'-----------------------------------------------------------------------
IF LEN(t$) THEN LOCATE , 2: PRINT LTRIM$(t$): IF spacer = 0 THEN last = 0
'-----------------------------------------------------------------------
LOOP UNTIL LEN(t$) AND LEN(LTRIM$(x$)) = 0
IF spacer = 1 THEN PRINT: spacer = 0
END IF
END IF
IF INSTR(x$, ",") <> 0 AND INSTR(x$, "-") <> 0 THEN
IF INSTR(x$, "AM") OR INSTR(x$, "PM") AND LEFT$(x$, 1) <> "(" THEN
pon = 1
END IF
END IF
ELSE
END IF
LOOP UNTIL a$ = ""
PRINT: PRINT "Click the 'X' in the title bar to close this window."
DO: _LIMIT 1: SLEEP: LOOP
Okay, now how about we have a look at using _CLIPBOARD$ to make a small chat app...
For this demo you will need to save the second app as: "myclip.exe" and run the first app to access it.
Code: (Select All) _SCREENMOVE 0, 0 ' Set up this host window to the left of your desktop.
WIDTH 60, 25
IF NOT _FILEEXISTS("myclip.exe") THEN PRINT "Cannot find file: "; "myclip.exe. Ending...": END
a$ = "Opening as host." '
PRINT a$: PRINT
SHELL _HIDE "start myclip.exe" ' Open the client window.
_SCREENCLICK 30 * 8, 10
PRINT "Connection established.": PRINT
DO
_CLIPBOARD$ = ""
' Okay, time to input something on the host that will be communicated to the client.
INPUT "Input a message: "; msg$: PRINT
_CLIPBOARD$ = msg$
_KEYCLEAR
_DELAY 2
_CLIPBOARD$ = ""
DO: _LIMIT 5: LOOP UNTIL LEN(_CLIPBOARD$)
_SCREENCLICK 30 * 8, 10
PRINT "Reply received: "; _CLIPBOARD$: PRINT
LOOP
Save this as "myclip.exe" but don't run it. Run the first app (it doesn't matter if it's named) to start the chat sequence.
Code: (Select All) _SCREENMOVE 60 * 8 + 10, 0 ' Set up this client window to the right of host.
WIDTH 60, 25
_CLIPBOARD$ = ""
a$ = "Opening as host." '
PRINT a$: PRINT
PRINT "Connection established.": PRINT
DO
DO: _LIMIT 5: LOOP UNTIL LEN(_CLIPBOARD$)
_SCREENCLICK 90 * 8, 10: _DELAY .25
PRINT "Message received: "; _CLIPBOARD$: PRINT
' Okay, time to input something on the client that will be communicated to the host.
INPUT "Input a message: "; msg$: PRINT
_CLIPBOARD$ = msg$
_KEYCLEAR
_DELAY 2
_CLIPBOARD$ = ""
LOOP
So M$ recommends using TCP/IP to accomplish what we just demoed with _CLIPBOARD. This example covers how to do that, but it's much more involved. Also, because it uses TCP/IP, you will have to clear it with Windows Defender.
This is a Windows only demo. It uses min/restore to regain focus to each window, instead of _SCREENCLICK like the _CLIPBOARD demo above. Save, but don't run the second app as "messenger_client.exe" then run the first one. Clear for use with Windows Defender when the alert pops up on your screen.
Code: (Select All) DECLARE DYNAMIC LIBRARY "user32"
FUNCTION FindWindowA%& (BYVAL ClassName AS _OFFSET, WindowName$) 'handle by title
FUNCTION ShowWindow& (BYVAL hwnd AS _OFFSET, BYVAL nCmdShow AS LONG) 'maximize process
FUNCTION SetForegroundWindow%& (BYVAL hwnd AS _OFFSET) 'set foreground window process(focus)
FUNCTION GetForegroundWindow%& 'Find currently focused process handle
END DECLARE
_SCREENMOVE 0, 0
title$ = "Messenger_Host"
_TITLE (title$)
_DELAY .1
_SCREENMOVE 0, 0 ' Set up this host window to the left of your desktop.
WIDTH 60, 25
IF NOT _FILEEXISTS("messenger_client.exe") THEN PRINT "Cannot find file: messenger_client.exe. Ending...": END
DIM host_msg AS STRING, client_msg AS STRING
DO
IF initiate = 0 THEN ' This only needs to be performed once, to open the client window.
DO UNTIL x ' Stay in loop until window determines if it is the host or client window.
x = _OPENCLIENT("TCP/IP:1234:localhost") ' Used to establish a TCP/IP routine.
IF x = 0 THEN
x = _OPENHOST("TCP/IP:1234") ' Note the host and clinet must have the same 1234 I.D. number.
a$ = "Opening as host." ' x channel is now open and this window becomes the host.
ELSE
a$ = "Opening as client." ' Should not go here for this demo.
END IF
PRINT a$
LOOP
SHELL _HIDE _DONTWAIT "messenger_client.exe" ' Open the client window.
initiate = -1 ' Switches this block statement off for all subsequent loops.
END IF
IF z = 0 THEN ' Initiates an open channel number when zero.
DO
z = _OPENCONNECTION(x) ' Checks if host is available to transfer data.
LOOP UNTIL z
PRINT "Connection established."
_DELAY 1
LOCATE 2: PRINT SPACE$(_WIDTH * 2) ' Remove these lines.
LOCATE 3, 1
GOSUB focus ' Sends focus back to host window.
END IF
' Okay, time to input something on the host that will be communicated to the client.
LINE INPUT "Message to client: "; host_msg: PRINT
PUT #z, , host_msg ' Input is now entered into TCP/IP routine.
DO
GET #z, , client_msg
LOOP UNTIL LEN(client_msg) ' Exits loop when a return msg is received.
PRINT "Message from client: "; client_msg: PRINT
host_msg = "": PUT #z, , host_msg$ ' Now put our client value back into the routine. Failure to do so would result in the client not waiting in the GET #x DO/LOOP.
_KEYCLEAR ' Prevents typing before ready.
GOSUB focus
LOOP
focus:
DO UNTIL hwnd%&
_LIMIT 10
hwnd%& = FindWindowA(0, title$)
LOOP
FGwin%& = GetForegroundWindow%& 'get current process in focus.
_DELAY .1
IF FGwin%& <> hwnd%& THEN
y& = ShowWindow&(hwnd%&, 0)
y& = ShowWindow&(hwnd%&, 2)
y& = ShowWindow&(hwnd%&, 9)
DO
_LIMIT 10
FGwin%& = GetForegroundWindow%&
LOOP UNTIL FGwin%& = hwnd%&
END IF
RETURN
This client app must be saved as: messenger_client.exe Run the first app after this app is saved.
Code: (Select All) DECLARE DYNAMIC LIBRARY "user32"
FUNCTION FindWindowA%& (BYVAL ClassName AS _OFFSET, WindowName$) 'handle by title
FUNCTION ShowWindow& (BYVAL hwnd AS _OFFSET, BYVAL nCmdShow AS LONG) 'maximize process
FUNCTION SetForegroundWindow%& (BYVAL hwnd AS _OFFSET) 'set foreground window process(focus)
FUNCTION GetForegroundWindow%& 'Find currently focused process handle
END DECLARE
title$ = "Messenger_Client"
_TITLE (title$)
_DELAY .1
DIM host_msg AS STRING, client_msg AS STRING
_SCREENMOVE 600, 0 ' Set up this client window next to your host window.
WIDTH 50, 25
x = _OPENCLIENT("TCP/IP:1234:localhost") ' Used to establish a TCP/IP routine.
PRINT "Opened as client.": PRINT
DO UNTIL x = 0 ' Prevents running if this app is opened without using host.
DO
_LIMIT 30
GET #x, , host_msg ' Waits until it receives message sent from the host.
LOOP UNTIL LEN(host_msg)
PRINT "Message from host: "; host_msg
PRINT
_KEYCLEAR ' Prevents typing before ready.
GOSUB focus
LINE INPUT "Message to host: "; client_msg: PRINT
PUT #x, , client_msg
LOOP
END
focus:
DO UNTIL hwnd%&
_LIMIT 10
hwnd%& = FindWindowA(0, title$)
LOOP
FGwin%& = GetForegroundWindow%& 'get current process in focus.
_DELAY .1
IF FGwin%& <> hwnd%& THEN
y& = ShowWindow&(hwnd%&, 0)
y& = ShowWindow&(hwnd%&, 2)
y& = ShowWindow&(hwnd%&, 9)
DO
_LIMIT 10
FGwin%& = GetForegroundWindow%&
LOOP UNTIL FGwin%& = hwnd%&
END IF
RETURN
PIPING:
In Windows, _CLIPBOARD can be used with SHELL to extract the directory contents. This method avoids then need to make and read temp file, which would be: SHELL _HIDE "dir /b *.bas>temp.tmp"
Windows Piping Example:
Code: (Select All) $CONSOLE:ONLY
SHELL _HIDE "dir /b *.bas | clip"
PRINT _CLIPBOARD$
For Windows users, _CLIPBOARD can also be used with Win32API SENDKEYS, which allows you to use your program to copy text from other apps, instead of manually doing a copy to the clipboard. See my Sam-Clip thread for more info: https://qb64phoenix.com/forum/showthread...t=sam-clip
Pete
|
|
|
Old QB64.rip change logs |
Posted by: SMcNeill - 12-06-2022, 05:01 AM - Forum: Learning Resources and Archives
- Replies (2)
|
|
Code: (Select All) # QB64 v2.0.x - What's new?
## New features
### All platforms
- New `$Debug` metacommand, with added breakpoint/step abilities and real-time variable watching to the IDE.
- Quick reference for commands is now shown in the status bar when syntax errors are detected.
- `_Source` is now also set to `_Console` when `$Console:Only` is used.
- Allows `Ctrl+\` to be used as a shortcut to repeat search (legacy QBasic shortcut).
- Functions `_MK$` and `_CV` can now deal with `_OFFSET` values.
- New "View on Wiki" button on help panel (launches equivalent wiki page using the default browser).
- New `_EnvironCount` function to show how many environment variables are found.
- Color schemes can now be set/saved individually for each running instance of the IDE.
### Windows
- Automatically embeds a manifest file when compiling an exe with `$VersionInfo`, so that Common Controls v6.0 gets linked at runtime.
- Adds the %TEMP%, Program Files and Program Files (x86) directories to `_Dir$()` folder specifications.
<!---
### macOS
### Linux
--->
## Fixes
### All platforms
- Improved wiki parser.
- Contextual menu would crash when right-clicking a series of high-ascii characters.
- Fixes an issue with passing an array as a Sub/Function argument (missing parenthesis now properly detected).
- Fixes `Clear` making `$Console` mode invalid.
- Fixes a syntax highlighter issue regarding scientific notation.
- Fixes an issue in Windows Vista and up with incorrect resolution returned on a scaled desktop.
- Fixes `Const` parser accepting unsupported string functions and failing with some very specific const names.
- Explicitly sets x87 fpu to extended precision mode.
- Removes 255-character limit for `Input/Line Input` with strings.
- Fixes `Data` commands failing to compile in some circumstances.
- `$NoPrefix`, `Option _Explicit` and `Option _ExplicitArray` can now be placed anywhere in a program, no longer having to be the first statement.
- Fixes `MEM` reverting to `_MEM` as a sub parameter in `$NoPrefix` mode.
- Fixes case adjustment of array names in `UBound`/`LBound` calls.
- Prevents users from creating self-referencing `Type` blocks.
- Fixes issue that prevented loading file names beginning with numbers.
- Fixes file open/save dialogs issue with path navigation.
- Complete rewrite of the internals for `Environ$()`.
- Fixes evaluation of valid var/flag names for `$Let`/`$If` - same rules for variable names now apply.
- Fixes incorrect parsing of `Type` blocks with multiple elements using the `AS type element-list` syntax.
- Fixes issue with `Put #` and variable-length strings in UDTs (`Binary` files).
- Fixes issue with recursive functions without parameters.
#### Fixed in 2.0.1
- Fix "Duplicate definition" error with Static arrays in Subs/Functions with active On Error trapping.
- Fix internal UDT arrays not resetting when a new file is loaded.
- Fix issue preventing `$Debug` from working in Windows versions prior to Windows 10.
#### Fixed in 2.0.2
- Fix issue with `LBound`/`UBound` calls in complex expressions.
### Windows
- Allows `$Console:Only` programs to return `_WindowHandle`.
- Saving a file to the root of a drive would display double backslashes in the Recent Files list.
### macOS
- Flushes the console output so `Print` can properly display text even while retaining the cursor.
#### Fixed in 2.0.2
- Fix issue preventing compilation in macOS versions prior to Catalina.
### Linux
- `xmessage` added to dependency list (setup script).
- Fixes `InKey$` acting too slow.
- Fixes compilation error with `Data` statements on gcc 11.
- Detects non-x86 based architectures.
- Flushes the console output so `Print` can properly display text even while retaining the cursor.
Code: (Select All) QB64 v1.5 - What's new?
New features
All platforms
New _MEMSOUND function, that allows you to access raw audio data decoded by the _SNDOPEN function.
Added tiling support to PAINT for legacy SCREEN modes.
Holding CTRL while dragging colors sliders in RGB mixer locks all sliders together (useful for generating gray scale values).
Adds OPTION _EXPLICITARRAY - like OPTION _EXPLICIT but only makes array declaration mandatory, not regular variables.
EXIT SELECT/CASE implemented to allow breaking out of a SELECT CASE block or out of a CASE block, in case it's used in a SELECT EVERYCASE block.
New <New Folder> button in open/save dialogs.
Ability to disable the Syntax Highlighter entirely (Options menu).
New default color scheme "Super dark blue".
Adds Alt+F3 as a shortcut to Search->Change...
Adds Ctrl+F2 as a shortcut to clicking the "back" arrow (quick navigation).
New CTRL+K shortcut that allows you to insert _KEYHIT and _KEYDOWN codes easily.
Find and Change dialogs (Search menu) now allow you to ignore text in comments and strings - or search exclusively in comments or strings.
SUBs dialog (F2 key) now shows how many lines each procedure contains.
Adds ability to change color/cursor position in $CONSOLE mode in macOS and Linux.
Extends contextual menu (right click) to the Help area.
Warnings dialog now displays the correct line number if a warning refers to an $INCLUDE file.
New colorized output for command-line compilation.
New -w switch for command-line compilation to show warnings.
Revamped ASCII Chart dialog.
Rewritten Math Evaluator dialog.
Added dialog to show progress of updating help pages (Help->Update All Pages).
Menu items reorganized for clearer grouping. New Tools menu.
Menu items descriptions are now shown in the status bar.
New _ERRORMESSAGE$ function, to return a human-readable description of the most recent runtime error.
New $ERROR metacommand, which prevents compilation depending on an $IF precompiler block condition.
New VERSION precompiler variable which can be used to check the current version of QB64 being used.
Setting $CONSOLE:ONLY now automatically switches _DEST to _CONSOLE.
New alternative syntax for DIM, REDIM, SHARED, STATIC, COMMON, TYPE, that allows for less typing by grouping variables of the same type (like DIM AS INTEGER a, b, c, d, e, f, g '...)
Ability to have the IDE format keywords in camel case like _FullScreen instead of _FULLSCREEN (opt-out feature, check Options->Code Layout).
Menus items now have brief descriptions that get displayed in the status bar.
File menu now shows more recent files and the full path is displayed in the status bar.
Cursor shapes "HELP" and "WAIT" can now be set via _MOUSESHOW.
Fixes
All platforms
Fixed the QB4.5 binary format converter to allow some syntax blocks to be properly recognized.
Fixed an error that would prevent the QB4.5 binary format converter from being launched.
Allows the RGB mixer to be invoked with Alt+Enter when $NOPREFIX is used.
RGB mixer now inserts new color values even if _RGB32 is used with less than three parameters.
Fixes syntax highlighter for some corner case non-numbers being colorized - as well as some numbers not being colorized properly (scientific notation).
Fixes $CHECKING:OFF bug related to arrays with non-zero lower bound.
Fixes ENVIRON$() not working in some scenarios.
Fixes issue that allowed code in a SELECT CASE block but before a CASE condition.
Syntax Highlighter gets automatically disabled if rendering a page takes longer than a second.
Fixes a bug that wouldn't display the recent search history if it was too long and a help page was active.
Fixes _MOUSEMOVEMENTX and _MOUSEMOVEMENTY in Windows systems. Implements both commands for macOS and Linux (limited to the program window area).
Fixes SEEK not resetting EOF().
END/EXIT SUB/FUNCTION get correctly changed, like in QB4.5 (e.g. use EXIT SUB in a FUNCTION and it'll become EXIT FUNCTION).
CONST evaluator fixed to allow using existing constants in equations reliably.
$LET lines would be incorrectly indented in some scenarios.
Allows DATA to contain numbers with trailing data type markers, for retrocompatibility with QB4.5.
The IDE will now let you know early on that labels placed between Subs/Functions are not valid, instead of just crashing at C++ compilation. CONST statements are no longer accepted between Subs/Functions either (they would be accepted in previous versions, but inaccessible).
Classic metacommands parsing adapted to more closely behave like QB4.5.
Windows
Fixes a _LOADFONT issue when attempting to load a font from C:\Windows\Fonts when no path is passed.
macOS
The IDE would segfault at startup if the clipboard contained an image.
Fixed an issue that prevented the IDE window size to be restored from previous sessions and kept defaulting to 80x25.
Replaced all g++ and gcc calls with clang++ and clang, to prevent failures in some scenarios.
Fixes scaling for UHD/5K resolution systems.
Fixes an issue with variable-length strings in TYPEs.
Enables _SCREENX and _SCREENY to return the window position on the desktop. The IDE now properly stores its last position too.
Linux
Programs written for $CONSOLE:ONLY no longer pull in GL/X11 libs
Code: (Select All) QB64 Version 1.4 - Changelog
First things first, we have moved development to a new GitHub repository. Follow us at https://github.com/QB64Team/qb64.
Although we don't follow a strict schedule regarding updates to QB64, every once in a while a feature that's been requested gets implemented or a new bug is found and then fixed, and eventually we have enough for a new release.
$NOPREFIX
One big change worth mentioning first, since it affects QB64 code from now on in a big way, is the new $NOPREFIX metacommand.
QB64-specific keywords, those that expand on the original set of keywords from QBasic/QuickBASIC 4.5, which we aim to replicate, are those that start with an underscore. It has been designed that way so that, in the event that you want to load an older program you wrote back in the day that had variables or procedures with identical names, they would not collide with the new keywords, making it possible to use QB64 entirely as you did with QBasic but also add the new functionality without breaking anything.
However, we have over the years been following our userbase create more and more programs that have no dependency whatsoever on older code, which means these aren't just QBasic programs with benefits, but actually QB64-native programs, written from scratch with QB64 in mind.
All that said, the new $NOPREFIX metacommand allows you, for the first time ever, to write QB64 programs without having to add the leading underscore to use the modern keywords.
That will allow code like this:
SCREEN _NEWIMAGE(800, 600, 32)
COLOR _RGB32(255), _RGB32(255, 0, 255)
m$ = "Hello, world!"
_PRINTSTRING ((_WIDTH - _PRINTWIDTH(m$)) \ 2, (_HEIGHT - _FONTHEIGHT) \ 2), m$
DO
_DISPLAY
_LIMIT 30
LOOP UNTIL _KEYHIT
To be written as:
$NOPREFIX
SCREEN NEWIMAGE(800, 600, 32)
COLOR RGB32(255), RGB32(255, 0, 255)
m$ = "Hello, world!"
PRINTSTRING ((WIDTH - PRINTWIDTH(m$)) \ 2, (HEIGHT - FONTHEIGHT) \ 2), m$
DO
DISPLAY
LIMIT 30
LOOP UNTIL KEYHIT
With the new metacommand in use, a program can both use _DISPLAY and DISPLAY, for example. User variables and procedures still cannot start with a single underscore (double underscores are accepted).
Here's the complete changelog for v1.4:
New features
All platforms
New $NOPREFIX metacommand.
New _DEFLATE$() and _INFLATE$() functions, that can be used to compress and decompress text or data strings using zlib, which has been added to our parts system.
New $ASSERTS metacommand and _ASSERT macro.
More bit-related functionality has been added: _READBIT, _SETBIT, _RESETBIT and _TOGGLEBIT.
You can now use _PUTIMAGE to place a portion of an image onto itself (source and destination can now be the same).
New $COLOR metacommand, which adds preset color constants based on HTML color names (per program).
Enhanced support for &B prefixed numbers, so the notation can now also be used in DATA lines and read by INPUT (from file & keyboard).
Windows
Enhancements to $CONSOLE: you can now use statements and functions you are already familiar with for SCREEN 0 but for console output. CSRLIN, POS(0), LOCATE, COLOR, _WIDTH, _HEIGHT, WIDTH (statement), CLS, SLEEP and END have all been reworked to deal with terminal output.
It is now possible to read input while working in $CONSOLE windows using _CONSOLEINPUT (for both keyboard and mouse support) and _CINP (to read individual key strokes).
You can now read the states of _CAPSLOCK, _NUMLOCK and _SCROLLLOCK keys, as well as set their states.
macOS
Basic detection of Retina displays has been implemented and programs should now render properly.
Fixes and improvements
All platforms
The warnings functionality can now be disabled (Options menu).
Numbers expressed in scientific notation now get properly colorized.
Enhanced "Open" and "Save as..." dialogs with added file list (save dialog) and support for wildcard filtering (* and ?).
Fixes a bug that would cause $INCLUDE lines to be duplicated in some scenarios.
Fixes a bug that wouldn't restore VIEW PRINT settings when RUN was called.
Linux
The IDE won't become unresponsive when the mouse pointer leaves the window anymore.
Windows
Fixes a bug that would prevent compilation when $EXEICON was used with $CHECKING:OFF set.
Fixed $VERSIONINFO so the embedded data gets properly displayed in newer versions of Windows.
|
|
|
QBASIC book by Tony Hawken (and maybe other resources too) |
Posted by: moon cresta - 12-05-2022, 01:24 PM - Forum: Works in Progress
- Replies (26)
|
|
Hello, this is my first post on the forum I think!
I got a Colour Maximite computer a few years ago, but didn't use it much until recently. I like the MMBASIC on it but there don't seem to be that many resources for learning it that I know of. Then I found out that MMBASIC is similar to QBASIC so I've been learning that for now instead. I'm interested in various types of BASIC, such as Locomotive BASIC on the Amstrad CPC, Atari BASIC on the Atari 8-bit computers... not a massive fan of Commodore 64 BASIC so far lol, although apparently it was designed to be more efficient, plus there are other forms of Commodore BASIC.
So anyway, I'm learning QBASIC mainly from this book at the moment: "A course in programming with QBASIC" by Tony Hawken. I'm mainly using QB45 via DOSBOX on a Linux PC.. hopefully I'm still welcome on this forum, come to think of it lol.
Hoping that posting here will help motivate me to learn BASIC quicker!
|
|
|
Star Trek X The Search for The BOB's White Cake |
Posted by: Pete - 12-05-2022, 01:29 AM - Forum: Programs
- Replies (16)
|
|
With all the Trekkie stuff of late, I'd thought I'd repost this spoof. For those of you who didn't know TheBOB, he was a frequent contributor to the QBasic Forum and a professional graphic artist and programmer in the 1980's. He got the nick, Batman. When we needed graphics help, back in the day, we'd post the bat signal... ^^0^^ and Bob would come to the rescue.
Well one day he posted his white cake recipe program, and something went terribly wrong...
Code: (Select All) DEFINT A-Y
TYPE RockTYPE 'establish data TYPE for meteors
Mx AS INTEGER 'meteor x coordinate
My AS INTEGER 'meteor y coordinate
Mr AS INTEGER 'meteor radius (fixed)
Ms AS INTEGER 'meteor speed (fixed)
END TYPE
SCREEN 12, 0, 0, 0
_FULLSCREEN
FOR n = 1 TO 9
READ Attribute: OUT &H3C8, Attribute
FOR Reps = 1 TO 3
READ Intensity: OUT &H3C9, Intensity
NEXT Reps
NEXT n
PRINT
PRINT
COLOR 15
PRINT SPACE$(4); "W H I T E"; SPACE$(3); "C A K E"; SPACE$(3); "R E C I P E"
LINE (16, 60)-(620, 60), 9
LINE (16, 62)-(620, 62), 9
LINE (418, 60)-(542, 62), 0, BF
PRINT
PRINT
COLOR 12
PRINT SPACE$(4); "Heat oven to 350 degrees"
PRINT SPACE$(4); "Grease and flour 2 circular pans (8-9 inches)"
PRINT
COLOR 15
PRINT SPACE$(4); "CAKE:";
COLOR 11
PRINT SPACE$(9); "Flour: 2-1/4 cups"
PRINT SPACE$(18); "Sugar: 1-2/3 cups"
PRINT SPACE$(13); "Shortening: 2/3 cup"
PRINT SPACE$(19); "Milk: 1-1/4 cups"
PRINT SPACE$(10); "Baking powder: 3-1/2 tsps"
PRINT SPACE$(19); "Salt: 1 tsp"
PRINT SPACE$(16); "Vanilla: 1 tsp"
PRINT SPACE$(13); "Egg whites: 5 (reserve yolks for icing)"
PRINT
COLOR 12
PRINT SPACE$(4);
PRINT "Combine all ingredients except the egg whites in a bowl. Beat for 1/2"
PRINT SPACE$(4);
PRINT "minute at low speed, scraping bowl constantly, then 2 minutes at high"
PRINT SPACE$(4);
PRINT "speed, scraping bowl occasionally. Beat in egg whites, 2 minutes at"
PRINT SPACE$(4);
PRINT "high speed. Pour into pans. Bake until a toothpick inserted comes out"
PRINT SPACE$(4);
PRINT "clean or cake springs back when touched lightly (30 - 35 minutes)."
PRINT
COLOR 15
PRINT SPACE$(4); "ICING:";
COLOR 11
PRINT SPACE$(3); "Shortening: 2/3 cup"
PRINT SPACE$(17); "Butter: 2/3 cup"
PRINT SPACE$(14); "Egg yolks: 5"
PRINT SPACE$(16); "Vanilla: 1-1/2 tsps"
PRINT SPACE$(12); "Icing sugar: 3/4 cup or to taste"
CIRCLE (480, 86), 74, 1, , , .4
PAINT STEP(0, 0), 1
CIRCLE (480, 80), 72, 15, , , .4
PAINT STEP(0, 0), 15
CIRCLE (480, 79), 67, 9, , , .4
PAINT STEP(0, 0), 9
CIRCLE (480, 80), 72, 14, , , .4
CIRCLE (480, 78), 48, 15, , , .4
CIRCLE (480, 40), 60, 7, -4.5, -3.5, .4
PSET (423, 46), 7: DRAW "F2"
PAINT STEP(0, -10), 7
CIRCLE (480, 80), 60, 7, -4.5, -3.5, .4
PSET (423, 86), 7: DRAW "F2"
PAINT STEP(0, -10), 7
LINE (540, 40)-STEP(0, 40), 7
LINE (420, 40)-STEP(0, 40), 7
PAINT (430, 60), 7
PAINT (530, 60), 7
LINE (420, 40)-STEP(0, 40), 7
LINE STEP(4, -33)-STEP(0, 40), 7
LINE STEP(43, -24)-STEP(0, 40), 7
PAINT STEP(8, -18), 7
CIRCLE (480, 40), 60, 15, -4.5, -3.5, .4
LINE (540, 40)-STEP(0, 40), 15
LINE (420, 40)-STEP(0, 40), 15
LINE (420, 40)-STEP(0, 40), 15
LINE STEP(4, -33)-STEP(0, 40), 15
LINE STEP(43, -24)-STEP(0, 40), 15
PSET (430, 52), 4
DRAW "M+47,-7 M-9,+14 M-38,+6 U12 BR12 P4,4 BL13 D12 LU13Ld13"
PSET (427, 70), 4
DRAW "M+40,-7 D19 M-40,+7 U19 BF8 P4,4"
DIM Box(1000)
GET (427, 53)-(467, 78), Box()
PUT (427, 55), Box(), PSET
PSET (481, 40), 15
DRAW "M-13,+21"
PAINT (470, 30), 13, 15
FOR Reps = 1 TO 1200
X = FIX(RND * 60) + 420
y = FIX(RND * 54) + 40
IF POINT(X, y) = 4 THEN PSET (X, y), 15
NEXT Reps
PSET (427, 70), 2
DRAW "bM+40,-7 bD19 M-40,+7"
PSET (427, 70), 2
DRAW "bM+40,-7 bD20 M-30,+5"
CIRCLE (480, 80), 60, 2, 4.5, 6, .4
LINE (4, 4)-(635, 475), 9, B
FOR X = 524 TO 525
FOR y = 30 TO 100
IF POINT(X, y) = 7 THEN PSET (X, y), 13
NEXT y
NEXT X
FOR X = 528 TO 540
FOR y = 30 TO 100
IF POINT(X, y) = 7 THEN PSET (X, y), 13
NEXT y
NEXT X
CALL BSU
CALL SPACE
SYSTEM
PaletteDATA:
DATA 0,0,0,36,1,0,0,24,2,48,36,44,4,54,54,63,7,63,48,48,8
DATA 54,54,54,9,60,48,63,12,42,42,42,13,63,52,52,14,63,42,24
DEFSNG Z
SUB BSU
LOCATE 27, 60: PRINT CHR$(24);
LOCATE 28, 60: PRINT CHR$(219);: FIREPIN = 1
_DELAY 1
DO
b$ = INKEY$
_LIMIT 30
LOCATE 28, 62
PRINT "Press arrow up.";
LOCATE 28, 62
IF b$ = CHR$(0) + "H" THEN EXIT DO
_DELAY .45
PRINT " ";
IF b$ = CHR$(0) + "H" THEN EXIT DO
_DELAY .45
IF b$ = CHR$(27) THEN SYSTEM
LOOP UNTIL b$ = CHR$(0) + "H"
b$ = CHR$(13)
LOCATE 28, 60: PRINT " ";
FIREMISSILE:
FOR I = 1 TO 25
LOCATE 28 - I, 60: PRINT " ";
LOCATE CSRLIN - 1, 60: PRINT CHR$(24);
Z = TIMER
DO
LOOP UNTIL ABS(Z - TIMER) >= .02: 'DELAY LOOP
NEXT
FOR I = 1 TO 5
SOUND 2000, 2: SOUND 500, 2
WAIT &H3DA, 8
WAIT &H3DA, 8, 8
OUT &H3C8, 12
IF I >= 3 THEN
IF I / 2 <> I \ 2 THEN OUT &H3C8, 33 ELSE OUT &H3C8, 0
ELSE
OUT &H3C8, 0
OUT &H3C9, 63 'set background (briefly) to bright red
OUT &H3C9, 0
OUT &H3C9, 0
END IF
NEXT I
Z = TIMER
DO
LOOP UNTIL ABS(Z - TIMER) >= 1.5: 'DELAY LOOP
END SUB
SUB SPACE
SCREEN 9
'Set all attributes to black to hide draw/GET process
FOR n = 1 TO 15
PALETTE n, 0
NEXT n
'Ships differ in that the ship 2 rocket blasts are slightly larger
'Draw and GET ship 1 and mask
X = 0: Y = 0
MaxWIDTH = 83
MaxDEPTH = 60
DIM Rocks(1 TO 100) AS RockTYPE 'holds the location, size
'and speed of 100 meteors
IF X < 326 THEN
FOR n = 1 TO 100 'loop to initialize meteor array
Rocks(n).Mx = FIX(RND * 640) 'initial x coordinates
Rocks(n).My = FIX(RND * 350) 'initial y coordinates
Rocks(n).Mr = FIX(RND * 5) + 2 'permanent radius (2-6 pixels)
SELECT CASE n 'speed variations create perspective
CASE 1 TO 30: Rocks(n).Ms = 12 'background meteors
CASE 31 TO 65: Rocks(n).Ms = 18 'midground meteors
CASE 66 TO 100: Rocks(n).Ms = 24 'foreground meteors
END SELECT
NEXT n
Rocks(50).Mr = 10 'meteor 50 specially sized (large)
Rocks(100).Mr = 16 'meteor 100 specially sized (larger)
ELSE
Z = TIMER: DO: IF ABS(Z - TIMER) > .1 THEN EXIT DO
LOOP
END IF
ActivePAGE = 0: VisualPAGE = 1 'establish page variables for SWAP
SCREEN 9, , ActivePAGE, VisualPAGE 'page 0 active, page 1 visual
PALETTE
PALETTE 10, 0 'set palette values for attributes
PALETTE 12, 35 'which do not respond to OUT
'set palette values for attributes
'that respond to OUT
OUT &H3C8, 0
OUT &H3C9, 0
OUT &H3C9, 0 'background: midnight blue
OUT &H3C9, 12
OUT &H3C8, 1
OUT &H3C9, 16
OUT &H3C9, 8 'meteor: dark brown
OUT &H3C9, 2
OUT &H3C8, 2
OUT &H3C9, 32
OUT &H3C9, 32 'medium ship gray
OUT &H3C9, 32
OUT &H3C8, 3
OUT &H3C9, 22
OUT &H3C9, 12 'meteor highlight brown
OUT &H3C9, 5
OUT &H3C8, 4
OUT &H3C9, 63
OUT &H3C9, 0 'bright red
OUT &H3C9, 0
OUT &H3C8, 5
OUT &H3C9, 52
OUT &H3C9, 52 'ship light gray
OUT &H3C9, 52
'MAIN LOOP BEGINS -------------------------------
Count = 0
FOR X = 6 TO 546 STEP 2 'main loop wherein ship will
_DELAY .115 ' Reading speed
'travel 540 pixels in steps
'of two
CLS 'active screen cleared
OUT &H3C8, 0 'background color reestablished
OUT &H3C9, 0 'in case "space lightning" has
OUT &H3C9, 0 'flashed
OUT &H3C9, 12
'The following loop draws/updates x/y's of first 80 meteors
IF X < 326 THEN
FOR n = 1 TO 80
GOSUB DrawMETEORS 'see DrawMETEORS subroutine
NEXT n
'Second meteor-drawing loop draws last 20 meteors so that they *may*
'overdraw the ship (creating sense of its 'involvement' in meteor storm)
FOR n = 81 TO 100
GOSUB DrawMETEORS 'see DrawMETEORS subroutine
NEXT n
ELSE
''Z = TIMER: DO: IF ABS(Z - TIMER) > .1 THEN EXIT DO
''LOOP
END IF
Z = TIMER: DO: IF ABS(Z - TIMER) > .05 THEN EXIT DO
LOOP
'PRINT section -------------------------------------
'Blurbs are printed (with gaps) based on the ship's x location
COLOR 13: A1 = 30
SELECT CASE X
CASE 10 + A1 TO 100 + A1
LOCATE 21, 19: PRINT "Kirk to Spock. What are those strange looking"
LOCATE 22, 31: PRINT "blobs on the screen?"
CASE 101 + A1 TO 170 + A1
LOCATE 21, 21: PRINT "Sensors indicate they are the remains of"
LOCATE 22, 23: PRINT "TheBob's White Cake Recipe, Captain."
CASE 171 + A1 TO 240 + A1
LOCATE 21, 16: PRINT "Kirk to Scottie. Beam those pieces of cake onboard!"
CASE 241 + A1 TO 317 + A1
LOCATE 21, 19: PRINT "Aye Captain, I'll get right on it, as soon as"
LOCATE 22, 28: PRINT "I finish my Dunkin Donuts."
CASE 336 + A1 TO 435 + A1
LOCATE 21, 15: PRINT "Kirk to Sick Bay. Bones, MEDICAL EMERGENCY! Report to"
LOCATE 22, 13: PRINT "the Transporter Room and put TheBob's cake back together!"
CASE IS > 440 + A1
LOCATE 21, 19: PRINT "Dammit Jim. I'm a doctor, not Martha Stewart!"
LOCATE 21, 19: PRINT "Dammit Jim. I'm a doctor, not a confectioner!"
END SELECT
'-----------------------------------------------------
'Border line
LINE (0, 0)-(639, 349), 8, B
'"Space lightning" flash (1 chance in 25)
'Flash = FIX(RND * 25)
IF X = 326 THEN
SOUND 1000, .5: SOUND 2000, .5: SOUND 3000, .5: SOUND 4000, .5: SOUND 5000, .5: SOUND 6000, .5
SOUND 6000, .5: SOUND 7000, .5: SOUND 8000, .5: SOUND 4000, .5: SOUND 9000, .5
OUT &H3C8, 0
OUT &H3C9, 63 'set background (briefly) to bright red
OUT &H3C9, 0
OUT &H3C9, 0
END IF
'PAGING SECTION --------------------------------
SWAP ActivePAGE, VisualPAGE 'SWAP values of page variables...
SCREEN 9, , ActivePAGE, VisualPAGE 'which toggles active/visual page
'-----------------------------------------------
WAIT &H3DA, 8
WAIT &H3DA, 8, 8
NEXT X 'main loop ends
SCREEN 9, 0, 0, 0
LOCATE 21, 5: PRINT SPACE$(70);
LOCATE 22, 5: PRINT SPACE$(70);
_DELAY 1
LEVEL1 = 10
A1$ = " [Sometimes The Joker Wins!]"
REDIM BAT$(3)
BAT$(3) = "^^o^^"
BAT$(2) = "--o--"
BAT$(1) = "vvovv"
LOCATE LEVEL1, 2
_DELAY 1
FOR I = 1 TO 12
FOR J = 1 TO 3
IF I = 1 AND J = 1 THEN LOCATE , 3 ELSE PRINT " ";
PRINT BAT$(J);
LOCATE , POS(1) - 5
Z = TIMER
DO: IF ABS(Z - TIMER) > .1 THEN EXIT DO
LOOP
NEXT J
NEXT I
_DELAY 1
FOR I = 2 TO LEVEL1
IF I = LEVEL1 - 1 THEN SOUND 3000, .7: SOUND 358, 1.5: SOUND 5000, 1
IF I <> 2 THEN LOCATE I - 1, 27: PRINT SPACE$(28);
LOCATE I, 27: PRINT A1$;
Z = TIMER
DO: IF ABS(Z - TIMER) > .1 THEN EXIT DO
LOOP
NEXT
_DELAY 4
SYSTEM
'- SUBROUTINE SECTION BEGINS -------------------------
DrawMETEORS:
'If the meteor's x coordinate has moved off-screen to the left, it is as-
'signed a new random y coordinate, then reset to the right of the screen
IF Rocks(n).Mx < 0 THEN
Rocks(n).My = FIX(RND * 350)
Rocks(n).Mx = 642
END IF
'Meteors are drawn with lighter highlight circle offset +1/-1 pixel
CIRCLE (Rocks(n).Mx, Rocks(n).My), Rocks(n).Mr, 1
PAINT STEP(0, 0), 1
CIRCLE (Rocks(n).Mx + 1, Rocks(n).My - 1), Rocks(n).Mr - 2, 3
PAINT STEP(0, 0), 3
'Establish new location for each meteor by subtracting their
'individual speed (Ms) from their current x coordinate (Mx) ...
Rocks(n).Mx = Rocks(n).Mx - Rocks(n).Ms
RETURN
Mask:
FOR xx = 0 TO 83
FOR yy = 0 TO 60
IF POINT(xx, yy) = 0 THEN PSET (xx, yy), 15 ELSE PSET (xx, yy), 0
NEXT yy
NEXT xx
RETURN
END SUB
Pete
|
|
|
Trekn-mixer 0.2 |
Posted by: James D Jarvis - 12-05-2022, 01:03 AM - Forum: Programs
- Replies (15)
|
|
Trekn-mixer generates a sprite sheet of trekish spacecraft. It's a version 0.1 for now. Still need to tweak the color schemes and likely to add some more ship parts.
Code: (Select All) 'Trekn-Mixer v0.1
'By James D. Jarvis December 2022
'This program uses BASIMAGE coded by Dav for QB64GL 1.4, MAY/2020
'
'generate a sprite sheet of spacecraft for trek games
'each is 64 by 96 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 Trekn-Mixer v0.1 created by James D. Jarvis
'
Randomize Timer
Dim Shared ms&
ms& = _NewImage(512, 416, 32)
Screen ms&
_Title "Mini-Trekn-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 craft_type
hull As Integer
saucer As Integer
drive As Integer
cannon As Integer
turret As Integer
extension As Integer
kscheme As _Unsigned Long
End Type
Type colorscheme_type
k1 As _Unsigned Long
k2 As _Unsigned Long
k3 As _Unsigned Long
k4 As _Unsigned Long
k5 As _Unsigned Long
k6 As _Unsigned Long
End Type
Dim Shared klrs(10) As colorscheme_type
buildklrs
Dim Shared craft_limit
craft_limit = 32
Dim Shared clook(craft_limit) As craft_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, 4): kk5 = Point(0, 4)
_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
mmx = 0: mmy = 0
For m = 1 To craft_limit
'create a new set of weapon sprites
clook(m).hull = Int(1 + Rnd * 15)
'1- small saucer and drive
'2- small saucer, drive and cannon
'3- large saucer and drive
'4- large saucer,drive and cannon
'5- large saucer,drive,cannon and turret
'6- large saucer,drive and turret
'7- large saucer and turret
'8- small saucer,extension, and drive
'9- small saucer,extnsion, drive and cannon
'10- large saucer,extension,and drive
'11- large saucer,extension,drive and cannon
'12- large saucer,extension,drive,cannon and turret
'13- large saucer,extension,drive and turret
'14 - mid suacer,extenstion and drive
'15 - mid saucer, extension, cannon and drive
Select Case clook(m).hull
Case 1
clook(m).saucer = Int(1 + Rnd * 20)
clook(m).drive = Int(1 + Rnd * 8)
clook(m).cannon = 0
clook(m).turret = 0
clook(m).extension = 0
clook(m).kscheme = Int(1 + Rnd * 10)
Case 2
clook(m).saucer = Int(1 + Rnd * 20)
clook(m).drive = Int(1 + Rnd * 8)
clook(m).cannon = Int(1 + Rnd * 8)
clook(m).turret = 0
clook(m).extension = 0
clook(m).kscheme = Int(1 + Rnd * 10)
Case 3
clook(m).saucer = Int(1 + Rnd * 20)
clook(m).drive = Int(3 + Rnd * 18)
clook(m).cannon = 0
clook(m).turret = 0
clook(m).extension = 0
clook(m).kscheme = Int(1 + Rnd * 10)
Case 4
clook(m).saucer = Int(1 + Rnd * 20)
clook(m).drive = Int(3 + Rnd * 18)
clook(m).cannon = Int(1 + Rnd * 10)
clook(m).turret = 0
clook(m).extension = 0
clook(m).kscheme = Int(1 + Rnd * 10)
Case 5
clook(m).saucer = Int(11 + Rnd * 10)
clook(m).drive = Int(3 + Rnd * 18)
clook(m).cannon = Int(1 + Rnd * 10)
clook(m).turret = Int(1 + Rnd * 20)
clook(m).extension = 0
clook(m).kscheme = Int(1 + Rnd * 10)
Case 6
clook(m).saucer = Int(11 + Rnd * 10)
clook(m).drive = Int(3 + Rnd * 18)
clook(m).cannon = 0
clook(m).turret = Int(1 + Rnd * 20)
clook(m).extension = 0
clook(m).kscheme = Int(1 + Rnd * 10)
Case 7
clook(m).saucer = Int(11 + Rnd * 10)
clook(m).drive = 0
clook(m).cannon = 0
clook(m).turret = Int(1 + Rnd * 20)
clook(m).extension = 0
clook(m).kscheme = Int(1 + Rnd * 10)
Case 8
clook(m).saucer = Int(1 + Rnd * 20)
clook(m).drive = Int(3 + Rnd * 12)
clook(m).cannon = 0
clook(m).turret = 0
clook(m).extension = Int(1 + Rnd * 6)
clook(m).kscheme = Int(1 + Rnd * 10)
Case 9
clook(m).saucer = Int(1 + Rnd * 20)
clook(m).drive = Int(3 + Rnd * 12)
clook(m).cannon = Int(1 + Rnd * 8)
clook(m).turret = 0
clook(m).extension = Int(1 + Rnd * 6)
clook(m).kscheme = Int(1 + Rnd * 10)
Case 10
clook(m).saucer = Int(1 + Rnd * 20)
clook(m).drive = Int(3 + Rnd * 18)
clook(m).cannon = 0
clook(m).turret = 0
clook(m).extension = Int(1 + Rnd * 5)
clook(m).kscheme = Int(1 + Rnd * 10)
Case 11
clook(m).saucer = Int(1 + Rnd * 20)
clook(m).drive = Int(3 + Rnd * 18)
clook(m).cannon = Int(1 + Rnd * 10)
clook(m).turret = 0
clook(m).extension = Int(1 + Rnd * 5)
clook(m).kscheme = Int(1 + Rnd * 10)
Case 12
clook(m).saucer = Int(11 + Rnd * 10)
clook(m).drive = Int(3 + Rnd * 18)
clook(m).cannon = Int(1 + Rnd * 10)
clook(m).turret = Int(1 + Rnd * 20)
clook(m).extension = Int(1 + Rnd * 5)
clook(m).kscheme = Int(1 + Rnd * 10)
Case 13
clook(m).saucer = Int(11 + Rnd * 10)
clook(m).drive = Int(3 + Rnd * 18)
clook(m).cannon = 0
clook(m).turret = Int(1 + Rnd * 20)
clook(m).extension = Int(1 + Rnd * 5)
clook(m).kscheme = Int(1 + Rnd * 10)
Case 14
clook(m).saucer = Int(1 + Rnd * 10)
clook(m).drive = Int(3 + Rnd * 15)
clook(m).cannon = 0
clook(m).turret = 0
clook(m).extension = Int(1 + Rnd * 5)
clook(m).kscheme = Int(1 + Rnd * 10)
Case 15
clook(m).saucer = Int(1 + Rnd * 10)
clook(m).drive = Int(3 + Rnd * 15)
clook(m).cannon = Int(1 + Rnd * 10)
clook(m).turret = 0
clook(m).extension = Int(1 + Rnd * 5)
clook(m).kscheme = Int(1 + Rnd * 10)
End Select
draw_craft mmx, mmy, m, 1
mmx = mmx + 64
If mmx >= _Width Then
mmx = 0
mmy = mmy + 96
End If
Next m
md$ = "Spacecraft Sprite Sheet generated " + Date$ + " at " + Time$
md2$ = "Mini-Trekn-Mixer V0.1 by James D. Jarvis"
_PrintString (0, 385), md$
_PrintString (0, 401), 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 buildklrs
'lt grey
tk = Int(200 + Rnd * 50)
klrs(1).k1 = _RGB32(tk, tk, tk)
tk = Int(tk * .8)
klrs(1).k2 = _RGB32(tk, tk, tk)
tk = Int(tk * .8)
klrs(1).k3 = _RGB32(tk, tk, tk)
tr = Int(150 + Rnd * 80): tg = tg + Int(Rnd * 20) - Int(Rnd * 24): tb = tb + Int(Rnd * 20) - Int(Rnd * 24)
klrs(1).k4 = _RGB32(tr, tg, tb)
tr = Int(tr * .7): tg = Int(tg * .7): tb = Int(tb * .7)
klrs(1).k5 = _RGB32(tr, tg, tb)
klrs(1).k6 = _RGB32(Int(20 + Rnd * 200), Int(20 + Rnd * 200), Int(20 + Rnd * 200))
'dk grey
tk = Int(100 + Rnd * 50)
klrs(2).k1 = _RGB32(tk, tk, tk)
tk = Int(tk * .6)
klrs(2).k2 = _RGB32(tk, tk, tk)
tk = Int(tk * .6)
klrs(2).k3 = _RGB32(tk, tk, tk)
tr = Int(150 + Rnd * 80): tg = tg + Int(Rnd * 20) - Int(Rnd * 24): tb = tb + Int(Rnd * 20) - Int(Rnd * 24)
klrs(2).k4 = _RGB32(tr, tg, tb)
tr = Int(tr * .5): tg = Int(tg * .5): tb = Int(tb * .5)
klrs(2).k5 = _RGB32(tr, tg, tb)
klrs(2).k6 = _RGB32(Int(150 + Rnd * 100), Int(150 + Rnd * 100), Int(150 + Rnd * 100))
'red
tr = Int(100 + Rnd * 155): tg = Int(tr / Int(5 + Rnd * 10)): tb = tg
klrs(3).k1 = _RGB32(tr, tb, tg)
tr = Int(tr * .8): tg = Int(tg * .8): tb = Int(tb * .8)
klrs(3).k2 = _RGB32(tr, tg, tb)
tr = Int(tr * .8): tg = Int(tg * .8): tb = Int(tb * .8)
klrs(3).k3 = _RGB32(tr, tg, tb)
tr = Int(150 + Rnd * 80): tg = tg + Int(Rnd * 20) - Int(Rnd * 24): tb = tb + Int(Rnd * 20) - Int(Rnd * 24)
klrs(3).k4 = _RGB32(tr, tg, tb)
tr = Int(tr * .5): tg = Int(tg * .5): tb = Int(tb * .5)
klrs(3).k5 = _RGB32(tr, tg, tb)
klrs(3).k6 = _RGB32(Int(150 + Rnd * 100), Int(150 + Rnd * 100), Int(150 + Rnd * 100))
'green
tg = Int(100 + Rnd * 155): tr = Int(tg / Int(5 + Rnd * 10)): tb = tg
klrs(4).k1 = _RGB32(tr, tb, tg)
tr = Int(tr * .8): tg = Int(tg * .8): tb = Int(tb * .8)
klrs(4).k2 = _RGB32(tr, tg, tb)
tr = Int(tr * .8): tg = Int(tg * .8): tb = Int(tb * .8)
klrs(4).k3 = _RGB32(tr, tg, tb)
tr = Int(150 + Rnd * 80): tg = tg + Int(Rnd * 20) - Int(Rnd * 24): tb = tb + Int(Rnd * 20) - Int(Rnd * 24)
klrs(4).k4 = _RGB32(tr, tg, tb)
tr = Int(tr * .5): tg = Int(tg * .5): tb = Int(tb * .5)
klrs(4).k5 = _RGB32(tr, tg, tb)
klrs(4).k6 = _RGB32(Int(150 + Rnd * 100), Int(150 + Rnd * 100), Int(150 + Rnd * 100))
'blue
tb = Int(100 + Rnd * 155): tr = Int(tb / Int(5 + Rnd * 10)): tg = tr
klrs(5).k1 = _RGB32(tr, tb, tg)
tr = Int(tr * .8): tg = Int(tg * .8): tb = Int(tb * .8)
klrs(5).k2 = _RGB32(tr, tg, tb)
tr = Int(tr * .8): tg = Int(tg * .8): tb = Int(tb * .8)
klrs(5).k3 = _RGB32(tr, tg, tb)
tr = Int(150 + Rnd * 80): tg = tg + Int(Rnd * 20) - Int(Rnd * 24): tb = tb + Int(Rnd * 20) - Int(Rnd * 24)
klrs(5).k4 = _RGB32(tr, tg, tb)
tr = Int(tr * .5): tg = Int(tg * .5): tb = Int(tb * .5)
klrs(5).k5 = _RGB32(tr, tg, tb)
klrs(5).k6 = _RGB32(Int(150 + Rnd * 100), Int(150 + Rnd * 100), Int(150 + Rnd * 100))
'purple
tb = Int(100 + Rnd * 155): tr = tb: tg = Int(tb / Int(5 + Rnd * 10))
klrs(6).k1 = _RGB32(tr, tb, tg)
tr = Int(tr * .8): tg = Int(tg * .8): tb = Int(tb * .8)
klrs(6).k2 = _RGB32(tr, tg, tb)
tr = Int(tr * .8): tg = Int(tg * .8): tb = Int(tb * .8)
klrs(6).k3 = _RGB32(tr, tg, tb)
tr = Int(150 + Rnd * 80): tg = tg + Int(Rnd * 20) - Int(Rnd * 24): tb = tb + Int(Rnd * 20) - Int(Rnd * 24)
klrs(6).k4 = _RGB32(tr, tg, tb)
tr = Int(tr * .5): tg = Int(tg * .5): tb = Int(tb * .5)
klrs(6).k5 = _RGB32(tr, tg, tb)
klrs(6).k6 = _RGB32(Int(150 + Rnd * 100), Int(150 + Rnd * 100), Int(150 + Rnd * 100))
'yellow
tg = Int(100 + Rnd * 155): tr = tg: tb = Int(tg / Int(5 + Rnd * 10))
klrs(7).k1 = _RGB32(tr, tb, tg)
tr = Int(tr * .8): tg = Int(tg * .8): tb = Int(tb * .8)
klrs(7).k2 = _RGB32(tr, tg, tb)
tr = Int(tr * .8): tg = Int(tg * .8): tb = Int(tb * .8)
klrs(7).k3 = _RGB32(tr, tg, tb)
tr = Int(150 + Rnd * 80): tg = tg + Int(Rnd * 20) - Int(Rnd * 24): tb = tb + Int(Rnd * 20) - Int(Rnd * 24)
klrs(7).k4 = _RGB32(tr, tg, tb)
tr = Int(tr * .5): tg = Int(tg * .5): tb = Int(tb * .5)
klrs(7).k5 = _RGB32(tr, tg, tb)
klrs(7).k6 = _RGB32(Int(150 + Rnd * 100), Int(150 + Rnd * 100), Int(150 + Rnd * 100))
'orange
tr = Int(100 + Rnd * 155): tg = Int(tr * .5): tb = Int(tg / Int(5 + Rnd * 10))
klrs(8).k1 = _RGB32(tr, tb, tg)
tr = Int(tr * .8): tg = Int(tg * .8): tb = Int(tb * .8)
klrs(8).k2 = _RGB32(tr, tg, tb)
tr = Int(tr * .8): tg = Int(tg * .8): tb = Int(tb * .8)
klrs(8).k3 = _RGB32(tr, tg, tb)
tr = Int(150 + Rnd * 80): tg = tg + Int(Rnd * 20) - Int(Rnd * 24): tb = tb + Int(Rnd * 20) - Int(Rnd * 24)
klrs(8).k4 = _RGB32(tr, tg, tb)
tr = Int(tr * .5): tg = Int(tg * .5): tb = Int(tb * .5)
klrs(8).k5 = _RGB32(tr, tg, tb)
klrs(8).k6 = _RGB32(Int(150 + Rnd * 100), Int(150 + Rnd * 100), Int(150 + Rnd * 100))
'brown
tr = Int(155 + Rnd * 100): tg = Int(tr * .6): tb = Int(tg * .6)
klrs(9).k1 = _RGB32(tr, tb, tg)
tr = Int(tr * .8): tg = Int(tg * .8): tb = Int(tb * .8)
klrs(9).k2 = _RGB32(tr, tg, tb)
tr = Int(tr * .8): tg = Int(tg * .8): tb = Int(tb * .8)
klrs(9).k3 = _RGB32(tr, tg, tb)
tr = Int(150 + Rnd * 80): tg = tg + Int(Rnd * 20) - Int(Rnd * 24): tb = tb + Int(Rnd * 20) - Int(Rnd * 24)
klrs(9).k4 = _RGB32(tr, tg, tb)
tr = Int(tr * .5): tg = Int(tg * .5): tb = Int(tb * .5)
klrs(9).k5 = _RGB32(tr, tg, tb)
klrs(9).k6 = _RGB32(Int(150 + Rnd * 100), Int(150 + Rnd * 100), Int(150 + Rnd * 100))
'random
tr = Int(10 + Rnd * 240): tg = Int(10 + Rnd * 240): tb = Int(10 + Rnd * 240)
klrs(10).k1 = _RGB32(tr, tb, tg)
tr = Int(tr * .8): tg = Int(tg * .8): tb = Int(tb * .8)
klrs(10).k2 = _RGB32(tr, tg, tb)
tr = Int(tr * .8): tg = Int(tg * .8): tb = Int(tb * .8)
klrs(10).k3 = _RGB32(tr, tg, tb)
tr = Int(10 + Rnd * 240): tg = Int(10 + Rnd * 240): tb = Int(10 + Rnd * 240)
klrs(10).k4 = _RGB32(tr, tg, tb)
tr = Int(tr * .5): tg = Int(tg * .5): tb = Int(tb * .5)
klrs(10).k5 = _RGB32(tr, tg, tb)
klrs(10).k6 = _RGB32(Int(10 + Rnd * 240), Int(10 + Rnd * 240), Int(10 + Rnd * 240))
End Sub
Sub draw_craft (Mx, my, mid, scale)
'generate a monster image from source sprite sheet part& and render to the programs main screen ms&
tempi& = _NewImage(64, 96, 32)
'tempi& creates a temporary one sprite image for rendering
_ClearColor clr~&, tempi&
_Dest tempi&
Cls
'Locate 1, 1: Print clook(mid).style
Select Case clook(mid).hull
Case 1, 2
_PutImage (0, 0)-(63, 63), part&, tempi&, ((clook(mid).drive - 1) * 64, 128)-((clook(mid).drive - 1) * 64 + 63, 128 + 63)
If clook(mid).cannon > 0 Then _PutImage (0, 0)-(63, 63), part&, tempi&, ((clook(mid).cannon - 1) * 64, 192)-((clook(mid).cannon - 1) * 64 + 63, 192 + 63)
_PutImage (0, 0)-(63, 63), part&, tempi&, ((clook(mid).saucer - 1) * 64, 0)-((clook(mid).saucer - 1) * 64 + 63, 63)
Case 3 To 7
If clook(mid).drive > 0 Then _PutImage (0, 0)-(63, 63), part&, tempi&, ((clook(mid).drive - 1) * 64, 128)-((clook(mid).drive - 1) * 64 + 63, 128 + 63)
If clook(mid).cannon > 0 Then _PutImage (0, 0)-(63, 63), part&, tempi&, ((clook(mid).cannon - 1) * 64, 192)-((clook(mid).cannon - 1) * 64 + 63, 192 + 63)
_PutImage (0, 0)-(63, 63), part&, tempi&, ((clook(mid).saucer - 1) * 64, 64)-((clook(mid).saucer - 1) * 64 + 63, 64 + 63)
If clook(mid).turret > 0 Then _PutImage (0, 0)-(63, 63), part&, tempi&, ((clook(mid).turret - 1) * 64, 256)-((clook(mid).turret - 1) * 64 + 63, 256 + 63)
Case 8, 9
lm = Int(Rnd * 5)
_PutImage (0, 0 + 18 - lm)-(63, 63 + 18 - lm), part&, tempi&, ((clook(mid).drive - 1) * 64, 128)-((clook(mid).drive - 1) * 64 + 63, 128 + 63)
_PutImage (0, 0 + 12 - lm)-(63, 63 + 12 - lm), part&, tempi&, ((clook(mid).extension + 10) * 64, 192)-((clook(mid).extension + 10) * 64 + 63, 192 + 63)
If clook(mid).cannon > 0 Then _PutImage (0, 0)-(63, 63), part&, tempi&, ((clook(mid).cannon - 1) * 64, 192)-((clook(mid).cannon - 1) * 64 + 63, 192 + 63)
_PutImage (0, 0)-(63, 63), part&, tempi&, ((clook(mid).saucer - 1) * 64, 0)-((clook(mid).saucer - 1) * 64 + 63, 63)
Case 10 To 15
lm = Int(Rnd * 10)
If clook(mid).drive > 0 Then _PutImage (0, 0 + 32 - lm)-(63, 63 + 32 - lm), part&, tempi&, ((clook(mid).drive - 1) * 64, 128)-((clook(mid).drive - 1) * 64 + 63, 128 + 63)
If clook(mid).cannon > 0 Then _PutImage (0, 0)-(63, 63), part&, tempi&, ((clook(mid).cannon - 1) * 64, 192)-((clook(mid).cannon - 1) * 64 + 63, 192 + 63)
_PutImage (0, 0 + 28 - lm)-(63, 63 + 28 - lm), part&, tempi&, ((clook(mid).extension + 14) * 64, 192)-((clook(mid).extension + 14) * 64 + 63, 192 + 63)
_PutImage (0, 0)-(63, 63), part&, tempi&, ((clook(mid).saucer - 1) * 64, 64)-((clook(mid).saucer - 1) * 64 + 63, 64 + 63)
If clook(mid).turret > 0 Then _PutImage (0, 0)-(63, 63), part&, tempi&, ((clook(mid).turret - 1) * 64, 256)-((clook(mid).turret - 1) * 64 + 63, 256 + 63)
End Select
_Source tempi&
'repaint source image with generate color values for new monster sprite
For y = 0 To 95
For x = 0 To 63
Select Case Point(x, y)
Case kk1
PSet (x, y), klrs(clook(mid).kscheme).k1
Case kk2
PSet (x, y), klrs(clook(mid).kscheme).k2
Case kk3
PSet (x, y), klrs(clook(mid).kscheme).k3
Case kk4
PSet (x, y), klrs(clook(mid).kscheme).k4
Case kk5
PSet (x, y), klrs(clook(mid).kscheme).k5
Case kk6
PSet (x, y), klrs(clook(mid).kscheme).k6
End Select
Next x
Next y
'generated image in tempi& is rendered to ms& as a 32 by 64 sprite
_PutImage (Mx, my)-(Mx + 63, my + 95), tempi&, ms&
_Source ms&
_Dest ms&
_FreeImage tempi&
End Sub
'================================
'PNG file saved using BASIMAGE1&
'================================
Function BASIMAGE1& 'trekkin_ship_parts.png
v& = _NewImage(1280, 320, 32)
Dim m As _MEM: m = _MemImage(v&)
A$ = ""
A$ = A$ + "haIkM_PNMR[U60m>9mT<CBg][Z86SU09#_#JMnjEGghL<\o5L0YM`9o_ogok"
A$ = A$ + "co7000000CY_NekJ000000Pjh?oi?M_6000000X>nhS?jN=000000#MlQOnO"
A$ = A$ + "100000VFOlQno100000<[nDoo00000000000000000000000000000000000"
A$ = A$ + "000000000000000000000000000000000000000000000000000000000000"
A$ = A$ + "000000000PUg7Ola?dkjAn100000N^]nMmWolWOHEj3fZWO00000HN]__GWm"
A$ = A$ + "o^geYl3#m\j?ocb_l_bi70FC[nmoTOiOebOXWk]#?7Lm^>UOJai2[fWoUOf>"
A$ = A$ + "NOle\ON`acgSUoIML#nGkl30[YEonOboJWoSS3[h?oW[No_Fmlcjfo3iW#7g"
A$ = A$ + "3MN#_[cJ8gGm^NUOi70h^R=Oo[N=3[7h\nMUJnOcS1[Nn3=N\bmoAnGkl_jF"
A$ = A$ + "inO8o[]LV3`\M>`n\oeehSmJo_g<=6\Uo]kaMFngnmUoi9o0odZll^8o[Kn?"
A$ = A$ + ">W_L^ogKON#gYWGaNm673Fml7JlhZNo<cm0BnGkl7K<IEbjFN?NM]#O]NGWe"
A$ = A$ + ":kQ^gNXi8<[S1Q6CFQ\^_o7YLlOfnL#\i2MfOfXcBn?KNPGmW=l<<6\jioZa"
A$ = A$ + "VI?Sb_l7:gkoInJUVcSl_6i?eo\nWaW9PDkmE>?KL_YaPE?oQ6?ReWWcnmjM"
A$ = A$ + "M;obO;6CVm\^?ck_Nfnl?3GWkZLOliK:DnWano4K<IE>oOe?n7J>>abo\MMP"
A$ = A$ + "cjmK\l?CW3\jio\aUEijOb_l7:g[fLnUoe9o7WCG^gokhL5kMN^KfSmjZio5"
A$ = A$ + "jmgkL9ogOl8dWe3=F<[G;#nGglWjhA_[[FTkc>Nof_>gEiNojJSUoEK]_[`i"
A$ = A$ + "o[naoSc_iZk7<;i?fljB9oc`h`ZWomS3Kfnea^ngagk<#nUocncjohhPl;o_"
A$ = A$ + "il7j??gkLo_gH?0c]gGcF?`Fml7Jl8U\>[[9DnGklOfhaWO=<laWCMNUoh?g"
A$ = A$ + "SQboKnJmIOlooNihoLOlOEcoEgWk\l?3S3[Nng63R]FgSGoK6WoSl;ob_l_B"
A$ = A$ + "io\noUcmofomnF6;^Z?FiNooSO_m>ObOnS7AkmcoUo#S=_i?o;obO:S7[Bo_"
A$ = A$ + "Fml_ZmohZSo7oc4NVcl:OlOEcoZgo;iolWgUDNVHTOi_gi#nUOi?_L_mjO^?"
A$ = A$ + "g=_ogn_ggbh`Zgo[E?oQ6?>nii_3dWCOoOToe>oY<V<cIEnoi?gcGUoS_gIb"
A$ = A$ + "EceKF??He?nOLN=aboKO^>GUkLbo<<>8oYo_iIche3UOiGnUoE;oWeo_L^og"
A$ = A$ + "n_ggbh`EI?gkoof63^Z7NiVoSOOm>OgIl8U\>[m4#nGklWbhb<WCi?lo>oMF"
A$ = A$ + "n3mnOk2eKo#o_Wac7FmSoKiiXmi?TNGge<kYToIH<8UN0>SmnK;kWM=^Domj"
A$ = A$ + "M>TOiGnUOi?_\OE_LB]g?_]aP]l\_gMkoOOEn3mmmV63b]7PcJ_of?NLlcfk"
A$ = A$ + "cln_fKocmb_lWchb:TCiGn3=7_#m2IEn\oZMlGnGclOlnlYHfVcK\ehNfeoN"
A$ = A$ + "kG?DnUOiGnGil7[?>YL__gL_O>[oOYToEXoOk7;BmmfkLmTaSHmfo\O_NGgb"
A$ = A$ + "_l3lL1WogWogO50<1cg38\]ihVbW[cim>bBJm_WLm_gne3UOiGn_ZoGOnOTo"
A$ = A$ + "I;oKS1id7WLOoS\SI9Unh5ZoO_eaPDk[G:_NSi?dhAX?K7jcmc#NUoOj\[_7"
A$ = A$ + "j[ekj5XLbMnOm^N1:WDW7kflVkMmnD[njOUOiGnGcnONlijX4io]=6LL\8UN"
A$ = A$ + "iLlmmFcla\oTloV732UoLjigK?oQ6?Rek[gjejTodLFon2=^dkj5X\f?_`#c"
A$ = A$ + "oKf^O7`o:e?K?CG3hhjPCmjOc`jN3UoDGo_loncoE[e9UloVGCdZVoDFSK^i"
A$ = A$ + "o=>>4JLiZ???SmlAnoMf2e?`Sonm^N[mh`<M_>ioJjo7`GnnnLOoWoo<O]?P"
A$ = A$ + "eea[_MeeoV][76K^^7co\>7`E<oWm<MMEn3mmfkl8og;gU8o_aa1h<[BonTO"
A$ = A$ + "io;a^G#\_F_[G00Pk;hcehfcnCPW1XIK>a[Jn?^6WLcoKOL8DfC9o773jM>N"
A$ = A$ + "balBTogjH10XoO00`:jW[Uoc3Voeh;o[Knc]oWm^NUO0X4f^nN\W]kmoN^n?"
A$ = A$ + "000lV]O]=WeocIMm?oniklgiGoo0H>MF_oL]O000HFlSnoMlIO;`o>0ekjEn"
A$ = A$ + "1PB:dOO#<CoMN2000`Zgo[E?o0`obO_^2000cZOncokaOfGoi?3\chjQFml3"
A$ = A$ + "00000c_[NF7VmW5RE?o00000000000000000000000000000000000000000"
A$ = A$ + "000000000000000000000000000000000000000000000000000000000000"
A$ = A$ + "00000000000000000000000000o_?ohS?bB_[Gi7000008^Lkge\e?\E?o00"
A$ = A$ + "000`L:Fo[ncOnCFN[m1Kec?00000[ZInimZ4mkj>m3[giFn10000HM]:olOF"
A$ = A$ + "[nMUJO`TonO>000000OIFjgeMci\mcoiMbFZ7k_cfCnkoi400000[UBnc3iX"
A$ = A$ + "gOSEkWocLbhnj=eGi<>fSaSE?o00000Q=k?oK]^oGm>_7cMYckX>>TKOYNj["
A$ = A$ + "LgObOoo<10000\:F]Wo]kdkZWlcoH_oInLdnio\5m4<Uj[Dmmj>m1Cne3#00"
A$ = A$ + "00j;?oK_kWk[cbLZeM^mjHTjgaCjCI]boIm1\G7[[m[NM>aZWO000084?oKe"
A$ = A$ + "mioZWS9]liPJ4j3hM>7^Ui_fS7SB__f?V8oj180000]WWo][[kLFOo8dg[WT"
A$ = A$ + "gJdcSN<NTkicm<oeH\XdmnjZNOWcfAn7W[=0000`lccoFmj3d8d7`Se#\jY5"
A$ = A$ + "?3DW]_kA_O6UlGSc;6]Wk]L7;TOm0400XOfV;J\em_om<KfW[cbo\>6lFcO9"
A$ = A$ + "kU#;cO[FkGZ[1m^?S<SD?0KIOoR=VdjekOLO^U]HOmFl:WJZV7[7UlGSc96m"
A$ = A$ + "NOUjHQl[7P00#?MecnB_[_JWm_n_Kc;MoLDojo^om<KfW[cbo\>6l6conn:l"
A$ = A$ + "fbO9[m[f?e\?HW]>lFMNBZm2Z5m38ejXDS=Yd[]kfKg#^ch#_koG_cO?joe8"
A$ = A$ + "dk[]GGEWboHLoD00H5]=G]#[oOVWWfaL7;ochh`nLMEnWaaPgJn;E?djAn;M"
A$ = A$ + "_;?C=jkGXeh6KO5C9?gM4jmgnaRD[YBVmmILoiYmjEXJX4m0<UNo<Ji_Tm0Z"
A$ = A$ + "fmnjYmnl\a2iG?010PAAXel7joM_[cJVk[bo\=>4KNiGUoII<h]VoSmDh]Uo"
A$ = A$ + "JGomZ7HiF?ejlgkVk[jII977:iamSeF]jcK^_2E7?Y7PYfkWA<oUX7#e^gGe"
A$ = A$ + "lUl[7P00`X8dJBR]noALNJgMnSi\NmB\neJ=?gk\MOBf_kH#YcoCfNm8oUJL"
A$ = A$ + "HKMN?]6jInojkOKMQe^nKijRKE?0;M_ojah#Y>f7Z7KSb[Feo_SmDODNM\^N"
A$ = A$ + "bi2YVoAmUlo\l300ebaWkQNG?e>[]JMoeZngVKI9cN:oI]gbJ]dKc[>^OEn_"
A$ = A$ + "cH#9coCgFm8oUjLf]GU\7:]>oOmm_OMQ?Yf?NmjSoiGdjG7goaZ]WLMT[bo8"
A$ = A$ + "d?PHeE=boamkXlZ5moKTbkE_>[oEb_lgKa^VE_[;0Z=GoSEnHOXe?>cS1W=O"
A$ = A$ + "\AO^JKeofl:;If[alEO;mo;Ul?cmo[Fi_DWcne[Be3^NUo]]A^S3GekWmelM"
A$ = A$ + "FGLYjUfIe`Ck1D:io^_:M_4UobToFekWBWoHkSHcg#nUoFKO>?kNMcnJ10VO"
A$ = A$ + "a^FF>cege3WC[Fo_>Vm]<_?oSF?_ZAVcImoSbHaajl>Ooa^VG:oN]^N;if;e"
A$ = A$ + "ikNe_O?bO9f>m8o?]ngomERN`ecl__oOY>>TjjOcM=[i^n_Lg^QnjgiJZiTo"
A$ = A$ + "LNE[l7[FTolcoIg;jY_ZInS]obmj9boJWoJ8dJM>;om\F1h92Mm^SonWMm_H"
A$ = A$ + "_ggde3;M]nVbnEekfad#gCl\_WA?oYDSaV7`IONIT7;B]FR=__[njUJood<n"
A$ = A$ + "e[DGohE7gCeCgGKc1^gio>Io9S1U:okG3bCg>]<o?]ngOl^DeA_bon]EZS37"
A$ = A$ + "onR]FdDGSjE[imZe2Wjn8fG?gaCiO=coIg;n9_JAn?KO7Kk:obO]5KoOFV3m"
A$ = A$ + "eJA]2`CTbe_^KooN;G?lZNI]om]G9fVSPcZekfo[A?oYDOi<7XDf>mN\8gjX"
A$ = A$ + "Di_US5kWoiCf?kW3L:cok9cAMOo_fV3L?coa\OEnOjH#9boaeMlda`FVoWTQ"
A$ = A$ + "S7_;amLkIng_]CMLXTmoi>[k=dHB:kWDfoYN>Pl_Ni_6moYEi?WmO;koUloN"
A$ = A$ + "bOYUjlmBMnPe^N1h^RMm^mGk:d_G^_oAojQYf;XmIkZk9m6bmEejCjocXWo["
A$ = A$ + "Z_k<?X[fFmN\8gjhZijLWiWEkaR]iNNeaTLbonog7MlmmTS;OIK>`m>o7cdI"
A$ = A$ + "ioYS1U8o7GcaC?oZUio9IHogcIgC>gj[fi?ffHO6BMLhhmU?K]Ui^fc#GW;U"
A$ = A$ + "[;Vbn:Uj8ec1Toe;oQZS[f_SBncY>RM]5iO]cOY]]OS]o3EWQN_YNM;NGR=g"
A$ = A$ + "WEQl?Gio\[g5:_a^ngnaSgfe3CI^FQ6W^:Gi>7fA;oGMomHgco=ToL>V7K>="
A$ = A$ + "anm7ec5^K=LlchaDkj8e]mf[B_?bihmCffk?oBnc?g?Il[Gio^iHomUCiJa?"
A$ = A$ + "YN;Mn3ECQf7kWWA:efI[klZeT6kNNi\n_DGokEeI>SaboJVo#ko[f_SBncY>"
A$ = A$ + "RmiOiO]cO]_oNZih\_gJFcd>]HnOS\SOF_5OVLT<KioZ[eOW[O_okm]Lm`[V"
A$ = A$ + "[eaOoHo_cMk>:REWa^NgIgc;fgoXUoDZ]HW7OeGo^k_A8cYnmGZ]CY7;f>o\"
A$ = A$ + "6GcYVgoohfNkcGbONinhmR:miFennIiVSm_oD^FlCZgBWo#eDXmaES3Y^ngD"
A$ = A$ + "j7C=FogEOOY\m^jL0iOmboIc3i>_jAncIkMLnEboJWoBkYSU]Hn1mfneg?KI"
A$ = A$ + ";Uc=2]noEHLHVcO:W?Ogl?bOFYTgkh]Nm`[VWE\k[5kNMi\]71WESW=oRDWO"
A$ = A$ + "b8VoW\fRL>n?BW;DRmOYnlL]6;Re;TB^m[eec>^]gO=Di?mLOln?UXfJAn_K"
A$ = A$ + "FRM<OoeS?>WUA9o7[[HgG9UaP[VobMG3K9FoG:OOG]mBmN;bojTo#ONi9cO_"
A$ = A$ + "Gi?e]GXiG:o[Kn;]D7;gZSD[iJE_]fFffONg<U_D>_h\ogm^>UobT_BUoAOl"
A$ = A$ + "i^gkh\[omf^NhIeGXkWMUcnn7]\WB=VcH`EO_SBncY^R]Vd#I?eeXdSaRB\o"
A$ = A$ + ";ejo[eHafeT:A=FclWjfNkjWbOJi>dmNfoNNjj7:Mn3ECYTUHI?D]Ejj]5K_"
A$ = A$ + "#W7LeH`EcQ9en`TblQbMmOY\O_JKUjmFToe9oQVKb\Vo#caBnGklGBa^GdIe"
A$ = A$ + "dEonUN>BmdI[1J6bgMbm:<>\2io\kcnTlWjlGjMVcmJegmm?JS5GEKG=6Mg_"
A$ = A$ + "oNWkLZ_#ca8finYlIWNWokDCKIkhHaa_NYg_m<c_Q]CXSAOmZFScelHHX]mf"
A$ = A$ + "eHBIO\ZioZeRLLkoTj]di?D=]me2UUHm0HkEXJ[TcC[Tio\J;di17?N6KKMg"
A$ = A$ + "eoFkeoMennZJjZ?38o[Gn3=g\DcOXOM[boEojHK[SG3DnGklGBWMOWL7S:iL"
A$ = A$ + "4jY]akHg[>daVgJFCmLRD67jMM;og?WQV;nMcOZcOYgI>fek^keoN3G?<fee"
A$ = A$ + "^jn[k_FG\_nISaS#fc]nfO]mSWCOfem7alodJj^OV^WS5UJO?JKW[fVgmhD\"
A$ = A$ + "gO>eM^c5jYeoZVoHgo9fmR_ZVJIn3ECkg7Q^oK\l7KLk>SW]8oWEKQnjaboa"
A$ = A$ + "]EZ[omZifLfJKol[O[?nlbgGZcA:UeoVjHYl_>i?dl#C=oQne]:oGm[?KkLl"
A$ = A$ + "JUbojVoB:UJn_g;JGn_jmVbL>6AWMoiHil=WGioWIoYio==6Lln\U:oY>oUN"
A$ = A$ + "WiDWSBZGo;U[S?Ji?UiI5jkIo_gCf7SLn?kc:eHO<JIn^iO46;:in=fiom\V"
A$ = A$ + "^JKNgSCYniicNOUhlSDg>[Jn3M_WWLOhFVoDVgaakS6;oa6gbM<]5ioZj:dG"
A$ = A$ + "?Fn3=>6K>8i>7U#onKcmi\e0OWiFME=MeW1Toe;oQ^NAZi?gJ^TioZOmIKWm"
A$ = A$ + "S3boJWoB:el_O<8UgK:c3HdLfmWgOLhZgC_cQlol\7K>Oanj_aaPSgW]TiOD"
A$ = A$ + "7;^cLDBmjOYLMlA;o7?f6kN=Y>W\c^6Ql?^mo[di?WmM_bL:eO\]EXgcISOe"
A$ = A$ + "J\h\k7WcfMKkLean[>7h^kgkFoYnmOefZUi?U?OLefihmNBiNgSDn_J>4ocm"
A$ = A$ + "KgMOdHi?fhF^SY]8oGEGQnjaboa]G\iRLWiX4jgOTjoSl_fi?dL\B=oiFcU<"
A$ = A$ + "oGm[?Kk4J^JboJVoBj\kk6[NR=NWjmJ7EWMoiDmfb\lOncmgM73N3S37_?K9"
A$ = A$ + "coXNn#:G_k^Gok=Lm`H7W?N<kXHWS7jmLfnXgI_gi_eS1GUiHG;hYi?UcgZi"
A$ = A$ + "LJbmL`JUoDo\gM7;>kjf7?>TjfYFi?D]TJmOgl__f>^mf?^GSl7jhjnJiZiM"
A$ = A$ + "LFngOoWc^FfIK_NVoD[i]ko6;oa6kBmc4]<oWM\>VHi?D=7K^;i<gV#_o]gc"
A$ = A$ + "XlcoYl_fi?dW9C=oQne]:oGm[?Kk4jjFboJVoB?GiSgomZ\Ub_oEGkJ45:3Y"
A$ = A$ + ">WRD^NmXK5cOXcoOBnOCWoOfakBToAL<8e[gUkeoN;G?<faeJMlohGO4cN[b"
A$ = A$ + "O?63B]F:MncMogS<OfgCYboC[[WTe]]K\[o\ONUe8oQVgjnJ9UJoYi?dHaNa"
A$ = A$ + "ZUWVoSKkSkcDg^WUk_NUBml6bO\_nfmBc9oiL>#[cO^eK\lOlLoHc9iZiZ4Z"
A$ = A$ + "V2mmLen:e]C:eFZcODnGcl7kc[Y\?2m[KEn_jG7KKMlnXboJWoJ?OicZ[LZi"
A$ = A$ + "JE_]J<8f_>UgK_cSlWGV;MnO3S5[JnCmjMiLm_gbe3S]6TJMlOT63REG]:om"
A$ = A$ + "H<8eJYFGo_7S5gIOfRkoESaRcfVQf775kleWTomO]HkcD[gBVoLldlGZJh\L"
A$ = A$ + "oe[DZmg#nS]=f^GJ>i_67o;ek=GaboacmCMm_Y>GULWocMVCE:K[[n<Pl_Ni"
A$ = A$ + "?dmAVel_]]>>W:iOMcO;V_L:eO\jmZ[K=RBI>maV3KZcoOT]Ri?WidVKnO3S"
A$ = A$ + "5[JnOjekNkG?<FmESSoSDn3EG]:omJLhZJ9W<ERgK;6;B9c7Ooe8oG]?:aHa"
A$ = A$ + "IKcWh9i_TePl7?gOm:UJo=ToHKS]kWVCn[aaoBmNcE\lOlLoW<oUJ]n_BD?G"
A$ = A$ + "mI0iOmbO\[1ERmgXUomGkEnUoF<Oi]OM:IHokmhfXV[[YES1ohH`Wog?2h9l"
A$ = A$ + "NkMNTolcLYboKI\HEcoIG_KcM^Vmnk;=bOV8Ue[DZSoSDnObJjNJnkeh`MGK"
A$ = A$ + "J]bO;6;Bmla#cS\TioZmA96;bmL_SZmaoLfWgI<IEcofmXbmcK_YloU]k]FR"
A$ = A$ + "lWkHE=N_i:Fn3M^oMGciIGoZVO_Y\m^jc0bojUoHG7I6coffJohPl_fi_fcI"
A$ = A$ + "nhok#IihaPSo_KiJLJaJ6>Kn?QN_m>?bocclMcoKI\HUcoEGkjhJFRMm_mGK"
A$ = A$ + "n=Mm`LGcbM?n?Bio9[Ck9i_WS5UJ]YU:o]H\X6[7_6i_4S5?iJamhjoUnN7["
A$ = A$ + "Jn_Co_NKio;Kg[]5O6O45;oQ67^kJ>S]^coNL?QeoMlkY4eA^OnGnGWl7Jo?"
A$ = A$ + "KiOonGnUoJj\e^N\FBimEkj]Vi?F^oj`jo:nhPloNboIcQl9io]<F\bi?e[M"
A$ = A$ + "Meeo^cfLD\J7ocI=SU:omNl8WJ[5i_5S5g]NJMn;aHaC>g[7On_dOFIEcofJ"
A$ = A$ + "<NbiHSNnobfJRZaWa_J\Z6_gkF;YLnO9GgIXJH_[N_UX>bmcobojTo#ea\Uo"
A$ = A$ + "mkGiGn[]]mMXk]WcG[5eJ]bO\c[nkOfWKRLLBnO?io\<lTlOl[gkL:oWWocV"
A$ = A$ + "cA>G[k]Mm`ElhoEgknhajLbO:KgA=c]8o]L\8gjYei_TS5Y^_?kjEe:oY^?O"
A$ = A$ + "bHbZVoWnI^A>oY<>lT?cMen\5O?UhlPF^6hD[gB]o_cW1Toe8oQV[i\Uo]]G"
A$ = A$ + "Xa1iO]cO=WgL\eaNeGKdF[gC63neaP?_Nn?m^^UolcI<g9oadkL:oG?64klh"
A$ = A$ + "[^nG\?gl6bnIW3DZSom>OQbK:g3o>i?U]kXViFToF>FlTibeRlGbaRDggWMm"
A$ = A$ + "ZJUoDgW?I<IEcoCo<g8WoD67:ajeB9ooM<8bm7?;oUXFbiLP_ne?iE\lUBMF"
A$ = A$ + "RmmCo<Pl_6io\?7>;iOofEnUoFjhmjfGKkoJSjjlNJfomaP??hmgo;iGnUo_"
A$ = A$ + "cLX[UMeeoBIKlf<k7o_jnkg=oG]=7i<GklgSaRk^VlJWoB?FTjnnH?<>[W=U"
A$ = A$ + ":oY^?ObhbZVoL?Wk=UoD67^kWibE:i_VkkL?78fj#cI=ZYLlJok9W]I>[mm>"
A$ = A$ + "O6hY[3_FioZmWlolcmW]lOW[o9o[AnKU#g3O4Z[JVgOLLhc?3:g[EoF\?ooc"
A$ = A$ + "aj8iohk[ge]l;oeJlHE_ng<NloZe^MgloTeaec<OfJi_Kn_Jo=2I>fLl:EnC"
A$ = A$ + "M>TenliLESco_C=8o]=gSDnCILHKOniWQok1aHOmLgoYTokjZJ_Dm0jhaZLN"
A$ = A$ + "5Kn?i^=BYfbiloLboCNERlOefGn_geoZI?PfGOe<oKkSPGkiR[o9o[KnY>ne"
A$ = A$ + "LioDooVYeo;ob?[mao[j9cMboIK_NWgHIN[fRUUkTo#KcN=FTJ=DSlOWjX6W"
A$ = A$ + "?OLnTkEkcoCMOnTaUDfViXdOno^e#[cm8UoD67ffWK_>nm6j[MWmO[kognll"
A$ = A$ + "Tc3f_6eO]VV<Goj?67^agKZeE>WoWCnOj[WTo[f^bomcoEckZTeI=boff>he"
A$ = A$ + "MNhm0Toi?oDNonnEO6dM_NmXkGco;BnOc[oGnUOFkSoQj=aaNDTCnSYgil\<"
A$ = A$ + "7kgk9i?emg8TiJWoF=FLWnZ5:_K__kTo#cO=dn<gj\Ti?fWc;MncMONglWbf"
A$ = A$ + "k]UoL67>^F\mOo7oegAZio^2EckGGhC?7h\am[F7k_>fmig[oM_k^ff[ZkBl"
A$ = A$ + "IPD[cJUo[f^bocboEO6LdcoC73B9ogmE]boamaI7gToj<WHBoLZPoIomi2eo"
A$ = A$ + "_8iohk[ge]l;ohh_l;o[Hn_J]fiTikToD7;>K]?gMLlZe14JK7[>NJn?KLo>"
A$ = A$ + "eiCcmK;oi<>LLmGOmm5koN7YVoLMF]^O]QehlPS7S2mjdL7HL8jfhVeE]nlO"
A$ = A$ + "Z[M_4iOoH#:mkAn_geoBmL\gBngG[U8oWEOe>oG]?ToWUO:_O=GV87gOje\7"
A$ = A$ + "E_eeo8ob?>n;oboZVoS[eh^O_g9o?MOnda`#cW>e]ma\LWlWji2W]F`B]fo#"
A$ = A$ + "[kL4coC77bI]Gg]G4YToBdcQ#ekC>?8ej;nHeW9:nf8UmOYF7UlO_N]fclGZ"
A$ = A$ + "[oMWme8VomGcXTi?gNDERlOefGn;CnY\nmeT3OL_DGgNdlkie7olNiGnW]l_"
A$ = A$ + "jFmSob_l;o_clWC?_>kkm>ioYkcW^foW^MjAnOJmoTnYUBO0C=oaF3GXmiM["
A$ = A$ + "gkmIg[kcJXmkGOe\4IkLfhBXce:aWog_m>^_7Ql7kGGjlWJ_VJIn_ZFJE^7a"
A$ = A$ + "loTaQDfGQn\GXGU:ooMKU`eQ>FSe:oYlZTi?ff_diWb:UiRDRi]=ZTOiOUco"
A$ = A$ + "ZKe?n;ob_l;obohWoX[QoP[f6AG?f9[ik>[O?UeQGRNQLLK<:mo:UJmYW?lf"
A$ = A$ + "joG=boKZoG?=oGeGYA?oUXoGbOIj1HYbO\]M=b?000`Z8WNm5kk?[No]KMOU"
A$ = A$ + "XG6?]nS]m>KOLF_7oj;WWdj1K\JZfW?LVWWm`S1iD3e8ogYo?U>o]XgOa>Vo"
A$ = A$ + "VbO9>Gh>m0L4bOYjmE9j1H9cOX]]No1000dGQN^\BK]PoN=W_Ye`EkWoWNW_"
A$ = A$ + "Lbo]bm9S3m>oif;TJToFek_#Io]ToB>6TK?0kMn;mh`Cj1HYcoa]]No1000d"
A$ = A$ + "O1koG6[iKFjogOkki=FgKX]E_cG>iOfjoGXc[7YnoDkaWDj5D_cO]Nf?_cco"
A$ = A$ + "H_joG_j1J`[mE`lgkc30000hgFmnomcO64olfol_]_?P_QaQOVokVkO?><Bi"
A$ = A$ + "oh?OY7EclOVFVm[j1D]bO_jiC^m0[eiODj1J=c_No1000<N2fo_<F_gK^oOe"
A$ = A$ + "ji_i=<>Dkn?dkl9oWo_cggniM=Qo<1>MoePaVLj1F[boXf3dI<o0000lK7G["
A$ = A$ + "F^Oo_eno1[PHm0\Umo[7m5?in#EQl?2mnJec?0000odCoIC\7o\=2TWSm3ji"
A$ = A$ + "o<_7ChmC?cli??Re=oS#?#Gel30000`ZYEmZOTnc4h\WoaJ^?7UNO]Z?oW00"
A$ = A$ + "000`JiH?9KIo?7QnN5ZVZIoo6]l300000c_FfCZA\gGQk=GMnioM4c?00000"
A$ = A$ + "`ZXH??PNNo0000006FAk3h=ekl000000#Ljg700000000000000000000000"
A$ = A$ + "000000000000000`Kf<o_m^cLf000000^bGm7k?oi?CIObVi\100000LU]nS"
A$ = A$ + "]IVjCf<W=00000P[\_oHOnaWCEObVi\100000iKVk;D\\MliSKVjAf<W=000"
A$ = A$ + "008?clO7aMFffgS\So_kMMGZL?SI300000Bg<ogALGU]I^7IcLf00000Pd<c"
A$ = A$ + "oM4G:IKVoITMVc600000TVI^7AYT]E?o00000\BVinRTbonG<Ko<RVBfFmWo"
A$ = A$ + "A00000F5ngo2moKfN6iVi\10000#>l_o5cI?RlcoklV=00000Be<oc8Yom_#"
A$ = A$ + "ooVe\10000#ZViNTTKo_docekh?0000[WINMQYT=iOmb_on_KNkATWo_i=K0"
A$ = A$ + "000L?[jon78o[Mneo_i]7AjoglV=0000bg:o_o1boJWoI^79joUl?[I3000P"
A$ = A$ + "lh_o_TOiO>kARnOUFf2mnVeloeGK6b6000`C<c[;:Uon?K5Fo[nO8ob_lOek"
A$ = A$ + "KFco<T;000PW`OoWi_ocToe>ocFOBdo_aXoOK?cMYZViO6>^2000LGnko<mo"
A$ = A$ + "AnUoIkJ0joGKkoG\ni5Z6>CYj;Xno1000l]m[AbOoW=G[CDo?ToAhioJTbOX"
A$ = A$ + "N99oiUoBeW_JgG`Imh:000`M\jmo#nUoE>oaNOcJn3U;i?NO2kAOn:EO1WeS"
A$ = A$ + "[000`c=c[=8FflcohJgo7iO]cO\gg\VoNdo_cj?E9niL]TiOTkcgCj;H?>_n"
A$ = A$ + "9k[glWo:mi`m>?000cW]e8<Scgl\\YoO[MoOToe>oaNOcJn[Ioo:ec;GYj;h"
A$ = A$ + "Cbo\ZEWG_=VNg_ogjW1;ilXViiT100d?7Goc<=Oc[bfZgo3iGnGil7km=[i_"
A$ = A$ + "4mo[Dmik>m^:Wn2ZoOmicek7?_kfh=ni`BoWOh\mW7900#o]O>VngoRiOmoj"
A$ = A$ + "oQom?#nGklWchD?jcgMjYEZeZnoe^noMfaUDlfnLHYbmKNLhZj<gNhWbfl=i"
A$ = A$ + ">iOV8ob_l;ob_l;om?oaFkC=ZY[VWK?bfagCYWknXh\S]komkMMFkl7jl<iG"
A$ = A$ + "nUoOWoNg[ZBd[[Lco\;DnKemM7ejM4cmKLLH;oaZec6O^jki=ToWLnaK>OYF"
A$ = A$ + "kU8o_maYIlh_l;oboeIoZl?cS1[Nng636]co?^fXJD?Y\Vbm_WFV]F^f_[bO"
A$ = A$ + ";[SD?_LfbO?Go_l;o[Ln71b_Wo_A?g_aaQDkaN^I\Fc9]dI?gaW#c9>e]C_c"
A$ = A$ + "K\S[e>o_U?;DcSo_Eb_l_Ziohl;SUoIM<h]ToJ]_3MNN\co[I=LeaVBoIa#7"
A$ = A$ + "O_jhO977B9KQfo]H=HWUoF_6`FG3m<oG]63iGnUOiOUbO=V[afnk^KSFF_e8"
A$ = A$ + "geHn;m>Og]FCY_=aN?SnH#>I;U[oLWaXNWm[ZmBToAJMR?ILj97oO[Toe=oY"
A$ = A$ + "dS_Fe3TNWmDWoi\<6lVbO]^gJ\nKUj_O]cF\eOlTJh\eeLlHK>_gB<fOehoa"
A$ = A$ + "eVE;7cO]MFn3MmgFTmF>6TjiO[Nn[IO7B9o]Z>TOiGn[kLYnbMg6k[gJF[e:"
A$ = A$ + "gUX^;mf[eIOoidYDokO_kg6SjH`a?_6kcfYDoGmnBIO=Ji?dL?B=oQfFSFnc"
A$ = A$ + "M<j97oO[Toe=oilIfgjW_C=?iVognH`K:oehL_#cWoZioGSiYWbmXS]>QBTi"
A$ = A$ + "DccCnNciLZSI[TiOd8oboMcO9LF??>[V[M_#TOiGnKceM^kfXEeJ]bmZgo_k"
A$ = A$ + "FkUJkdj<7Znb]f?km?R[?n\Jj>eKYgNe<g?mhIYNoS`i1m:oS^E>oUnco_9g"
A$ = A$ + "]G>aj3D[[mI;oGegY]mEYngof#cMo>WoGbjXVokOK9kMGYgFGU=moAnUobfK"
A$ = A$ + "QB=_dJe;4iGnUojNMWooo_oamg6OnON?G7Foon^FgoIQkMnc7oHK=RS1Yf_Z"
A$ = A$ + "k>WeA]oGGEC?YF[af\FI>eeEFRSoUJk?JSC_]L9oiWQW\noNdo[k^?;Eo[^K"
A$ = A$ + "ocNJNfO?gI:oWE7UNmo?]f;eHHZIk^ioZeVlde0Ubf>UJ\Fio=#nUokVoLDb"
A$ = A$ + "NNLFF:E_#TOiGnkoeWV=okaWbegbB_mZMfg>gZDWSES]I=bla?Gmde_6jkOD"
A$ = A$ + "joeEio9[mOof=dfYgi?deN3E7ehhoMZSAhlRJToAg:WoBEkmH<h9kcBoIbB\"
A$ = A$ + "mb9??mj[SNnCmJe?IOEbkA5kN[?ihO>[o9fnj\ePDSe1MejN>KoYo?b_lG_n"
A$ = A$ + "ODkNNLF^NJM;ob_l3UA]F_f8_FhDjoEYbm8do[DbO9[_H[OYGi?UeTfRnOdS"
A$ = A$ + "noUjmjjEoOTob?GTLfVUlJOa63b]F^knj>SkeHNQ?IKWCNfoNcmW1fg#n?;C"
A$ = A$ + "YdS\L7[[Mn_kWObIm?Q6W>kmfRk7WK=Xo?b_lGfnO\mi\AHlIO]TK6TOiGnQ"
A$ = A$ + "bHkL`BoISmWO?JWg6J^iUlcHaVonX<FDRe>=2kSkNln\kUDSSoYF7enhlCOO"
A$ = A$ + "SnnMDZSNVoLfVelJCi^];E?L^C^KaiOeXf^kJPOKi?dggCFoOXiNgRlWjL\:"
A$ = A$ + "Ao?b]WK]#ZedMboX>GcWLNcIWS:oek?oRN;U\UB_36YNNLEFC=?b_l;o#IdZ"
A$ = A$ + "nodkLNF]eRl?BS5QVOE;joB_boI[3]UWogZeMWcnZGOn_fS5[HnOB_SJEo?N"
A$ = A$ + "JMod<gb?3NFmERaRDjCb<To#eH^Io\c9[MncmcJYT]cN?W=V?:cohZjl9i_g"
A$ = A$ + "i[6OVAn_nJ0c#fC=KWe_PAicig9cGU;iGnUOX<Fino]:moj\jZfed8<7]DFW"
A$ = A$ + "A;>n?Jmo[ei?gjCn;OVSMNI=>7LKOMehL;joG^mQZVS1UJ\8WN0lVcOZOniZ"
A$ = A$ + "aZNN_X#kkWLL=ff;Wmc8h\Jn\SGOmo>d[A>[i<VLEfFml_mnjmL;[iH#>GoK"
A$ = A$ + "oWIjM]GR\WbWoUOiOEc?D2eJ=`eN]eUZfZMm=RO6NdFoO[?N_E7]nhO]kiE:"
A$ = A$ + "I>FMeZlWJm9oU?c]<gY>>ldaRLcl8NMXkF[?YGI_YloTggK;oYV]H_WFMOmJ"
A$ = A$ + "<fTBV^caogVWLlOUbo8>gjJ=6Llcc>n;obojVOX4Fmno]2mo:FngoOWQmE:7"
A$ = A$ + "_gG;]ZN>[7PmXoOm>oGEObOicL?bM:S3?M\hZScG]>ZN<6LF=Ebno=;i?dH`"
A$ = A$ + "MOOSJnc=KWmN6QiHDbaWHiOUOngToakJKU<ojoWno8obo\U=6;[LooFUnOMf"
A$ = A$ + "aVFUoAZ_3mXFJM=4[?2SBnkEooVilOFV7U[77JLX6mo[fWOeRc?_Z^_Z7#cB"
A$ = A$ + "n3Ekg]gWm>gaZoLk1J\_oA:S?I\iZSOclJT\ngkMno\Uo[>oOekoYl;o[JnQ"
A$ = A$ + "BHUkoG;Z_AL=8[Fn7Ue2gbj8fnJDbO_jog<Wo[bl8OmWk>F4KNBS`Wg_ka[D"
A$ = A$ + "?VmFkmI9ZoLjmiX>gicZeHI;UlgkLESc;2UoEoiOKeco:OnOXgg<TmLbVl;o"
A$ = A$ + "[LnQWBooVonO]jiODF?H>[]_6IN4>7l\NPEcno]2ioZnZ=2GkYdeJ:mDMTbM"
A$ = A$ + "Xjo^mZ>enXnfcO:[mMOF7eciCiLhHi#o_^^o?SnijiToD>n_jiOU?o?di0c#"
A$ = A$ + "fc9Kb_l_bi7NZomN]OnO:kj_[af]Def:eo[E?oQjA#?[SFd;ZHm5Id>o[Eoi"
A$ = A$ + "?\2io\]k8Tk#ekC7;2]>aAjHmM>fUJ>>kkIVbO:mo;F?djM^b9oidClHSG_Y"
A$ = A$ + "<Wki2ajocfHgGOYNGkUK<hkLMecogZVoEoloAH^e]J<hhecUOiOUc?D27o<e"
A$ = A$ + "X_M;E]]BmoJecOXiC=keaXTiNEO[Hn7m<GSj>fgkK8gQbB>S5W]>aI:oYdo_"
A$ = A$ + "gfilW=6TB^fgGTEliOJKLJ[_GKjM]G^aP?gigoIF:o>oOFkA#:ICnUoE>o0g"
A$ = A$ + "cZeo[#eD[VcD;gGYN<H5kogXMoSJoWOg:VoA?ceH\h]ViB<F<Cmnl\lWJooN"
A$ = A$ + "kI?WaPDkCjKD:IKK<J6kmegIlWm0CnMnO\gCXNTnF]?;b_l;occefPNKejoE"
A$ = A$ + "XJJUjoiZgo_AlNSQ^7G]jogZToA?ceH\h]ViB<F<Sc1>ein>SI?WaPSc[HTV"
A$ = A$ + "OA9bOJ?oCcK__n>Wo\7HbOjWSlFUjiojoYl;o[In1^WE[oGQZYHc[j=__BmH"
A$ = A$ + "`Zeo_AjL_FEO[Hn7m<GSjn]ViBTWILNRYVYI<kiT]HWW<;iOfnL=UeZOn_nO"
A$ = A$ + ":obojVOPkihW_ZMo_6]?37J]Dc`nj\JH4F;Qnoe^j;dm#7]lGjjKdcL=ZkgJ"
A$ = A$ + "V;ANVai9VJVVa\WCffoNfjG`7Cdc1ffOFQ7cI_[;63[nionco#nUoe=o0gcZ"
A$ = A$ + "olo]J6UN4dbj#ooF_l?jI^6emK=cU8?chl4mloUgjOfjkaVNGkUK<hlomOPe"
A$ = A$ + "fZOn_ol?TOiOMc?`mLL>3e^oO]JOAlS1S`j4mloe^jKDjiK;[_A?ceX^O[I^"
A$ = A$ + "4iI6WWXWo_Lnko^i\g7OWahoko0[]EolOoiO8obojVOPk9dJ9VQm5a?6<2[C"
A$ = A$ + "dcoGkZ_E<oSNV[AMoFcL9bc<>?A?oOY_nWI^g7OWCoIWb_]jWok?o3iGnGgl"
A$ = A$ + "30GKDjA#[Ono6ikODkjK5coXWiJDg_e<GRl<ScCdcogLW=PW;fL9WQ[A\USL"
A$ = A$ + "On_TOiOEb?0L]SoI5g[WUPFF7Snm?JmcogX=gP#gS_d?oOSFV[aHaK=cUH\H"
A$ = A$ + "6W3LZcmM6cN^S10[YmoI4\MmRIjiPLK^a7cYl;ob?0TR#Gg\Gmo[EeaXoLAe"
A$ = A$ + "bWo_AM^1KgS_Dio=TiB?FlVclC7;Vei0WbLOWe\WcH0`JJk?OPSoI:gkjZLi"
A$ = A$ + "kjom?AnUoE=o00Q<j?o8]jioKol3jMVoM=Ffk_o6bLY7;NcInYS5cjLPCI^_"
A$ = A$ + "cJfcI<0H=]o?cSIkJOOWacogo4iGnGel304bak=^M?TNGG]Zn>>oPNWgheIi"
A$ = A$ + "^onK9cUL\h]WiW<F<cc1nZin>cI?ea0Ped\O]__cIhi7:obo:WO0P#6UOVWk"
A$ = A$ + "EmmVj9DY^onK:cUJ\H6blM7;Vmi0OfLOWm\WbH0000000000000000000000"
A$ = A$ + "0000000000000000000000000000000000000000000`hkc?n\ke`K\f0000"
A$ = A$ + "00N36iN\=be600000`Xk[n[]YgebKZf000000N3nZmJOmok[oK_[UgD]1000"
A$ = A$ + "0c\]79WNmm3m#=N6d6QW[]M?RM3GnC]f00000:[WncSWONnNg:aa^AkhO:eC"
A$ = A$ + "_joG]7[do?0000hWnhS?n[N^=jUO\PlKd?PWnmgKKmQhY?oS?MK<27okifX6"
A$ = A$ + "iZeeLZKcF<>]ji70000fKo[N^=jFneo_OlOkefXWioYomafXmgYKYLnH=ZiD"
A$ = A$ + "fV]jc:YlLheSlWB]1000#i]oIGk>?oJ?mk_gFmnom?eo2ocoK9niAl=ocdh<"
A$ = A$ + "VoDj3E=ZiDfV]ZGYmhW3gNncM<0DF_migGb\_:S1abmZ=>4J\Xgec8LN#_[;"
A$ = A$ + "Pbhh[FomgK[n?o_[NoOWanO]ji?en`e[noeRa:mo30NR_VCgf[ghlk:A^?nJ"
A$ = A$ + "V77>;g[bh`nec4:c_eejTKn?khn<WOHELlE[on71UH=`SB_?^ei0;lcoWSoc"
A$ = A$ + "gonOdcn#eSn^Mg\eSl?JW[00QYoO[CO_fWkolWoLZIKLh\Nn]?cQj3f\<>Lg"
A$ = A$ + "lgkj6NRkn<<mfOfW:A6VRa0moAoo6P]A??n?2KSFWYI^oG[Nn1PWAoodo_I_"
A$ = A$ + "oOajiEXaQmoNcdi4a>O?DnW]\_j:EoOjM>^[S_ZmggXYDoloekLlTjO4f6mR"
A$ = A$ + "noiho8\=JMVVinO]ji70N6moK]jga:go_#mhk\no=CS5jogjj9m`J6joeaGe"
A$ = A$ + "nkKdXoOjoSnoeo]A??n?2KSFWYI^oG[Nn1PWAooF[nMXoO[Gooll?^fNB?\V"
A$ = A$ + "RnO]`olon?i#oo6R]A_XoO>n?2KSFWYI^oG[Nn1PWAoodo?moK=jogZVoEgZ"
A$ = A$ + "ocokoTSKf3[gN__:A6NkS1joSno=2KSNNlO4f6]>CcLo_Fml30?SnoYoOjog"
A$ = A$ + "Lgo[E?oKS1?iioZgeoSco2go[E?ojoWnoXoOmOKdcSoS`fXeIJVkoeZWoBIF"
A$ = A$ + "N6oUOiGnUokToEX_GWUKmoCooVinO]jio;kOEc_WAe:go[E?ojoWnoXoOmOK"
A$ = A$ + "dcSo?mkOd>n_jmoJecO9leLJ?>oggnlLUOiGnUoL63FQnNMF^eo?moKVkoeZ"
A$ = A$ + "Wo_XoO[Ko_Fml[oOjoSnoeo]QSoU=CUhmlFf_SBM<:i_4Fmeo_bi?DfGYa0i"
A$ = A$ + "O]conaQEX_GWUKmoCooVinO]jiOK<`?o_[Io_Fml[oOjoc\eo77oGkSo[Lo_"
A$ = A$ + "BMN9m8o_Yi<]bmoJecoZgoWE>oKI?fio[`H`naREX_GWUKmoCooVinO]jio_"
A$ = A$ + "S3If7SgNO?:AFVUaPE>ojoWno<Kmoaaoenho:go_m_6]lWJ]=2FinO]jiOUk"
A$ = A$ + "oeZWOmokWS5[#O_>;gjoWno=cmoJecoO77do_Vmm=JFil[oOjoc\eo77oGkS"
A$ = A$ + "o[Loofo<fMFOfJMngVWXWo_g1iOMc_noYoOKS5[#O_>;gjoWno=cmoJecoO7"
A$ = A$ + "7do_Vmm=JFil[oOjoc\eo77oGkSo[Loo2mZgi?eJJT\bmoI;ok73N;m]En;C"
A$ = A$ + "fGmnoMVIO<HoHa:dg[cbmaGclhPno]NmoJecoO77b\?6_mnNDR\<;S1[LnGi"
A$ = A$ + "noERW7UgdcdbIenMZoWnmgK>n?Wi_7om#GZKcFogoOQjgF;conmo8N^bIiIE"
A$ = A$ + "Gg_l;o[Jneo_O>F\2mmj\L[oOjog<go[E?ooML#ooJfggXIUco:go_m_jifH"
A$ = A$ + "4boMZoWnmgK>nokJ?eGSJnCY7C?9g?ILX5moj\J[eio>SASRE]o7b_l_UoEn"
A$ = A$ + "iO<FnGUaP]aQ]G[J^?nJV77do_e[oG[Nng63bijk_mWkUBTUII<HUcoZolOM"
A$ = A$ + "L^mgan]A_ccCbofebciea_oNWWL]ohhMOmV?oO6conG7oeQZiBmjZ]IXJ[f7"
A$ = A$ + "CS=^dblWB]=Rdo7iOUcoaaPE>k[lH`n[_gkjY7i>dmijMmeRLOF_oVYaQSIn"
A$ = A$ + "hom\nO=3S5jog_GS#:mo>fLLOKb=kcfH`:WokVmII<X4en\TokDocdaoBlZg"
A$ = A$ + "iY4i_5O_edMk]E;>7Z5moJO^cYF[AnSmNO3cGLeGo_l_fiohH`:WmEN<h=M="
A$ = A$ + "kJTk#g3_geG;b]noYoO[Joo:mkOTMg\<;S1gmIHj^OOSTWVQgnH#9ZmI9o[h"
A$ = A$ + "aoBd?Vgdcdd:ToD^_D=Zi[fV]jnUYT]NToAlLU[bc:_nOiGnGel7jW]S]l_:"
A$ = A$ + "S1KS3c#?>NB^?nJV77do?mo;Wl[oOeM^lSHfW]aPE>o?=3_maPBDkcBnMlO]"
A$ = A$ + "?n?;i?UN<ESJ>U]I;joE:eA_boXM^B:W7]b[mGnGkl_bmoK;_kcn:=6\=>\m"
A$ = A$ + "JEcmaGclhPnomcoNP:FoognmVQaR#mo;UGjoGj_oAfMcb\<6hioKMOn_llo]"
A$ = A$ + "f7oWaWo]E?oYL?YNml_eRkGjio[\SU[F_?TOioHfG]aP#IOe63f67fN]Zinh"
A$ = A$ + "[INLhhak#V]aQSIjhaj#Iohkm=?F4ZoOa>f_OL#ooZoLi7a\?KS17kkM^io]"
A$ = A$ + "fkSWTmII<h9I?dH#_ccM[mWNlo]N=Pmg3oYSQ_ak1>Si?en#EjcICILHDjoE"
A$ = A$ + "_boKd8LlZWIO5kkQl[oOjoWno5je<?>hioccoGZ_VYnoM\oVUnm?b>nZfOOS"
A$ = A$ + "VE>o[ncoUWo_enho<nl_]ji?UNKekWo_N?Fe[lckcZO<MUco<]>WWVmEM<HD"
A$ = A$ + "^WE_bmaGclhPWo??oOWM\OFOnoFIgmnKcbm5GilodNHnd_oN[4en\TO7oGkS"
A$ = A$ + "ocBncY?LU\VCIK>:g_XGi70N7VUNLlTLOle<?>hioccoGZ_do?hMkYm`l]g3"
A$ = A$ + "dIliObaO7oGilWBOXjecofXdS<?oO0`Ido_e]oONnolloiio30PgPA^?DSL]"
A$ = A$ + "10\IFjaaCbm:go_#IOf67^:cWMN`<<Fhio30000FKcB?>NJfGYaPDj1f\=>T"
A$ = A$ + "COoV]aRHWWWkG_gi00000hNdo_e[?7joGN_NkS5QniJ>d_G\_n<<600000[\"
A$ = A$ + "E^oO[LnGaOnW3mgmQQbn\M>Qno10000[]I[G7bOniNUkog:l_1:WUWSi>e_?"
A$ = A$ + "0000PgUEoO_ZFel7[gGm^^6QSecfHaMcc\=>000000000000000000000000"
A$ = A$ + "000000000000000000000000000000000000000000000000000000000000"
A$ = A$ + "000000000000000000000000000000000000000000000000000000000000"
A$ = A$ + "000000000000000000000000000000000000000000000000000000000000"
A$ = A$ + "00000000000000000000000000egWOlIFOmEYF000000V1SD?g6YJ100000H"
A$ = A$ + "6lATN[5k[_:e200000cXAji\ZEeb8m<WejJi[nZ]9U_N==Be200000c:mo[_"
A$ = A$ + "S5mXF6YWi^AZFPEaoo7_>mG_Ze2000`\JTjcB[ZUAZWC]^F6YWi^ND;KKc[n"
A$ = A$ + "_]lHo8D;[P?no7#g\o[Mf_o<E;oMKniWO;d_^UiO0Z5000PIg8mcII[ZUE_o"
A$ = A$ + "GKKoLnjeN<XUeb8ec]ND;K=Gi_e`^WeZSoNeF[[U_jUdOncOn7KmFjhok]OM"
A$ = A$ + "m?fgnJi_kSMmH;h_^QiO4Z500PigKHmO#]=BW[iio[^ebofKQ?giSMniG_ni"
A$ = A$ + "^mebgKk[o_];o][FnhOfPOn3OmOneG[Ai_eebnnZMVFgo_FE;SD?g6YJ100H"
A$ = A$ + "n=2mNK4ZQoIo=0om]C;[QHk[N<>dcJacoGO7;JI]lcWYX?Sd[Q?KB?#jA]lm"
A$ = A$ + "cGeW9nO[OnKI]\O<oH?ff[e7oKE]\oi[kZn]e^So][FnacGhWogeGfgc]]fa"
A$ = A$ + "fhlgkJ100F=kGSI?j3#?goQFgM?cOG63f]T[FWmND3afGmHLH4ZUAXgO]^FR"
A$ = A$ + "]O6Q?oGSJiHoffL\OK7ojeHMgmXF2e_a[n_]:o]XF>fWYDjiF;bO[ZUSold^"
A$ = A$ + "OKOloM]oi0^7eb_oI=nhcMk?oe]<om\F0PeffL]kilokij`Fml_Zni?[A]kW"
A$ = A$ + "mYAHookmm8ToFocOFOokKkFG3afGQnj=9k=^FniiIWmcOIKokonFE;W_OniG"
A$ = A$ + "_=i_=ebaN^laQN[4k[gRnodRJAoonmcIfEmK[E7oKA]lkN>M^ffo[jG;[Nn1"
A$ = A$ + "02iS5_oG[NnGAKc]jW[aX3omoB7foQfgS#nKE=lSiEOh__MJMnKE=lgak0k["
A$ = A$ + "#OmF<ngbJ9dj^?_o;]il_FE;QjkbIkoVmi_6D;OO]V`?O=Wme[fin=\F>^]_"
A$ = A$ + "ZWK]<o]XFRmi]cjgF;koG][UHkc[dblGcJIec?iLlYmomOcXHkN>cjn;US5m"
A$ = A$ + "hho8<68o]k?koN^?3G3OOLXmi_?kkSe`nok:\_oNooKcnn?fj?kmjOKano\e"
A$ = A$ + "NgklgRJhhl_Sf3Z6UoFD3Ge[aHOmZol?dXJi\n]]Yg[o[Veba?_5Jo4j[GoW"
A$ = A$ + "oUfD;o^gJOoO_j[G[lgbJiWKkddVlgVJi\N^Le_G=?o_Eeb8ec9moKLZU#eF"
A$ = A$ + ";W3N_GkKhJZe?okSAno^NjacoOO73jaj`kmJokM]<JiOomOKI?8Jin<N=lma"
A$ = A$ + "QfWof__?F3mjN]mJOOfn_gi_5kOmokgk_A8o]X6do?mo;fiKmNmOeZFneiKA"
A$ = A$ + "kahLocoj?Gcajmlo]O\lZog]khOm[5moKLnI>]7ebZWoD[[SGgI6fGiNLIkn"
A$ = A$ + ">]HnO]HOUKmdjlgkaPOO\XWokOEOk1d:WoFL_oN^??[6>NLXUi_ekkH73JaL"
A$ = A$ + "O7QmmIWoekco]o[on?Umm8ToF<okoIOXoOAojEOm?M\oOajcB[?o[5eB?jid"
A$ = A$ + "8E;aFcm_?6d_eoGcJiZiKdbiQdSJi\mAXaoFoioJG;7??:UoK[>o_5ebZWoD"
A$ = A$ + "[[SGgM6fGiNLiS5^oOenJOmJoUK]dSlg[aPOO^Xno]27o_J=hmLmo]HLh\k3"
A$ = A$ + "gblg[keOL>W7WoIKnl_mO[goQfgane]<o]Z6nmnjojedOO>TkAn[K=lcmggk"
A$ = A$ + "[ON=gOF3]Il_=eB\[anmhmWojg[5i_Eeb_6c?\O>k[GmSo=ZF^J>7SdlOZA]"
A$ = A$ + "8oQFci?oI?YWi_feba[kTbo]fi_UebZWoDZY?do_^lioNWo`G?BooVYmiEeb"
A$ = A$ + "fmMnnoZoOcdn<eJH4VoG[^OgZVo#c_Xgcoan_=koAH>Wm\6nMO6fogele]g7"
A$ = A$ + "mZ6fOof?nA_enlR_N=7oKG]4KnV7G3B;^>L?ZU#W_Mll\HOmFL^O[ZU#S[]j"
A$ = A$ + "OgG7QJAn3gg]A9oe^F^JNWm>oe^FFmlWB=]IVfGSH==JiOOmdjlgkaPSeB?b"
A$ = A$ + "O?73nN>GOoOWamiIeB[FkK?gWWE37k1a<__?F3Sdmo7UiNdRnOHognmo8<_c"
A$ = A$ + "NF3kgg7G_enOM[bO;ZQmmL;dn:nG_^mo[EebIG[MomNJmiO]ZFniiK[g?o[Y"
A$ = A$ + "<ngbkofcJAnUOiOMc?07mel\goOWemIlJYmmQMLjmk7ojom\__3M<XW7okan"
A$ = A$ + "^Wck`n_OkoAHNWm\6FalWJ?G7QaoJD;boJWoSkoHmL\FINTZ5iGnUoe=o00\"
A$ = A$ + "^2eoaNgoCkof\oS]_7QlgZn_]Jio\mg8=nG[JAnGklOF=Dkl>ReRl;obojVO"
A$ = A$ + "000000000000000000000000000000000000000000000000000000000000"
A$ = A$ + "000000000000000000000000000000000000000000000000000000000000"
A$ = A$ + "000000000000000000000000000000000000000000000000000H>lo1lf0]"
A$ = A$ + "%%%0"
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
|
|
|
|