Code: (Select All)
'ASCII tile maker
'by James D. Jarvis Sept 21,2022 v 0.1c
'
' a very minimal program to create a set of ascii tiles menat for use as sprites and backgrounds
'S - Save file
'L - load file
' can save files unencoded (encodingg 0), or tile channel endcoded (encoding 1)
' currently hardcoded to use encoding 1
'use mouse to draw
'? or H for help to see other commands
'
'nothing fancy here at all, just a minimal program that functions
'$dynamic
Screen _NewImage(80, 25, 0)
_Title "ASCII TileMaker"
Type gcelltype
t As String * 1
fgk As _Byte
bgk As _Byte
End Type
Dim Shared maxtx, maxty, maxtiles, pen$, fg_klr, bg_klr, pen_klr
Dim Shared tileX, tileY, smallerxx, smallerxy, smalleryy, smalleryx, largeryy, largeryx, largerxx, largerxy
Dim Shared showonion, tilerate, lasttile, tileno, tileshow, encoding, hightile
tileX = 8
tileY = 8
smalleryx = tileX + 3
smalleryy = 2
largeryx = tileX + 3
largeryy = tileY + 3
smallerxx = 1
smallerxy = tileY + 4
largerxx = tileX + 2
largerxy = tileY + 4
tilerate = 20
tileshow = -1
encoding = 1
maxtx = _Width
maxty = _Height
maxtiles = 256
pen$ = "*"
showonion = 0
hightile = 1
Print "ASCII TileMaker"
_ControlChr Off
Dim Shared gcell(maxtiles, maxtx, maxty) As gcelltype
For f = 1 To maxtiles
For y = 1 To _Height
For x = 1 To _Width
gcell(f, x, y).t = " "
gcell(f, x, y).fgk = 15
gcell(f, x, y).bgk = 0
Next x
Next y
Next f
tileno = 1
fg_klr = 15
bg_klr = 0
pen_klr = 15
oflag = 0
Color fg_klr, bg_klr
'main program loop
drawtile tileno
Do
_Limit 60
Do While _MouseInput ' Check the mouse status
If _MouseButton(1) Then 'draw that square if the
mx = _MouseX: my = _MouseY
_PrintString (1, 1), Str$(mx): _PrintString (12, 1), Str$(my)
If mx > 1 And my > 2 And my < tileY + 3 And mx < tileX + 3 Then
gcell(tileno, mx - 1, my - 2).t = pen$
gcell(tileno, mx - 1, my - 2).fgk = pen_klr
gcell(tileno, mx - 1, my - 2).bgk = bg_klr
Color pen_klr, gcell(tileno, mx - 1, my - 2).bgk
_PrintString (mx, my), gcell(tileno, mx - 1, my - 2).t
End If
tsize = 0
If mx = smalleryx And my = smalleryy Then
aak$ = ynbox$("Resize ALL Tiles?", mx, my)
If aak$ = "Y" Or aak$ = "y" Then
tileY = tileY - 1
If tileY < 2 Then tileY = 2
tsize = 1
End If
End If
If mx = largeryx And my = largeryy Then
aak$ = ynbox$("Resize ALL Tiles?", mx, my)
If aak$ = "Y" Or aak$ = "y" Then
tileY = tileY + 1
If tileY > 20 Then tileY = 20
tsize = 1
End If
End If
If mx = smallerxx And my = smallerxy Then
aak$ = ynbox$("Resize ALL Tiles?", mx, my)
If aak$ = "Y" Or aak$ = "y" Then
tileX = tileX - 1
If tileX < 2 Then tileX = 2
tsize = 1
End If
End If
If mx = largerxx And my = largerxy Then
aak$ = ynbox$("Resize ALL Tiles?", mx, my)
If aak$ = "Y" Or aak$ = "y" Then
tileX = tileX + 1
If tileX > 40 Then tileX = 40
tsize = 1
End If
End If
If aak$ = "N" Or aak$ = "n" Then drawtile tileno
If tsize = 1 Then
smalleryx = tileX + 3
smalleryy = 2
largeryx = tileX + 3
largeryy = tileY + 3
smallerxx = 1
smallerxy = tileY + 4
largerxx = tileX + 2
largerxy = tileY + 4
drawtile tileno
End If
Color 15, 0
End If
Loop
Select Case kk$
Case "n", "N"
Cls
tileno = tileno + 1
hightile = hightile + 1
If hightile > maxtiles Then hightile = maxtiles
' If showonion = 1 And tileno > 1 Then drawonion (tileno - 1)
drawtile tileno
Case "p", "P" 'play the animation
playanimation 1, lasttile
Case ",", "<" 'cycle down through drawn tiles
tileno = tileno - 1
If tileno < 1 Then tileno = hightile
drawtile tileno
Case ".", ">" 'cycle up through drawn tiles
tileno = tileno + 1
If tileno > hightile Then tileno = 1
Cls
drawtile tileno
Case "f", "F"
pen_klr = select_pencolor
Cls
drawtile tileno
Case "b", "B"
bg_klr = select_backgroundcolor
Cls
drawtile tileno
Case "S"
savefile
Cls
drawtile tileno
Case "L"
loadfile
Cls
playanimation 1, lasttile
tileno = 1
Case "h", "H", "?"
helpme
Cls
drawtile tileno
Case "r", "R"
tilerate = newrate
Cls
drawtile tileno
Case "c", "C"
pen$ = Chr$(newchar)
Cls
drawtile tileno
Case "v", "V" 'eyedropper that copies cell from previous tile in the same position.
If tileno > 1 Then eyedropper _MouseX, _MouseY
Case "z", "Z" 'zap a cell .... well erase it
zapcell _MouseX, _MouseY
Case "D" 'duplicate
duplicatetile tileno
tileno = tileno + 1
lasttile = tileno
Cls
drawtile tileno
Case "X"
newanimation
drawtile tileno
Case "1" 'show tilecount
tileshow = tileshow * -1
drawtile tileno
Case "T", "t"
inserttext _MouseX, _MouseY, pen_klr, bg_klr
End Select
kk$ = InKey$
If kk$ = "f" Then _PrintString (1, 1), Str$(tileno)
Loop Until kk$ = Chr$(27)
Sub drawtile (f As Integer)
Cls
For y = 1 To tileY
For x = 1 To tileX
If gcell(f, x, y).t <> " " Then
Color gcell(f, x, y).fgk, gcell(f, x, y).bgk
_PrintString (x + 1, y + 2), gcell(f, x, y).t
End If
Next
Next
Color 15, 0
If tileshow = 1 Then
_PrintString (_Width - 4, 1), Str$(tileno)
End If
tbar$ = String$(tileX + 2, Asc("+"))
_PrintString (1, 2), tbar$ + Chr$(30)
For y = 1 To tileY
_PrintString (1, y + 2), "+"
_PrintString (2 + tileX, y + 2), "+"
Next
_PrintString (1, 3 + tileY), tbar$ + Chr$(31)
tbar$ = Chr$(17) + String$(tileX, " ") + Chr$(16)
_PrintString (1, 4 + tileY), tbar$
End Sub
Sub drawonion (f As Integer)
'i don't work and it makes no sense that I'm here in this program
'noted for delete
For y = 1 To _Height
For x = 1 To _Width
Color 24, 0
_PrintString (x, y), gcell(f, x, y).t
Next
Next
Color 15, 0
End Sub
Sub eyedropper (cx, cy)
gcell(tileno, cx, cy).t = gcell(tileno - 1, cx, cy).t
gcell(tileno, cx, cy).fgk = gcell(tileno - 1, cx, cy).fgk
gcell(tileno, cx, cy).bgk = gcell(tileno - 1, cx, cy).bgk
Color gcell(tileno, cx, cy).fgk, gcell(tileno, cx, cy).bgk
_PrintString (cx, cy), gcell(tileno, cx, cy).t
End Sub
Sub duplicatetile (fr)
For cy = 1 To _Height
For cx = 1 To _Width
gcell(fr + 1, cx, cy).t = gcell(fr, cx, cy).t
gcell(fr + 1, cx, cy).fgk = gcell(fr, cx, cy).fgk
gcell(fr + 1, cx, cy).bgk = gcell(fr, cx, cy).bgk
Next cx
Next cy
End Sub
Sub inserttext (cx, cy, fk, bk)
Cls
Print "Enter Text You Wish to Insert"
Input txt$
Cls
For tp = 1 To Len(txt$)
If (cx - 1 + tp) <= _Width Then
gcell(tileno, cx - 1 + tp, cy).t = Mid$(txt$, tp, 1)
gcell(tileno, cx - 1 + tp, cy).fgk = fk
gcell(tileno, cx - 1 + tp, cy).bgk = bk
End If
Next
drawtile tileno
End Sub
Sub newanimation
Cls
Print "Erase Animation and Start New One?"
Print " Y or N "
nflag = 0
Do
k$ = Input$(1)
Select Case k$
Case "Y", "y"
ask$ = "Y"
nflag = 1
Case "N", "n"
ask$ = "N"
nflag = 1
End Select
Loop Until nflag = 1
If ask$ = "Y" Then
ReDim gcell(maxtiles, maxtx, maxty) As gcelltype
For f = 1 To maxtiles
For y = 1 To _Height
For x = 1 To _Width
gcell(f, x, y).t = " "
gcell(f, x, y).fgk = 15
gcell(f, x, y).bgk = 0
Next x
Next y
Next f
tileno = 1
fg_klr = 15
bg_klr = 0
pen_klr = 15
oflag = 0
Color fg_klr, bg_klr
End If
End Sub
Sub zapcell (cx, cy)
gcell(tileno, cx, cy).t = " "
gcell(tileno, cx, cy).fgk = 0
gcell(tileno, cx, cy).bgk = 0
Color gcell(tileno, cx, cy).fgk, gcell(tileno, cx, cy).bgk
_PrintString (cx, cy), gcell(tileno, cx, cy).t
End Sub
Sub playanimation (ff, lf)
For f = ff To lf
Cls
_Limit tilerate
For y = 1 To _Height
For x = 1 To _Width
Color gcell(f, x, y).fgk, gcell(f, x, y).bgk
_PrintString (x, y), gcell(f, x, y).t
Next
Next
_Display
Next f
_AutoDisplay
Color 15, 0
End Sub
Function select_pencolor
Cls
Color 15, 0
Print "SELECT PEN COLOR"
Print
Print " 0.",: Color 0, 0: Print Chr$(219),: Color 15, 0: Print "16.",: Color 16, 0: Print Chr$(219): Color 15, 0
Print " 1.",: Color 1, 0: Print Chr$(219),: Color 15, 0: Print "17.",: Color 17, 0: Print Chr$(219): Color 15, 0
Print " 2.",: Color 2, 0: Print Chr$(219),: Color 15, 0: Print "18.",: Color 18, 0: Print Chr$(219): Color 15, 0
Print " 3.",: Color 3, 0: Print Chr$(219),: Color 15, 0: Print "19.",: Color 19, 0: Print Chr$(219): Color 15, 0
Print " 4.",: Color 4, 0: Print Chr$(219),: Color 15, 0: Print "20.",: Color 20, 0: Print Chr$(219): Color 15, 0
Print " 5.",: Color 5, 0: Print Chr$(219),: Color 15, 0: Print "21.",: Color 21, 0: Print Chr$(219): Color 15, 0
Print " 6.",: Color 6, 0: Print Chr$(219),: Color 15, 0: Print "22.",: Color 22, 0: Print Chr$(219): Color 15, 0
Print " 7.",: Color 7, 0: Print Chr$(219),: Color 15, 0: Print "23.",: Color 23, 0: Print Chr$(219): Color 15, 0
Print " 8.",: Color 8, 0: Print Chr$(219),: Color 15, 0: Print "24.",: Color 24, 0: Print Chr$(219): Color 15, 0
Print " 9.",: Color 9, 0: Print Chr$(219),: Color 15, 0: Print "25.",: Color 25, 0: Print Chr$(219): Color 15, 0
Print "10.",: Color 10, 0: Print Chr$(219),: Color 15, 0: Print "26.",: Color 26, 0: Print Chr$(219): Color 15, 0
Print "11.",: Color 11, 0: Print Chr$(219),: Color 15, 0: Print "27.",: Color 27, 0: Print Chr$(219): Color 15, 0
Print "12.",: Color 12, 0: Print Chr$(219),: Color 15, 0: Print "28.",: Color 28, 0: Print Chr$(219): Color 15, 0
Print "13.",: Color 13, 0: Print Chr$(219),: Color 15, 0: Print "29.",: Color 29, 0: Print Chr$(219): Color 15, 0
Print "14.",: Color 14, 0: Print Chr$(219),: Color 15, 0: Print "30.",: Color 30, 0: Print Chr$(219): Color 15, 0
Print "15.",: Color 15, 0: Print Chr$(219),: Color 15, 0: Print "31.",: Color 31, 0: Print Chr$(219): Color 15, 0
Do
Locate 20, 3: Input "enter color from 0 to 31 ", kk$
Loop Until Val(kk$) > -1 Or Val(kk$) < 32
select_pencolor = Val(kk$)
End Function
Function newrate
Cls
Print "Change tile Rate ?"
Print
Print "Current tile rate is "; tilerate
Print
Do
Locate 20, 3: Input "enter rate from 1 to 60 ", kk$
Loop Until Val(kk$) > 0 Or Val(kk$) < 61
newrate = Val(kk$)
End Function
Function ynbox$ (msg$, mx, my)
tx = mx: ty = my
lr = Len(msg$) + 4
If tx + lr > _Width Then tx = _Width - (lr + 5)
If ty + 4 > _Height Then ty = _Height + 5
_PrintString (tx, ty), String$(lr, Asc("*"))
_PrintString (tx, ty + 1), "* " + msg$ + " *"
_PrintString (tx, ty + 2), "*" + String$(lr - 2, Asc(".")) + "*"
_PrintString (tx + lr / 2 - 4, ty + 2), " Y or N "
_PrintString (tx, ty + 3), String$(lr, Asc("*"))
Do
ak$ = Input$(1)
Loop Until UCase$(ak$) = "Y" Or UCase$(ak$) = "N"
ynbox$ = ak$
End Function
Function select_backgroundcolor
Cls
Color 15, 0
Print "SELECT Background COLOR"
Print
Print " 0.",: Color 0, 0: Print Chr$(219),: Color 15, 0
Print " 1.",: Color 1, 0: Print Chr$(219): Color 15, 0
Print " 2.",: Color 2, 0: Print Chr$(219),: Color 15, 0
Print " 3.",: Color 3, 0: Print Chr$(219): Color 15, 0
Print " 4.",: Color 4, 0: Print Chr$(219),: Color 15, 0
Print " 5.",: Color 5, 0: Print Chr$(219): Color 15, 0
Print " 6.",: Color 6, 0: Print Chr$(219),: Color 15, 0
Print " 7.",: Color 7, 0: Print Chr$(219): Color 15, 0
Print " 8.",: Color 8, 0: Print Chr$(219),: Color 15, 0
Print " 9.",: Color 9, 0: Print Chr$(219): Color 15, 0
Print "10.",: Color 10, 0: Print Chr$(219),: Color 15, 0
Print "11.",: Color 11, 0: Print Chr$(219): Color 15, 0
Print "12.",: Color 12, 0: Print Chr$(219),: Color 15, 0
Print "13.",: Color 13, 0: Print Chr$(219): Color 15, 0
Print "14.",: Color 14, 0: Print Chr$(219),: Color 15, 0
Print "15.",: Color 15, 0: Print Chr$(219): Color 15, 0
Do
Locate 20, 1: Input "enter color from 0 to 31", kk$
Loop Until Val(kk$) > -1 Or Val(kk$) < 32
select_backgroundcolor = Val(kk$)
End Function
Sub helpme
Cls
Print "HELP"
Print
Print "S - Save file "
Print "L - load file "
Print "use mosue to draw, click on arrows to resize the tileset (be careful)"
Print "N,n - create a new tile (limited to 200 as coded but you can edit that if you wish"
Print "P,p - play tiles as animation"
Print "C,c - change pen foreground color , you'll have to enter color number afterward"
Print "B,b - change pen background color, you'll have to enter color number afterward"
Print "R,r - change tile rate for animation playback.....not all that important relly"
Print "V,v - eyedropper, copies cell from previous tile"
Print "Z,z - zap the cell, erase it by setting it to a space with a foreground and background of zero"
Print "T,t - insert text string, will be prompeted for text to insert"
Print "D - Duplicate tile, be careful this will replace the next tile"
Print "X - Delete tiles, prompted to verify delete"
Print "1 - show current tile in top right corner, will not be recodeed"
Print "esc - to quit program.... be careful this just dumps you out and you'll lose any work currently"
Print
Print "Press any key to continue"
any$ = Input$(1)
End Sub
Function newchar
Dim mc(0 To 256, 2)
Cls
x = 0
y = 3
newc = -1
Print "Click on the Character you wish to use."
For c = 0 To 255
x = x + 2
If x > 60 Then
x = 2
y = y + 2
End If
_PrintString (x, y), Chr$(c)
mc(c, 1) = x
mc(c, 2) = y
Next c
Do
_Limit 60
Do While _MouseInput ' Check the mouse status
If _MouseButton(1) Then 'draw that square if the
mx = _MouseX: my = _MouseY
c = 0
Do
If mc(c, 1) = mx And mc(c, 2) = my Then newc = c
c = c + 1
If c = 256 Then newc = -2
Loop Until newc <> -1
If newc = -2 Then newc = -1
End If
Color 15, 0
Loop
Loop Until newc <> -1
newchar = newc
End Function
Sub savefile
Locate 1, 1
Print "Enter file name "
Locate 2, 1
Input filename$
Open filename$ For Output As #1
Write #1, tilerate, tileX, tileY, hightile, encoding
'encoding = 0
If encoding = 0 Then
For f = 1 To hightile
For y = 1 To tileY
For x = 1 To tileX
Write #1, gcell(f, x, y).t, gcell(f, x, y).fgk, gcell(f, x, y).bgk,
Print gcell(f, x, y).t, gcell(f, x, y).fgk, gcell(f, x, y).bgk,
Next x
Next y
Next f
End If
If encoding = 1 Then
For f = 1 To hightile
ttile$ = ""
ftile$ = ""
btile$ = ""
For y = 1 To tileY
For x = 1 To tileX
ttile$ = ttile$ + gcell(f, x, y).t
ftile$ = ftile$ + Chr$(gcell(f, x, y).fgk)
btile$ = btile$ + Chr$(gcell(f, x, y).bgk)
Next x
Next y
Write #1, ttile$
Write #1, ftile$
Write #1, btile$
Next f
End If
Close #1
Locate 3, 1
Print filename$; " saved"
Print "press any key to continue"
any$ = Input$(1)
End Sub
Sub loadfile
Locate 1, 1
Print "Enter file name "
Locate 2, 1
Input filename$
Open filename$ For Input As #1
Input #1, tilerate, tileX, tileY, hightile, encoding
'encoding = 1
If encoding = 0 Then 'no encoding just read each cell
For f = 1 To hightile
For y = 1 To tileY
For x = 1 To tileX
Input #1, gcell(f, x, y).t, gcell(f, x, y).fgk, gcell(f, x, y).bgk
Print gcell(f, x, y).t, gcell(f, x, y).fgk, gcell(f, x, y).bgk
Next x
Next y
Next f
End If
If encoding = 1 Then 'discrete run length encoding
'each tile breaks the data down into a channel for the the charcter, a channel for foreground and a channel for background
' encoding is limited to line by line
For f = 1 To hightile
Input #1, ttile$
Input #1, ftile$
Input #1, btile$
For y = 1 To tileY
For x = 1 To tileX
gcell(f, x, y).t = Mid$(ttile$, (y - 1) * tileY + x, 1)
gcell(f, x, y).fgk = Asc(Mid$(ftile$, (y - 1) * tileY + x, 1))
gcell(f, x, y).bgk = Asc(Mid$(btile$, (y - 1) * tileY + x, 1))
Next x
Next y
Next f
End If
Close #1
Locate 3, 1
Print filename$; " loaded"
Print "press any key to continue"
any$ = Input$(1)
End Sub