OK, I've fixed your program. Try this:

by Galleon (no login)

DEFINT A-Z
DIM SHARED FontBOX1(16000)
DIM SHARED FontBOX2(16000)
DIM SHARED FontBOX3(16000)
DIM SHARED FontBOX4(16000)
DIM SHARED GothBOX(4800)
DIM SHARED Options(4800)
DIM SHARED ScreenBOX(160000)
DIM SHARED HelpInstructions(1 TO 213000)
DIM SHARED HelpFileDetails(1 TO 94000)
DIM SHARED HelpAbout(16300)
DIM SHARED MenuBOX(1 TO 17000)
DIM SHARED BBox(1500)
DIM SHARED BGBox(8000)
DIM SHARED TeenieBOX(100)
DIM SHARED ItemBG(1000)
DIM SHARED CEditBOX(24000)
DIM SHARED FlipBOX(200)
DIM SHARED NumBOX(300)
DIM SHARED FChar(1 TO 124)
DIM SHARED CopyBOX(119, 89)
DIM SHARED PasteBOX(119, 89)
DIM SHARED UndoBOX(5500)
DIM SHARED RedoBOX(5500)
DIM SHARED AniBOX(5500)
DIM SHARED BigAniBOX(86500)
DIM SHARED FileINPUT(12500)
DIM SHARED SavePROMPT(15150)
DIM SHARED OhOhBOX(15150)

TYPE RecentTYPE
PName AS STRING * 32
FName AS STRING * 130
END TYPE
DIM SHARED Recent(1 TO 6) AS RecentTYPE
OPEN "Recent.DAT" FOR RANDOM AS #1 LEN = LEN(Recent(1))
FOR n = 1 TO 6
GET #1, n, Recent(n)
NEXT n
CLOSE #1

REDIM SHARED ProjectBOX(6205)
REDIM SHARED SwapBOX(6205)

DIM SHARED ToolBOX(1 TO 9)
FOR n = 1 TO 9: ToolBOX(n) = n * 10: NEXT n

DIM SHARED mx, my, mb, mb2, Menu, WorkingTOOL, WorkingCOLOR, Highlighted
DIM SHARED Masked, MaskX, MaskY, MaskXX, MaskYY
DIM SHARED FrameNUM, NumFRAMES, FileNAME$, PrintNAME$, WorkDONE
DIM SHARED Theme&, OhOh&, Tick&
Theme& = _SNDOPEN("G256Them.OGG", "SYNC")
Tick& = _SNDOPEN("G256Tick.OGG", "SYNC")
OhOh& = _SNDOPEN("G256OhOh.OGG", "SYNC")
WorkingTOOL = 1: WorkingCOLOR = 0

EXtx = 29: EXty = 208: EXbx1 = 35: Exbx2 = 44

DEF SEG = VARSEG(FontBOX1(0))
BLOAD "G256MSSR.FNT", VARPTR(FontBOX1(0))
DEF SEG = VARSEG(FontBOX2(0))
BLOAD "G256WHTB.FNT", VARPTR(FontBOX2(0))
DEF SEG = VARSEG(GothBOX(0))
BLOAD "G256GOTH.FNT", VARPTR(GothBOX(0))
DEF SEG = VARSEG(FontBOX3(0))
BLOAD "G256BLKB.FNT", VARPTR(FontBOX3(0))
DEF SEG = VARSEG(FontBOX4(0))
BLOAD "G256BLUR.FNT", VARPTR(FontBOX4(0))
DEF SEG = VARSEG(Options(0))
BLOAD "G256opts.BSV", VARPTR(Options(0))
DEF SEG = VARSEG(BBox(0))
BLOAD "G256rbut.BSV", VARPTR(BBox(0))
DEF SEG = VARSEG(MenuBOX(1))
BLOAD "G256menu.BSV", VARPTR(MenuBOX(1))
DEF SEG = VARSEG(NumBOX(0))
BLOAD "G256nums.BSV", VARPTR(NumBOX(0))
DEF SEG = VARSEG(HelpAbout(0))
BLOAD "G256Habt.BSV", VARPTR(HelpAbout(0))
DEF SEG = VARSEG(CEditBOX(0))
BLOAD "G256CEdt.BSV", VARPTR(CEditBOX(0))
DEF SEG = VARSEG(FileINPUT(0))
BLOAD "G256fsav.BSV", VARPTR(FileINPUT(0))
DEF SEG = VARSEG(OhOhBOX(0))
BLOAD "G256OhOh.BSV", VARPTR(OhOhBOX(0))
DEF SEG = VARSEG(SavePROMPT(0))
BLOAD "G256spmt.BSV", VARPTR(SavePROMPT(0))
DEF SEG
OPEN "G256Hins.BGF" FOR BINARY AS #1
GET #1, , HelpInstructions()
CLOSE #1
OPEN "G256Hfdt.BGF" FOR BINARY AS #1
GET #1, , HelpFileDetails()
CLOSE #1

SCREEN _NEWIMAGE(640, 480, 256)
_FULLSCREEN

OPEN "GFX256.PAL" FOR INPUT AS #1
OUT &H3C8, 0
FOR n = 0 TO 767
INPUT #1, Intensity
OUT &H3C9, Intensity
NEXT n
CLOSE #1

OPEN "G256scrn.BGF" FOR BINARY AS #1
GET #1, , ScreenBOX()
CLOSE #1
PUT (0, 0), ScreenBOX(), PSET

GET (14, 60)-(133, 149), UndoBOX()
GET (14, 60)-(133, 149), RedoBOX()
FrameNUM = 1: NumFRAMES = 1

_DELAY 1.5
_SNDPLAY Theme&

_MOUSESHOW

DO
DO WHILE GetMouseInput
SELECT CASE my
CASE 37 TO 49: MenuBAR 1
CASE 55 TO 430
SELECT CASE mx
CASE 0 TO 140
IF Menu THEN MenuBAR 0
ToolBAR
CASE 141 TO 639
IF Menu THEN MenuBAR 0
IF my < 425 THEN WorkAREA
END SELECT
CASE 431 TO 479
ColorSELECTION
CASE ELSE
MenuBAR 0
END SELECT
LOOP
LOOP

SYSTEM '------------ end of main module ----------------------------------------

SUB MenuBAR (InOUT)
STATIC x1, x2, MenuX, OldMx, Iy, OldIy, Index, MenuRIGHT
STATIC MenuBOTTOM, Item, OldITEM, Selection, OldSELECT

IF InOUT = 0 THEN GOSUB DeLIGHT: EXIT SUB

IF Menu > 6 THEN
DO
IF MouseChange THEN
SELECT CASE mx
CASE MenuX - 3 TO MenuRIGHT + 3
SELECT CASE my
CASE IS < 37: GOSUB CloseMENU: EXIT SUB
CASE 37 TO 57
IF mx < x1 OR mx > x2 THEN GOSUB CloseMENU: EXIT SUB
CASE 58 TO 71: Iy = 58: Item = 1: GOSUB LightITEM
CASE 72 TO 85
IF Menu <> 30 THEN
Iy = 72: Item = 2: GOSUB LightITEM
END IF
CASE 86 TO 99
IF Menu <> 30 AND Menu <> 40 THEN
Iy = 86: Item = 3: GOSUB LightITEM
END IF
CASE 100 TO 113
IF Menu = 10 OR Menu = 20 THEN
Iy = 100: Item = 4: GOSUB LightITEM
END IF
CASE 119 TO 132
IF Menu = 10 THEN
Iy = 119: Item = 5: GOSUB LightITEM
END IF
CASE 133 TO 146
IF Menu = 10 THEN
Iy = 133: Item = 6: GOSUB LightITEM
END IF
CASE 147 TO 160
IF Menu = 10 THEN
Iy = 147: Item = 7: GOSUB LightITEM
END IF
CASE 161 TO 174
IF Menu = 10 THEN
Iy = 161: Item = 8: GOSUB LightITEM
END IF
CASE 183 TO 196
IF Menu = 10 THEN
Iy = 183: Item = 9: GOSUB LightITEM
END IF
END SELECT
CASE ELSE: GOSUB CloseMENU: EXIT SUB
END SELECT
IF my > (MenuBOTTOM + 3) THEN GOSUB CloseMENU: EXIT SUB
END IF
Selection = Menu + Item
IF mb = -1 THEN

GOSUB CloseMENU
SELECT CASE Selection
CASE 11 TO 19: GFXFile Selection - 10
CASE 21 TO 29: GFXEdit Selection - 20
CASE 31 TO 39: GFXColor
CASE 41 TO 49: GFXSpecial Selection - 40
CASE 51 TO 59: GFXHelp Selection - 50
END SELECT
EXIT SUB
END IF
MouseChange = GetMouseInput
LOOP
ELSE
SELECT CASE mx
CASE 20 TO 50
IF Menu <> 1 THEN
GOSUB DeLIGHT
x1 = 20: x2 = 50
GOSUB HiLIGHT
Menu = 1
END IF
CASE 57 TO 87
IF Menu <> 2 THEN
GOSUB DeLIGHT
x1 = 57: x2 = 87
GOSUB HiLIGHT
Menu = 2
END IF
CASE 96 TO 132
IF Menu <> 3 THEN
GOSUB DeLIGHT
x1 = 96: x2 = 132
GOSUB HiLIGHT
Menu = 3
END IF
CASE 141 TO 188
IF Menu <> 4 THEN
GOSUB DeLIGHT
x1 = 141: x2 = 188
GOSUB HiLIGHT
Menu = 4
END IF
CASE 196 TO 230
IF Menu <> 5 THEN
GOSUB DeLIGHT
x1 = 196: x2 = 230
GOSUB HiLIGHT
Menu = 5
END IF
CASE 604 TO 624
IF Menu <> 6 THEN
GOSUB DeLIGHT
x1 = 604: x2 = 624
GOSUB HiLIGHT
Menu = 6
END IF
CASE ELSE
GOSUB DeLIGHT
EXIT SUB
END SELECT
END IF

IF mb = -1 THEN
IF Menu < 10 THEN
SELECT CASE Menu
CASE 1: MenuX = 20: Index = 1: GOSUB DropMENU
CASE 2: MenuX = 58: Index = 7500: GOSUB DropMENU
CASE 3: MenuX = 96: Index = 9500: GOSUB DropMENU
CASE 4: MenuX = 132: Index = 10700: GOSUB DropMENU
CASE 5: MenuX = 192: Index = 13000: GOSUB DropMENU
CASE 6
IF WorkDONE THEN
ExitPROMPT = 10
GFXFile ExitPROMPT
IF ExitPROMPT = 11 THEN EXIT SUB
ELSE
SYSTEM
END IF
END SELECT
END IF
END IF

EXIT SUB

HiLIGHT:
FOR x = x1 TO x2
FOR y = 37 TO 49
IF POINT(x, y) = 223 THEN PSET (x, y), 224
NEXT y
NEXT x
RETURN

DeLIGHT:
IF Menu <> 0 THEN
FOR x = x1 TO x2
FOR y = 37 TO 49
IF POINT(x, y) = 224 THEN PSET (x, y), 223
NEXT y
NEXT x
END IF
Menu = 0
RETURN

DropMENU:

MenuRIGHT = MenuX + MenuBOX(Index) / 8 - 1
MenuBOTTOM = 50 + MenuBOX(Index + 1) - 1
GET (MenuX, 50)-(MenuRIGHT, MenuBOTTOM), BGBox()
GET (MenuX, MenuBOTTOM - 1)-(MenuX + 2, MenuBOTTOM), TeenieBOX()
PUT (MenuX, 50), MenuBOX(Index), PSET
PUT (MenuX, MenuBOTTOM - 1), TeenieBOX(), PSET
Menu = Menu * 10
OldMENU = Menu
IF Menu = 10 THEN
num = 1
FOR y = 121 TO 163 STEP 14
x = 40
Name$ = RTRIM$(Recent(num).PName)
FOR n = 1 TO LEN(Name$)
Char$ = MID$(Name$, n, 1)
PrintSTRING x, y, Char$, 5
IF x > 100 THEN
PrintSTRING x, y, "...", 5
EXIT FOR
END IF
NEXT n
num = num + 1
NEXT y
END IF
RETURN

CloseMENU:
PUT (MenuX, 50), BGBox(), PSET
Iy = 0: OldIy = 0: Item = 0: OldITEM = 0
GOSUB DeLIGHT
RETURN

LightITEM:
IF Item <> OldITEM THEN
GOSUB CloseITEM
GET (MenuX, Iy)-(MenuRIGHT, Iy + 13), ItemBG()
FOR x = MenuX + 2 TO MenuRIGHT - 4
FOR y = Iy TO Iy + 13
IF POINT(x, y) = 252 THEN PSET (x, y), 255 ELSE PSET (x, y), 252
NEXT y
NEXT x
OldIy = Iy
OldMx = MenuX
END IF
RETURN

CloseITEM:
IF OldMx = MenuX AND OldIy > 0 THEN
PUT (MenuX, OldIy), ItemBG(), PSET
END IF
RETURN

END SUB

SUB PaletteDISPLAY (Colr)

FOR x = 18 TO 595 STEP 30
FOR y = 434 TO 449 STEP 15
LINE (x, y)-(x + 27, y + 12), Colr, BF
Clr$ = LTRIM$(STR$(Colr))
IF LEN(Clr$) = 1 THEN Clr$ = "00" + Clr$
IF LEN(Clr$) = 2 THEN Clr$ = "0" + Clr$
OUT &H3C7, Colr: red = INP(&H3C9): green = INP(&H3C9): blue = INP(&H3C9)
IF (red + green + blue) < 72 THEN Fnt = 2 ELSE Fnt = 4
PrintSTRING x + 5, y + 1, Clr$, Fnt
Colr = Colr + 1
IF Colr = 256 THEN Colr = 0
NEXT y
NEXT x

END SUB

SUB PrintSTRING (x, y, Prnt$, Font)

FOR n = 1 TO LEN(Prnt$)
Char$ = MID$(Prnt$, n, 1)
IF Char$ = " " OR Char$ = CHR$(255) THEN
x = x + 3
ELSE
SELECT CASE Font
CASE 1
Index = (ASC(Char$) - 33) * FontBOX1(0) + 2
PUT (x, y), FontBOX1(Index + 7520), AND
PUT (x, y), FontBOX1(Index)
x = x + FontBOX1(Index) / 8
CASE 2
Index = (ASC(Char$) - 33) * FontBOX2(0) + 2
PUT (x, y), FontBOX2(Index + 7520), AND
PUT (x, y), FontBOX2(Index)
x = x + FontBOX2(Index) / 8
CASE 3
Index = (ASC(Char$) - 33) * GothBOX(0) + 2
PUT (x, y), GothBOX(Index + 2400), AND
PUT (x, y), GothBOX(Index)
x = x + GothBOX(Index) / 8
CASE 4
Index = (ASC(Char$) - 33) * FontBOX3(0) + 2
PUT (x, y), FontBOX3(Index + 7520), AND
PUT (x, y), FontBOX3(Index)
x = x + FontBOX2(Index) / 8
CASE 5
Index = (ASC(Char$) - 33) * FontBOX4(0) + 2
PUT (x, y), FontBOX4(Index + 7520), AND
PUT (x, y), FontBOX4(Index)
x = x + FontBOX4(Index) / 8
END SELECT
END IF
NEXT n
END SUB

SUB GFXFile (MenuITEM)
SHARED Ky$, OldFILENAME$, OldPRINTNAME$, InitCOLOR
STATIC Cancelled

OldFILENAME$ = FileNAME$: OldPRINTNAME$ = PrintNAME$

SELECT CASE MenuITEM
CASE 1 'New
IF WorkDONE THEN
SELECT CASE SavePROMPT
CASE 0 'x-button/Cancel button
EXIT SUB
CASE 1 'Yes
GOSUB Yes
GOSUB NewFILE
CASE 2 'No
GOSUB NewFILE
END SELECT
ELSE
GOSUB NewFILE
END IF
CASE 2 'Open
IF WorkDONE THEN
SELECT CASE SavePROMPT
CASE 0
EXIT SUB
CASE 1
GOSUB Yes
END SELECT
END IF
Banner = 1
GOSUB GetNAME
IF Cancelled = 1 THEN: Cancelled = 0: EXIT SUB
GOSUB OpenFILE
CASE 3 'Save
IF LEN(FileNAME$) = 0 THEN
Banner = 2
GOSUB GetNAME
IF Cancelled = 1 THEN Cancelled = 0: EXIT SUB
GOSUB CheckEXISTING
GOSUB SAVEFile
LINE (140, 10)-(639, 30), 248, BF
PrintSTRING 160, 15, PrintNAME$, 2
WorkDONE = 0
ELSE
GOSUB SAVEFile
WorkDONE = 0
END IF
CASE 4 'Save As
Banner = 3
GOSUB GetNAME
IF Cancelled = 1 THEN Cancelled = 0: EXIT SUB
GOSUB CheckEXISTING
GOSUB SAVEFile
WorkDONE = 0
LINE (140, 10)-(639, 30), 248, BF
PrintSTRING 160, 15, PrintNAME$, 2
SetRECENT 1
CASE 5 TO 8 'Open from recent list
OPEN "Recent.DAT" FOR RANDOM AS #1 LEN = LEN(Recent(1))
FOR n = 1 TO 4
GET #1, n, Recent(n)
NEXT n
CLOSE #1
FileNUMBER = MenuITEM - 4
P$ = RTRIM$(Recent(FileNUMBER).PName)
IF LEN(P$) THEN
IF WorkDONE THEN
SELECT CASE SavePROMPT
CASE 0
EXIT SUB
CASE 1
GOSUB Yes
END SELECT
END IF
FileNAME$ = RTRIM$(Recent(FileNUMBER).FName)
PrintNAME$ = RTRIM$(Recent(FileNUMBER).PName)
GOSUB OpenFILE
END IF
CASE 9, 10 'Exit
IF WorkDONE THEN
SELECT CASE SavePROMPT
CASE 0
IF MenuITEM = 10 THEN MenuITEM = 11
EXIT SUB
CASE 1
GOSUB Yes
IF MenuITEM = 10 THEN SYSTEM
CASE 2
SYSTEM
END SELECT
ELSE
CLOSE #1
SYSTEM
END IF

END SELECT

EXIT SUB

GetNAME:
GET (158, 72)-(158 + FileINPUT(0) / 8 - 1, 72 + FileINPUT(1) - 1), ScreenBOX()
PUT (158, 72), FileINPUT(), PSET

SELECT CASE Banner
CASE 1: PrintSTRING 204, 88, "Open", 2
CASE 2: PrintSTRING 204, 88, "Save", 2
CASE 3: PrintSTRING 204, 88, "Save As", 2
END SELECT

n$ = "": Ky$ = "": PrintX = 174: CharNUM = 1

DO
LINE (PrintX + 2, 110)-(PrintX + 2, 120), 253
Ky$ = INKEY$
IF LEN(Ky$) THEN
SELECT CASE ASC(Ky$)
CASE 8
IF LEN(n$) THEN
CharNUM = CharNUM - 1
LINE (FChar(CharNUM), 109)-(PrintX + 2, 121), 255, BF
PrintX = FChar(CharNUM)
n$ = MID$(n$, 1, LEN(n$) - 1)
LINE (PrintX + 2, 110)-(PrintX + 2, 120), 253
END IF
CASE 13
PUT (158, 72), ScreenBOX(), PSET
GOSUB MakeNAME
RETURN
CASE 32, 46, 48 TO 58, 65 TO 90, 92, 95, 97 TO 122, 126
IF PrintX < 398 THEN
FChar(CharNUM) = PrintX
CharNUM = CharNUM + 1
LINE (PrintX + 2, 110)-(PrintX + 2, 120), 255
PrintSTRING PrintX, 110, Ky$, 5
LINE (PrintX + 2, 110)-(PrintX + 2, 120), 253
n$ = n$ + Ky$
END IF
END SELECT
END IF

DO WHILE GetMouseInput
SELECT CASE my
CASE 87 TO 99
IF mx > 379 AND mx < 401 THEN
Highlight
IF mb AND Highlighted THEN
PUT (158, 72), ScreenBOX(), PSET
Cancelled = 1
RETURN
END IF
ELSE
UnHighlight
END IF
CASE 128 TO 150
SELECT CASE mx
CASE 289 TO 346 'OK
IF mb THEN
_SNDPLAY Tick&
PUT (158, 72), ScreenBOX(), PSET
GOSUB MakeNAME
RETURN
END IF
CASE 349 TO 406 'CANCEL
IF mb THEN
_SNDPLAY Tick&
PUT (158, 72), ScreenBOX(), PSET
Cancelled = 1
RETURN
END IF
CASE ELSE
UnHighlight
END SELECT
CASE ELSE
UnHighlight
END SELECT
LOOP
LOOP
RETURN

CheckEXISTING:
OPEN FileNAME$ FOR BINARY AS #1
IF LOF(1) THEN
CLOSE #1
DisplayERROR 2
FileNAME$ = OldFILENAME$
PrintNAME$ = OldPRINTNAME$
EXIT SUB
END IF
CLOSE #1
RETURN

OpenFILE:
OPEN FileNAME$ FOR BINARY AS #1
IF LOF(1) THEN
GET #1, , Check&
IF Check& = 16253175 THEN
ArraySIZE& = LOF(1) / 2 - 1
REDIM ProjectBOX(ArraySIZE&)
GET #1, 1, ProjectBOX()
CLOSE #1
ELSE
CLOSE #1
DisplayERROR 3
SetRECENT 2
EXIT SUB
END IF
ELSE
DisplayERROR 1
CLOSE #1
KILL FileNAME$
SetRECENT 2
EXIT SUB
END IF
OUT &H3C8, 0
FOR n = 34 TO 693
OUT &H3C9, ProjectBOX(n)
NEXT n
PUT (14, 60), ProjectBOX(803), PSET
ScaleUP
WorkDONE = 0
PrintNAME$ = ""
FOR n = 2 TO 33
Char$ = CHR$(ProjectBOX(n))
PrintNAME$ = PrintNAME$ + Char$
NEXT n
LINE (140, 10)-(639, 30), 248, BF
PrintSTRING 160, 15, PrintNAME$, 2
GET (14, 60)-(133, 149), UndoBOX()
GET (14, 60)-(133, 149), RedoBOX()
NumFRAMES = ProjectBOX(802)
FrameNUM = 1
SetRECENT 1
PrintNUMS 66, 155, "001"
PaletteDISPLAY (InitCOLOR)
RETURN


SAVEFile:
ProjectBOX(0) = 247: ProjectBOX(1) = 248
FOR n = 1 TO 32
Char$ = MID$(PrintNAME$, n, 1)
ProjectBOX(n + 1) = ASC(Char$)
NEXT n
OUT &H3C7, 0
FOR n = 34 TO 801
ProjectBOX(n) = INP(&H3C9)
NEXT n
ProjectBOX(802) = NumFRAMES
GET (14, 60)-(133, 149), ProjectBOX(803 + (FrameNUM - 1) * 5402)
OPEN FileNAME$ FOR BINARY AS #1
PUT #1, , ProjectBOX()
CLOSE #1
SetRECENT 1
WorkDONE = 0
RETURN

NewFILE:
LINE (14, 60)-(133, 149), 255, BF
ScaleUP
GET (14, 60)-(133, 149), UndoBOX()
GET (14, 60)-(133, 149), RedoBOX()
FrameNUM = 1
FileNAME$ = ""
PrintNAME$ = ""
LINE (140, 10)-(639, 30), 248, BF
PrintSTRING 160, 15, "Untitled", 2
NumFRAMES = 1
OPEN "GFX256.PAL" FOR INPUT AS #1
OUT &H3C8, 0
FOR n = 0 TO 767
INPUT #1, Intensity
OUT &H3C9, Intensity
NEXT n
CLOSE #1
InitCOLOR = 0
PaletteDISPLAY (InitCOLOR)
PrintNUMS 66, 155, "001"
EXIT SUB
RETURN

MakeNAME:
IF LEN(n$) THEN
FOR n = LEN(n$) TO 1 STEP -1
Char$ = MID$(n$, n, 1)
IF Char$ = "." THEN Dot = n
IF Char$ = "\" THEN Slash = n: EXIT FOR
NEXT n
IF Dot THEN n$ = MID$(n$, 1, Dot - 1)
IF Slash THEN Path$ = MID$(n$, 1, Slash)
IF Slash THEN n$ = MID$(n$, Slash + 1, 32)
IF LEN(n$) > 32 THEN n$ = LEFT$(n$, 32)
Cap$ = UCASE$(MID$(n$, 1, 1))
LC$ = MID$(n$, 2)
PrintNAME$ = Cap$ + LC$ + SPACE$(32 - LEN(n$))
FileNAME$ = Path$ + n$ + ".GFX"
ELSE
Cancelled = 1
PUT (158, 72), ScreenBOX(), PSET
END IF
RETURN

Yes:
IF LEN(FileNAME$) THEN
GOSUB SAVEFile
ELSE
Banner = 2
GOSUB GetNAME
IF Cancelled THEN
Cancelled = 0
IF MenuITEM = 6 THEN MenuITEM = 7
EXIT SUB
END IF
GOSUB CheckEXISTING
GOSUB SAVEFile
END IF
RETURN

END SUB

SUB GFXEdit (Item)
SHARED Invisible

SELECT CASE Item
CASE 1 'Undo
GET (14, 60)-(133, 149), RedoBOX()
PUT (14, 60), UndoBOX(), PSET
ScaleUP
CASE 2 'Redo
GET (14, 60)-(133, 149), UndoBOX()
PUT (14, 60), RedoBOX(), PSET
ScaleUP
CASE 3 'Copy
IF Masked = 1 THEN
IF MaskX > MaskXX THEN SWAP MaskX, MaskXX
IF MaskY > MaskYY THEN SWAP MaskY, MaskYY
IF MaskXX > 133 THEN MaskXX = 133
IF MaskX < 14 THEN MaskX = 14
IF MaskY < 60 THEN MaskY = 60
IF MaskYY > 149 THEN MaskYY = 149
FOR x = 0 TO 119
FOR y = 0 TO 89
CopyBOX(x, y) = -1
PasteBOX(x, y) = -1
IF x + 14 >= MaskX AND x + 14 <= MaskXX THEN
IF y + 60 >= MaskY AND y + 60 <= MaskYY THEN
CopyBOX(x, y) = POINT(x + 14, y + 60)
END IF
END IF
NEXT y
NEXT x
FOR x = MaskX TO MaskXX
FOR y = MaskY TO MaskYY
PasteBOX(x - MaskX, y - MaskY) = POINT(x, y)
NEXT y
NEXT x
Masked = 0
ELSE
FOR x = 0 TO 119
FOR y = 0 TO 89
CopyBOX(x, y) = POINT(x + 14, y + 60)
PasteBOX(x, y) = POINT(x + 14, y + 60)
NEXT y
NEXT x
END IF
CASE 4 'Paste
GET (14, 60)-(133, 149), UndoBOX()
IF Masked THEN
IF MaskX > MaskXX THEN SWAP MaskX, MaskXX
IF MaskY > MaskYY THEN SWAP MaskY, MaskYY
IF MaskXX > 133 THEN MaskXX = 133
IF MaskX < 14 THEN MaskX = 14
IF MaskY < 60 THEN MaskY = 60
IF MaskYY > 149 THEN MaskYY = 149
boxx = 0: boxy = o
FOR x = MaskX TO MaskXX
boxy = 0
FOR y = MaskY TO MaskYY
Colr = PasteBOX(boxx, boxy)
IF Invisible AND Colr = 255 THEN Colr = -1
IF Colr <> -1 THEN PSET (x, y), PasteBOX(boxx, boxy)
boxy = boxy + 1
NEXT y
boxx = boxx + 1
NEXT x
Masked = 0
ELSE
FOR x = 0 TO 119
FOR y = 0 TO 89
Colr = CopyBOX(x, y)
IF Invisible AND Colr = 255 THEN Colr = -1
IF Colr <> -1 THEN PSET (x + 14, y + 60), CopyBOX(x, y)
NEXT y
NEXT x
END IF
ScaleUP
END SELECT

END SUB

SUB GFXColor ()
SHARED InitCOLOR
SHARED LastEDIT
GET (146, 261)-(146 + (CEditBOX(800) / 8), 261 + CEditBOX(801)), ScreenBOX()
PUT (146, 261), CEditBOX(800), PSET

ExRx = 163: ExGx = 163: ExBx = 163
IF WorkingCOLOR < 220 THEN MixCOLOR = WorkingCOLOR ELSE MixCOLOR = LastEDIT
GOSUB SetMIX

DO
DO WHILE GetMouseInput
SELECT CASE my
CASE 277 TO 287
SELECT CASE mx
CASE 334 TO 356
IF Light = 0 THEN
GOSUB LightX
END IF
CASE ELSE
GOSUB DarkX
END SELECT
CASE 325 TO 371
SELECT CASE mx
CASE 155 TO 310
SELECT CASE my
CASE 328 TO 340 'red slider
RX = mx - 6
IF mb THEN GOSUB PutSLIDER1
CASE 345 TO 357 'green slider
GX = mx - 6
IF mb THEN GOSUB PutSLIDER2
CASE 362 TO 374 'blue slider
BX = mx - 6
IF mb THEN GOSUB PutSLIDER3
END SELECT
OUT &H3C8, MixCOLOR: OUT &H3C9, MixR: OUT &H3C9, MixG: OUT &H3C9, MixB
CASE 328 TO 356
SELECT CASE my
CASE 329 TO 349 'Old
IF mb THEN
OUT &H3C7, 221: R = INP(&H3C9): g = INP(&H3C9): b = INP(&H3C9)
OUT &H3C8, MixCOLOR: OUT &H3C9, R: OUT &H3C9, g: OUT &H3C9, b
GOSUB NewSLIDERS
END IF
CASE 354 TO 375 'New
IF mb THEN
OUT &H3C7, MixCOLOR: R = INP(&H3C9): g = INP(&H3C9): b = INP(&H3C9)
OUT &H3C8, 221: OUT &H3C9, R: OUT &H3C9, g: OUT &H3C9, b
GOSUB NewSLIDERS
WorkDONE = 1
END IF
END SELECT
END SELECT
CASE 411 TO 421
SELECT CASE mx
CASE 23 TO 38: Scan = 1: Sx1 = 24: Sx2 = 35
CASE 44 TO 58: Scan = 2: Sx1 = 47: Sx2 = 55
CASE 89 TO 103: Scan = 3: Sx1 = 92: Sx2 = 100
CASE 110 TO 125: Scan = 4: Sx1 = 112: Sx2 = 123
CASE ELSE: EXIT DO
END SELECT
IF mb AND Scan THEN GOSUB ScanCOLRS
CASE 434 TO 447
IF mx > 16 AND mx < 618 THEN Row = 1 ELSE Row = 0
CASE 448 TO 461
IF mx > 16 AND mx < 618 THEN Row = 2 ELSE Row = 0
CASE ELSE
GOSUB DarkX
EXIT DO
END SELECT
IF mb AND Light THEN
IF CurrCOLOR = 1 THEN
OUT &H3C7, 221: R = INP(&H3C9): g = INP(&H3C9): b = INP(&H3C9)
OUT &H3C8, MixCOLOR: OUT &H3C9, R: OUT &H3C9, g: OUT &H3C9, b
END IF
GOSUB DarkX
PUT (146, 261), ScreenBOX(), PSET
LastEDIT = MixCOLOR
mb = 0
EXIT SUB
END IF
IF mb AND Row THEN
IF CurrCOLOR = 1 THEN
OUT &H3C7, 221: R = INP(&H3C9): g = INP(&H3C9): b = INP(&H3C9)
OUT &H3C8, MixCOLOR: OUT &H3C9, R: OUT &H3C9, g: OUT &H3C9, b
END IF
Column = (mx - 17) \ 30 + 1
Location = (mx - 17) MOD 30
IF Location > 0 AND Location < 29 THEN
MixCOLOR = ((Column - 1) * 2 + Row - 1) + InitCOLOR
IF MixCOLOR < 0 THEN MixCOLOR = MixCOLOR + 256
IF MixCOLOR > 256 THEN MixCOLOR = MixCOLOR - 256
IF MixCOLOR = 256 THEN MixCOLOR = 0
IF MixCOLOR < 220 THEN
GOSUB SetMIX
ELSE
MixCOLOR = LastEDIT
END IF
END IF
END IF
Row = 0
LOOP
LOOP

EXIT SUB

LightX:
IF Light = 0 THEN
FOR x = 340 TO 350
FOR y = 278 TO 286
IF POINT(x, y) = 223 THEN PSET (x, y), 224
NEXT y
NEXT x
Light = 1
END IF
RETURN

DarkX:
IF Light = 1 THEN
FOR x = 340 TO 350
FOR y = 278 TO 286
IF POINT(x, y) = 224 THEN PSET (x, y), 223
NEXT y
NEXT x
Light = 0
END IF
RETURN

ScanCOLRS:
LINE (Sx1, 414)-(Sx2, 418), 224, BF
SELECT CASE Scan
CASE 1: InitCOLOR = InitCOLOR - 40
CASE 2: InitCOLOR = InitCOLOR - 2
CASE 3: InitCOLOR = InitCOLOR + 2
CASE 4: InitCOLOR = InitCOLOR + 40
END SELECT
IF InitCOLOR < 0 THEN InitCOLOR = InitCOLOR + 256
IF InitCOLOR > 255 THEN InitCOLOR = InitCOLOR - 256
IF InitCOLOR = 256 THEN InitCOLOR = 0
PaletteDISPLAY (InitCOLOR)
_DELAY .1
LINE (Sx1, 414)-(Sx2, 418), 222, BF
Scan = 0: mb = 0
RETURN

PutSLIDER1:
IF RX < 163 THEN RX = 163
IF RX > 290 THEN RX = 290
PUT (ExRx, 328), CEditBOX(), PSET
PUT (RX, 328), CEditBOX(120), PSET
ExRx = RX
MixR = (RX - 163) \ 2
Tens = MixR \ 10
Ones = MixR MOD 10
TIndex = 480 + Tens * 20
OIndex = 480 + Ones * 20
PUT (315, 331), CEditBOX(TIndex), PSET
PUT (319, 331), CEditBOX(OIndex), PSET
CurrCOLOR = 1
RETURN

PutSLIDER2:
IF GX < 163 THEN GX = 163
IF GX > 290 THEN GX = 290
PUT (ExGx, 345), CEditBOX(), PSET
PUT (GX, 345), CEditBOX(240), PSET
ExGx = GX
MixG = (GX - 163) \ 2
Tens = MixG \ 10
Ones = MixG MOD 10
TIndex = 480 + Tens * 20
OIndex = 480 + Ones * 20
PUT (315, 348), CEditBOX(TIndex), PSET
PUT (319, 348), CEditBOX(OIndex), PSET
CurrCOLOR = 1
RETURN

PutSLIDER3:
IF BX < 163 THEN BX = 163
IF BX > 290 THEN BX = 290
PUT (ExBx, 362), CEditBOX(), PSET
PUT (BX, 362), CEditBOX(360), PSET
ExBx = BX
MixB = (BX - 163) \ 2
Tens = MixB \ 10
Ones = MixB MOD 10
TIndex = 480 + Tens * 20
OIndex = 480 + Ones * 20
PUT (315, 365), CEditBOX(TIndex), PSET
PUT (319, 365), CEditBOX(OIndex), PSET
CurrCOLOR = 1
RETURN

NewSLIDERS:
RX = R * 2 + 163: GOSUB PutSLIDER1
GX = g * 2 + 163: GOSUB PutSLIDER2
BX = b * 2 + 163: GOSUB PutSLIDER3
CurrCOLOR = 0
RETURN

SetMIX:
Clr$ = LTRIM$(STR$(MixCOLOR))
Clr$ = "000" + Clr$
Clr$ = MID$(Clr$, LEN(Clr$) - 2, 3)
LINE (286, 277)-(320, 287), 254, BF
PrintSTRING 286, 277, Clr$, 2
LINE (328, 354)-(356, 374), MixCOLOR, BF
PUT (336, 360), CEditBOX(750), AND
PUT (336, 360), CEditBOX(700)
OUT &H3C7, MixCOLOR: R = INP(&H3C9): g = INP(&H3C9): b = INP(&H3C9)
OUT &H3C8, 221: OUT &H3C9, R: OUT &H3C9, g: OUT &H3C9, b
IF (R + g + b) < 72 THEN FontCOLOR = 255 ELSE FontCOLOR = 254
FOR x = 336 TO 356
FOR y = 360 TO 370
IF POINT(x, y) <> MixCOLOR THEN PSET (x, y), FontCOLOR
IF POINT(x, y - 24) <> 221 THEN PSET (x, y - 24), FontCOLOR
NEXT y
NEXT x
GOSUB NewSLIDERS
RETURN

END SUB

SUB GFXSpecial (Item)

GET (14, 60)-(133, 149), UndoBOX()
SELECT CASE Item
CASE 1 'flip vertically
FOR y = 60 TO 104
GET (14, y)-(133, y), FlipBOX()
GET (14, 209 - y)-(133, 209 - y), FlipBOX(100)
PUT (14, y), FlipBOX(100), PSET
PUT (14, 209 - y), FlipBOX(), PSET
NEXT y
ScaleUP
CASE 2 'flip horizonatally
FOR x = 14 TO 73
GET (x, 60)-(x, 149), FlipBOX()
GET (147 - x, 60)-(147 - x, 149), FlipBOX(100)
PUT (x, 60), FlipBOX(100), PSET
PUT (147 - x, 60), FlipBOX(), PSET
NEXT x
ScaleUP
END SELECT
END SUB

SUB GFXHelp (Item)
SELECT CASE Item
CASE 1, 2
Page = 0
IF Item = 1 THEN
LastPAGE = 11
GET (158, 72)-(158 + HelpInstructions(1) / 8 - 1, 72 + HelpInstructions(2) - 1), ScreenBOX()
PUT (158, 72), HelpInstructions(), PSET
ELSE
LastPAGE = 4
GET (158, 72)-(158 + HelpFileDetails(1) / 8 - 1, 72 + HelpFileDetails(2) - 1), ScreenBOX()
PUT (158, 72), HelpFileDetails(), PSET
END IF

DO
DO WHILE GetMouseInput
SELECT CASE my
CASE 86 TO 98
SELECT CASE mx
CASE 364 TO 386
IF Button <> 1 THEN
Bx = 370
GOSUB LightBUTT
Button = 1
END IF
CASE 387 TO 411
IF Button <> 2 THEN
Bx = 393
GOSUB LightBUTT
Button = 2
END IF
CASE 412 TO 434
IF Button <> 3 THEN
Bx = 418
GOSUB LightBUTT
Button = 3
END IF
CASE ELSE: GOSUB DarkBUTT
END SELECT
CASE ELSE: GOSUB DarkBUTT
END SELECT
IF mb AND Button THEN
SELECT CASE Button
CASE 1 'back
Page = Page - 1: GOSUB TurnPAGE
CASE 2 'exit
GOSUB CloseSHOP
CASE 3 'forward
Page = Page + 1: GOSUB TurnPAGE
END SELECT
END IF
LOOP
LOOP
CASE 3
GET (158, 72)-(158 + (HelpAbout(0) / 8), 72 + HelpAbout(1)), ScreenBOX()
PUT (158, 72), HelpAbout(), PSET

DO
DO WHILE GetMouseInput
SELECT CASE my
CASE 86 TO 98
SELECT CASE mx
CASE 370 TO 390
IF Button <> 4 THEN
Bx = 376
GOSUB LightBUTT
Button = 4
END IF
CASE ELSE
GOSUB DarkBUTT
END SELECT
CASE ELSE
GOSUB DarkBUTT
END SELECT
IF Button = 4 AND mb THEN GOSUB CloseSHOP
LOOP
LOOP
END SELECT

EXIT SUB

DarkBUTT:
FOR x = ExBx TO ExBx + 10
FOR y = 88 TO 96
IF POINT(x, y) = 224 THEN PSET (x, y), 223
NEXT y
NEXT x
Button = 0
RETURN

LightBUTT:
IF ExBx <> 0 THEN GOSUB DarkBUTT
FOR x = Bx TO Bx + 10
FOR y = 88 TO 96
IF POINT(x, y) = 223 THEN PSET (x, y), 224
NEXT y
NEXT x
ExBx = Bx
RETURN

TurnPAGE:
IF Page = -1 OR Page = LastPAGE + 1 THEN
GOSUB CloseSHOP
ELSE
IF Item = 1 THEN
IF Page = 0 THEN
PUT (158, 72), HelpInstructions(), PSET
ELSE
Index! = ((Page - 1) * 17000) + 26000
PUT (169, 105), HelpInstructions(Index!), PSET
END IF
ELSE
IF Page = 0 THEN
PUT (158, 72), HelpFileDetails(), PSET
ELSE
Index! = ((Page - 1) * 17000) + 26000
PUT (169, 105), HelpFileDetails(Index!), PSET
END IF
END IF
END IF
RETURN

CloseSHOP:
PUT (158, 72), ScreenBOX(), PSET
EXIT SUB
RETURN

END SUB

SUB ToolBAR ()
STATIC ExTIndex, CircleTOOL, SquareTOOL, ElipseTOOL
SHARED EXtx, EXty, EXbx1, Exbx2, InitCOLOR, Invisible
MouseChange = 1
DO
IF MouseChange THEN
SELECT CASE my
CASE 180 TO 196 'run buttons
SELECT CASE mx
CASE 17 TO 38: Button = 1: bx = 17: BIndex = 0
CASE 40 TO 61: Button = 2: bx = 41: BIndex = 250
CASE 63 TO 85: Button = 3: bx = 63: BIndex = 500
CASE 87 TO 108: Button = 4: bx = 86: BIndex = 750
CASE 110 TO 131: Button = 5: bx = 108: BIndex = 1000
CASE ELSE: EXIT SUB
END SELECT
IF mb AND Button THEN GOSUB ButtonCLICK: EXIT SUB
CASE 205 TO 230 'tool row 1
SELECT CASE mx
CASE 27 TO 57: Tool = 1
CASE 59 TO 89: Tool = 2
CASE 91 TO 121: Tool = 3
CASE ELSE: EXIT SUB
END SELECT
IF mb AND Tool THEN GOSUB toolclick
CASE 231 TO 256 'tool row 2
SELECT CASE mx
CASE 27 TO 57: Tool = 4
CASE 59 TO 89: Tool = 5
CASE 91 TO 121: Tool = 6
CASE ELSE: EXIT SUB
END SELECT
IF mb AND Tool THEN GOSUB toolclick
CASE 257 TO 282 'tool row 3
SELECT CASE mx
CASE 27 TO 57: Tool = 7
CASE 59 TO 89: Tool = 8
CASE 91 TO 121: Tool = 9
CASE ELSE: EXIT SUB
END SELECT
IF mb AND Tool THEN GOSUB toolclick
CASE 290 TO 308 'options buttons
SELECT CASE WorkingTOOL
CASE 2
SELECT CASE mx
CASE 35 TO 44: BrushNUM = 1: bx1 = 35: bx2 = 44
CASE 45 TO 55: BrushNUM = 2: bx1 = 45: bx2 = 55
CASE 56 TO 68: BrushNUM = 3: bx1 = 56: bx2 = 68
CASE 80 TO 92: BrushNUM = 4: bx1 = 80: bx2 = 92
CASE 93 TO 103: BrushNUM = 5: bx1 = 93: bx2 = 103
CASE 104 TO 113: BrushNUM = 6: bx1 = 104: bx2 = 113
CASE ELSE: EXIT SUB
END SELECT
CASE 4, 5, 7
SELECT CASE mx
CASE 48 TO 66: Fill = 1
CASE 82 TO 100: Fill = 2
CASE ELSE: EXIT SUB
END SELECT
END SELECT
IF mb AND (BrushNUM > 0) THEN GOSUB SetBRUSH: EXIT SUB
IF mb AND (Fill > 0) THEN GOSUB SetFILL: EXIT SUB
CASE 322 TO 342 'Invisible/Visible buttons
IF mx > 28 AND mx < 72 THEN
IF mb THEN
LINE (29, 322)-(71, 342), 224, B 'Mask on
LINE (77, 322)-(119, 342), 244, B 'Mask off
Invisible = 1
END IF
END IF
IF mx > 76 AND mx < 120 THEN
IF mb THEN
LINE (29, 322)-(71, 342), 244, B 'Mask on
LINE (77, 322)-(119, 342), 224, B 'Mask off
Invisible = 0
END IF
END IF
CASE 411 TO 421 'color scan arrows
SELECT CASE mx
CASE 23 TO 38: Scan = 1: Sx1 = 24: Sx2 = 35
CASE 44 TO 58: Scan = 2: Sx1 = 47: Sx2 = 55
CASE 89 TO 103: Scan = 3: Sx1 = 92: Sx2 = 100
CASE 110 TO 125: Scan = 4: Sx1 = 112: Sx2 = 123
CASE ELSE: EXIT SUB
END SELECT
IF mb AND Scan THEN GOSUB ScanCOLORS: EXIT SUB
CASE ELSE: EXIT SUB
END SELECT
END IF
MouseChange = GetMouseInput
LOOP

EXIT SUB

ButtonCLICK:
GET (bx, 180)-(bx + 24, 197), BBox(1250)
PUT (bx, 180), BBox(BIndex), PSET
SELECT CASE Button
CASE 1: 'Rewind to beginning
IF FrameNUM <> 1 THEN
GET (14, 60)-(133, 149), ProjectBOX(803 + (FrameNUM - 1) * 5402)
PUT (14, 60), ProjectBOX(803), PSET
IF WorkDONE = 1 THEN LessWORK = 1 ELSE LessWORK = 0
ScaleUP
WorkDONE = LessWORK
PrintNUMS 66, 155, "001"
FrameNUM = 1
END IF
CASE 2: 'Back one frame
IF FrameNUM > 1 THEN
GET (14, 60)-(133, 149), ProjectBOX(803 + (FrameNUM - 1) * 5402)
FrameNUM = FrameNUM - 1
PUT (14, 60), ProjectBOX(803 + (FrameNUM - 1) * 5402), PSET
IF WorkDONE = 1 THEN LessWORK = 1 ELSE LessWORK = 0
ScaleUP
WorkDONE = LessWORK
Frame$ = "000" + LTRIM$(RTRIM$(STR$(FrameNUM)))
Frame$ = RIGHT$(Frame$, 3)
PrintNUMS 66, 155, Frame$
END IF
CASE 3: 'PLAY
IF WorkDONE THEN GET (14, 60)-(133, 149), ProjectBOX(803 + (FrameNUM - 1) * 5402)
FOR n& = 0 TO NumFRAMES - 1
Frame$ = "000" + LTRIM$(RTRIM$(STR$(n& + 1)))
Frame$ = RIGHT$(Frame$, 3)
PrintNUMS 66, 155, Frame$
WAIT &H3DA, 8: WAIT &H3DA, 8, 8
PUT (14, 60), ProjectBOX(n& * 5402 + 803), PSET
IF WorkDONE = 1 THEN LessWORK = 1 ELSE LessWORK = 0
ScaleUP
_DELAY .05
WorkDONE = LessWORK
NEXT n&
_DELAY .05
PUT (14, 60), ProjectBOX((FrameNUM - 1) * 5402 + 803), PSET
IF WorkDONE = 1 THEN LessWORK = 1 ELSE LessWORK = 0
ScaleUP
WorkDONE = LessWORK
Frame$ = "000" + LTRIM$(RTRIM$(STR$(FrameNUM)))
Frame$ = RIGHT$(Frame$, 3)
PrintNUMS 66, 155, Frame$
CASE 4: 'Forward one frame
FrameNUM = FrameNUM + 1
Frame$ = "000" + LTRIM$(RTRIM$(STR$(FrameNUM)))
Frame$ = RIGHT$(Frame$, 3)
PrintNUMS 66, 155, Frame$
IF FrameNUM > NumFRAMES THEN
NumFRAMES = NumFRAMES + 1
ArraySIZE& = 802 + NumFRAMES * 5402&
REDIM SwapBOX(ArraySIZE&)
FOR n& = 0 TO ArraySIZE& - 5402
SwapBOX(n&) = ProjectBOX(n&)
NEXT n&
REDIM ProjectBOX(ArraySIZE&)
FOR n& = 0 TO ArraySIZE& - 5402
ProjectBOX(n&) = SwapBOX(n&)
NEXT n&
ProjectBOX(802) = NumFRAMES
GET (14, 60)-(133, 149), ProjectBOX(803 + (FrameNUM - 2) * 5402)
LINE (14, 60)-(133, 149), 255, BF
ScaleUP
ELSE
GET (14, 60)-(133, 149), ProjectBOX(803 + (FrameNUM - 2) * 5402)
PUT (14, 60), ProjectBOX(803 + (FrameNUM - 1) * 5402), PSET
IF WorkDONE = 1 THEN LessWORK = 1 ELSE LessWORK = 0
ScaleUP
WorkDONE = LessWORK
END IF
CASE 5: 'Forward to end
GET (14, 60)-(133, 149), ProjectBOX(803 + (FrameNUM - 1) * 5402)
PUT (14, 60), ProjectBOX(803 + (NumFRAMES - 1) * 5402), PSET
IF WorkDONE = 1 THEN LessWORK = 1 ELSE LessWORK = 0
ScaleUP
WorkDONE = LessWORK
Frame$ = "000" + LTRIM$(RTRIM$(STR$(NumFRAMES)))
Frame$ = RIGHT$(Frame$, 3)
PrintNUMS 66, 155, Frame$
FrameNUM = NumFRAMES
END SELECT
_DELAY .075
PUT (bx, 180), BBox(1250), PSET
RETURN

toolclick:
TIndex = -1
SELECT CASE Tool
CASE 1: tx = 29: ty = 208
CASE 2: tx = 61: ty = 208: TIndex = 0
CASE 3: tx = 93: ty = 208
CASE 4: tx = 29: ty = 234: TIndex = 3600
CASE 5: tx = 61: ty = 234: TIndex = 1200
CASE 6: tx = 93: ty = 234
CASE 7: tx = 29: ty = 260: TIndex = 2400
CASE 8: tx = 61: ty = 260
CASE 9: tx = 93: ty = 260
END SELECT
LINE (EXtx, EXty)-STEP(26, 20), 244, B
LINE (tx, ty)-STEP(26, 20), 224, B
EXtx = tx: EXty = ty
IF TIndex > -1 THEN
PUT (27, 288), Options(TIndex), PSET
ELSE
LINE (27, 288)-(121, 310), 243, BF
END IF
WorkingTOOL = Tool
ExTIndex = TIndex
RETURN

ScanCOLORS:
LINE (Sx1, 414)-(Sx2, 418), 224, BF
SELECT CASE Scan
CASE 1: InitCOLOR = InitCOLOR - 40
CASE 2: InitCOLOR = InitCOLOR - 2
CASE 3: InitCOLOR = InitCOLOR + 2
CASE 4: InitCOLOR = InitCOLOR + 40
END SELECT
IF InitCOLOR > 255 THEN InitCOLOR = InitCOLOR - 256
IF InitCOLOR < 0 THEN InitCOLOR = InitCOLOR + 256
IF InitCOLOR = 256 THEN InitCOLOR = 0
PaletteDISPLAY (InitCOLOR)
_DELAY .1
LINE (Sx1, 414)-(Sx2, 418), 222, BF
RETURN

SetBRUSH:
FOR x = EXbx1 TO Exbx2
FOR y = 290 TO 308
Colr = POINT(x, y)
SELECT CASE Colr
CASE 222: Colr = 250
CASE 220: Colr = 225
CASE 224: Colr = 223
END SELECT
PSET (x, y), Colr
NEXT y
NEXT x
FOR x = bx1 TO bx2
FOR y = 290 TO 308
Colr = POINT(x, y)
SELECT CASE Colr
CASE 250: Colr = 222
CASE 225: Colr = 220
CASE 223: Colr = 224
END SELECT
PSET (x, y), Colr
NEXT y
NEXT x
EXbx1 = bx1: Exbx2 = bx2: ToolBOX(2) = 20 + (BrushNUM - 1)
GET (27, 288)-(121, 310), Options()
RETURN

SetFILL:
IF Fill = 1 THEN
d1 = 222: d2 = 250
m1 = 220: m2 = 225
l1 = 224: l2 = 223
ToolBOX(WorkingTOOL) = WorkingTOOL * 10
ELSE
d1 = 250: d2 = 222
m1 = 225: m2 = 220
l1 = 223: l2 = 224
ToolBOX(WorkingTOOL) = WorkingTOOL * 10 + 1
END IF
FOR x = 48 TO 100
FOR y = 290 TO 308
SELECT CASE x
CASE IS > 74
IF POINT(x, y) = d1 THEN PSET (x, y), d2
IF POINT(x, y) = m1 THEN PSET (x, y), m2
IF POINT(x, y) = l1 THEN PSET (x, y), l2
CASE IS < 74
IF POINT(x, y) = d2 THEN PSET (x, y), d1
IF POINT(x, y) = m2 THEN PSET (x, y), m1
IF POINT(x, y) = l2 THEN PSET (x, y), l1
END SELECT
NEXT y
NEXT x
GET (27, 288)-(121, 310), Options(ExTIndex)
RETURN

END SUB

SUB ColorSELECTION ()
SHARED InitCOLOR, LastEDIT

SELECT CASE my
CASE 434 TO 447: Row = 1
CASE 448 TO 461: Row = 2
CASE ELSE: EXIT SUB
END SELECT
IF mb THEN
IF mx > 16 AND mx < 618 THEN
Column = (mx - 17) \ 30 + 1
Location = (mx - 17) MOD 30
IF Location > 0 AND Location < 29 THEN
WorkingCOLOR = ((Column - 1) * 2 + Row - 1) + InitCOLOR
IF WorkingCOLOR > 255 THEN WorkingCOLOR = WorkingCOLOR - 256
IF WorkingCOLOR < 0 THEN WorkingCOLOR = WorkingCOLOR + 256
IF WorkingCOLOR = 221 THEN WorkingCOLOR = LastEDIT
LINE (64, 410)-(83, 422), WorkingCOLOR, BF
END IF
END IF
END IF

END SUB

SUB WorkAREA ()

MouseChange = 1
DO

IF MouseChange THEN
SELECT CASE mx
CASE 140 TO 639
SELECT CASE my
CASE 55 TO 430
WorkX = (mx - 146) \ 4
LilX = 14 + WorkX
WorkY = (my - 60) \ 4
LilY = WorkY + 60
IF OldLX = 0 THEN OldLX = LilX
IF OldLY = 0 THEN OldLY = LilY
SELECT CASE WorkingTOOL
CASE 1 'freehand tool
IF mb THEN
IF Action = 0 THEN GOSUB GetUNDO
VIEW SCREEN (14, 60)-(133, 149)
LINE (OldLX, OldLY)-(LilX, LilY), WorkingCOLOR
VIEW
ScaleUP
Action = 1
END IF
CASE 2 'brush tool (0-5)
IF mb THEN
IF Action = 0 THEN GOSUB GetUNDO
VIEW SCREEN (14, 60)-(133, 149)
SELECT CASE ToolBOX(WorkingTOOL) MOD 10
CASE 0
CIRCLE (LilX, LilY), 1, WorkingCOLOR 'brush round 1
PSET (LilX, LilY), WorkingCOLOR
CASE 1
CIRCLE (LilX, LilY), 2, WorkingCOLOR 'brush size 2
LINE (LilX - 1, LilY - 1)-(LilX + 1, LilY + 1), WorkingCOLOR, BF
CASE 2
CIRCLE (LilX, LilY), 3, WorkingCOLOR 'brush size 3
LINE (LilX - 2, LilY - 2)-(LilX + 2, LilY + 2), WorkingCOLOR, BF
CASE 3
LINE (LilX - 2, LilY - 2)-(LilX + 3, LilY + 3), WorkingCOLOR, BF 'brush square 3
CASE 4
LINE (LilX - 1, LilY - 1)-(LilX + 2, LilY + 2), WorkingCOLOR, BF 'brush square 2
CASE 5
LINE (LilX, LilY)-(LilX + 1, LilY + 1), WorkingCOLOR, BF 'brush square 1
END SELECT
VIEW
ScaleUP
Action = 1
END IF
CASE 3 'line tool
IF mb THEN
IF Action = 0 THEN
GOSUB GetUNDO
StartX = LilX: StartY = LilY
GET (14, 60)-(133, 149), AniBOX()
END IF
VIEW SCREEN (14, 60)-(133, 149)
PUT (14, 60), AniBOX(), PSET
LINE (StartX, StartY)-(LilX, LilY), WorkingCOLOR
VIEW
ScaleUP
Action = 1
END IF
CASE 4 'box tool (0/1)
IF mb THEN
IF Action = 0 THEN
GOSUB GetUNDO
StartX = LilX: StartY = LilY
GET (14, 60)-(133, 149), AniBOX()
END IF
VIEW SCREEN (14, 60)-(133, 149)
PUT (14, 60), AniBOX(), PSET
IF ToolBOX(WorkingTOOL) MOD 10 = 1 THEN
LINE (StartX, StartY)-(LilX, LilY), WorkingCOLOR, BF
ELSE
LINE (StartX, StartY)-(LilX, LilY), WorkingCOLOR, B
END IF
VIEW
ScaleUP
Action = 1
END IF
CASE 5 'circle tool (0/1)
IF mb THEN
IF Action = 0 THEN
GOSUB GetUNDO
StartX = LilX: StartY = LilY
GET (14, 60)-(133, 149), AniBOX()
END IF
VIEW SCREEN (14, 60)-(133, 149)
PUT (14, 60), AniBOX(), PSET
Radius = SQR((LilX - StartX) ^ 2 + (LilY - StartY) ^ 2)
IF ToolBOX(WorkingTOOL) MOD 10 = 1 THEN
CIRCLE (StartX, StartY), Radius, WorkingCOLOR
FOR Radii = 0 TO Radius - 1
CIRCLE (StartX + 1, StartY), Radii, WorkingCOLOR
CIRCLE (StartX - 1, StartY), Radii, WorkingCOLOR
CIRCLE (StartX, StartY + 1), Radii, WorkingCOLOR
CIRCLE (StartX, StartY - 1), Radii, WorkingCOLOR
CIRCLE (StartX, StartY), Radii, WorkingCOLOR
NEXT Radii
ELSE
CIRCLE (StartX, StartY), Radius, WorkingCOLOR
END IF
VIEW
ScaleUP
Action = 1
END IF
CASE 6 'floodfill tool
IF mb THEN
IF Action = 0 THEN GOSUB GetUNDO
VIEW SCREEN (14, 60)-(133, 149)
PAINT (LilX, LilY), WorkingCOLOR
VIEW
ScaleUP
Action = 1
ELSEIF mb2 THEN
IF Action = 0 THEN GOSUB GetUNDO
VIEW SCREEN (14, 60)-(133, 149)
max = 120 * 90
REDIM ffX(max * 2), ffY(max * 2)
c = POINT(LilX, LilY)
base = 0
last = 0
ffX(0) = LilX: ffY(0) = LilY
GOTO FFbegin
DO
oldbase = base
OldLast = last
IF base = 0 THEN base = max ELSE base = 0
last = base - 1
FFbegin:
FOR i = oldbase TO OldLast
px = ffX(i) + 1: py = ffY(i): IF POINT(px, py) = c THEN last = last + 1: ffX(last) = px: ffY(last) = py: PSET (px, py), WorkingCOLOR
px = ffX(i) - 1: py = ffY(i): IF POINT(px, py) = c THEN last = last + 1: ffX(last) = px: ffY(last) = py: PSET (px, py), WorkingCOLOR
px = ffX(i): py = ffY(i) + 1: IF POINT(px, py) = c THEN last = last + 1: ffX(last) = px: ffY(last) = py: PSET (px, py), WorkingCOLOR
px = ffX(i): py = ffY(i) - 1: IF POINT(px, py) = c THEN last = last + 1: ffX(last) = px: ffY(last) = py: PSET (px, py), WorkingCOLOR
NEXT
LOOP UNTIL last = base - 1
VIEW
ScaleUP
Action = 1
END IF
CASE 7 'elipse tool(0/1)
IF mb THEN
IF Action = 0 THEN
GOSUB GetUNDO
StartX = LilX: StartY = LilY
GET (14, 60)-(133, 149), AniBOX()
END IF
VIEW SCREEN (14, 60)-(133, 149)
PUT (14, 60), AniBOX(), PSET
Radius = SQR((LilX - StartX) ^ 2 + (LilY - StartY) ^ 2)
IF LilX > StartX THEN
Adjacent = LilX - StartX
ELSE
Adjacent = StartX - LilX
END IF
IF LilY > StartY THEN
Opposite = LilY - StartY
ELSE
Opposite = StartY - LilY
END IF
Elipse! = Opposite / (Adjacent + .01)
IF ToolBOX(WorkingTOOL) MOD 10 = 1 THEN
CIRCLE (StartX, StartY), Radius, WorkingCOLOR, , , Elipse!
FOR Radii = 0 TO Radius - 1
CIRCLE (StartX + 1, StartY), Radii, WorkingCOLOR, , , Elipse!
CIRCLE (StartX - 1, StartY), Radii, WorkingCOLOR, , , Elipse!
CIRCLE (StartX, StartY + 1), Radii, WorkingCOLOR, , , Elipse!
CIRCLE (StartX, StartY - 1), Radii, WorkingCOLOR, , , Elipse!
CIRCLE (StartX, StartY), Radii, WorkingCOLOR, , , Elipse!
NEXT Radii
ELSE
CIRCLE (StartX, StartY), Radius, WorkingCOLOR, , , Elipse!
END IF
VIEW
ScaleUP
Action = 1
END IF
CASE 8 'mask tool
IF mb THEN
IF Action = 0 THEN
StartX = ((mx - 146) \ 4) * 4 + 146: StartY = ((my - 60) \ 4) * 4 + 60
Masked = 0
ScaleUP
GET (146, 60)-(625, 419), BigAniBOX()
END IF
PUT (146, 60), BigAniBOX(), PSET
ScaleMX = ((mx - 147) \ 4) * 4 + 149: ScaleMY = ((my - 61) \ 4) * 4 + 63
IF StartX < 146 THEN StartX = 146
IF StartX > 625 THEN StartX = 625
IF StartY < 60 THEN StartY = 60
IF StartY > 419 THEN StartY = 419
IF ScaleMX > 625 THEN ScaleMX = 625
IF ScaleMX < 146 THEN ScaleMX = 146
IF ScaleMY > 419 THEN ScaleMY = 419
IF ScaleMY < 60 THEN ScaleMY = 60
LINE (StartX, StartY)-(ScaleMX, ScaleMY), 254, B
LINE (StartX, StartY)-(ScaleMX, ScaleMY), 255, B , &HCCCC
Action = 1
Mask = 1
END IF
IF Action = 0 AND Mask = 1 THEN
Masked = 1
Mask = 0
MaskX = (StartX - 146) \ 4 + 14
MaskY = (StartY - 60) \ 4 + 60
MaskXX = (ScaleMX - 146) \ 4 + 14
MaskYY = (ScaleMY - 60) \ 4 + 60
END IF
CASE 9 'color swap tool
IF mb THEN
IF Action = 0 THEN GOSUB GetUNDO
SwapCOLOR = POINT(mx, my)
VIEW SCREEN (14, 60)-(133, 149)
FOR x = 14 TO 133
FOR y = 60 TO 149
IF POINT(x, y) = SwapCOLOR THEN PSET (x, y), WorkingCOLOR
NEXT y
NEXT x
VIEW
ScaleUP
Action = 1
END IF
END SELECT
OldLX = LilX: OldLY = LilY
GOSUB Coordinates
IF _MOUSEBUTTON(2) THEN
WorkingCOLOR = POINT(mx, my)
LINE (64, 410)-(83, 422), WorkingCOLOR, BF
END IF
CASE ELSE
IF mb = 0 THEN EXIT SUB
END SELECT
CASE ELSE
IF mb = 0 THEN EXIT SUB
END SELECT

END IF
IF mb = 0 THEN Action = 0
MouseChange = GetMouseInput
LOOP

EXIT SUB

Coordinates:
IF WorkX <> OldWX THEN
WorkX$ = "000" + LTRIM$(STR$(WorkX))
WorkX$ = MID$(WorkX$, LEN(WorkX$) - 2, 3)
PrintNUMS 55, 374, WorkX$
END IF
IF WorkY <> OldWY THEN
IF WorkY < 90 THEN
WorkY$ = "00" + LTRIM$(STR$(WorkY))
WorkY$ = MID$(WorkY$, LEN(WorkY$) - 1, 2)
PrintNUMS 90, 374, WorkY$
END IF
END IF
OldWX = WorkX: OldWY = WorkY
RETURN

GetUNDO:
GET (14, 60)-(133, 149), UndoBOX()
RETURN

END SUB

SUB ScaleUP ()
xx = 90: yy = -180
FOR x = 14 TO 133
FOR y = 60 TO 149
LINE (x * 4 + xx, y * 4 + yy)-(x * 4 + xx + 3, y * 4 + yy + 3), POINT(x, y), BF
NEXT y
NEXT x
WorkDONE = 1
END SUB

SUB PrintNUMS (x, y, Num$)

FOR n = 1 TO LEN(Num$)
Index = VAL(MID$(Num$, n, 1)) * 30
PUT (x, y), NumBOX(Index), PSET
x = x + 6
NEXT n

END SUB

FUNCTION SavePROMPT
GET (158, 72)-(158 + SavePROMPT(0) / 8 - 1, 72 + SavePROMPT(1) - 1), ScreenBOX()
PUT (158, 72), SavePROMPT(), PSET
_SNDPLAY OhOh&
DO
DO WHILE GetMouseInput
SELECT CASE my
CASE 87 TO 99
IF mx > 379 AND mx < 401 THEN
Highlight
IF mb THEN
SavePROMPT = 0
PUT (158, 72), ScreenBOX(), PSET
EXIT FUNCTION
END IF
ELSE
UnHighlight
END IF
CASE 152 TO 174
SELECT CASE mx
CASE 229 TO 286 'Yes
IF mb THEN
_SNDPLAY Tick&
SavePROMPT = 1
PUT (158, 72), ScreenBOX(), PSET
EXIT FUNCTION
END IF
CASE 289 TO 346 'No
IF mb THEN
_SNDPLAY Tick&
SavePROMPT = 2
PUT (158, 72), ScreenBOX(), PSET
EXIT FUNCTION
END IF
CASE 349 TO 406 'Cancel
IF mb = -1 THEN
_SNDPLAY Tick&
SavePROMPT = 0
PUT (158, 72), ScreenBOX(), PSET
EXIT FUNCTION
END IF
CASE ELSE
UnHighlight
END SELECT
CASE ELSE
UnHighlight
END SELECT
LOOP
LOOP

END FUNCTION

SUB Highlight
IF Highlighted = 0 THEN
FOR x = 380 TO 400
FOR y = 87 TO 99
IF POINT(x, y) = 223 THEN PSET (x, y), 224
NEXT y
NEXT x
Highlighted = 1
END IF
END SUB

SUB UnHighlight
IF Highlighted = 1 THEN
FOR x = 380 TO 400
FOR y = 87 TO 99
IF POINT(x, y) = 224 THEN PSET (x, y), 223
NEXT y
NEXT x
Highlighted = 0
END IF
END SUB

SUB DisplayERROR (ErrorNUM)

GET (158, 72)-(158 + OhOhBOX(0) / 8 - 1, 72 + OhOhBOX(1) - 1), ScreenBOX()
PUT (158, 72), OhOhBOX(), PSET

_SNDPLAY OhOh&

SELECT CASE ErrorNUM
CASE 1
PrintSTRING 230, 118, "Sorry, your file (or its path) could", 1
PrintSTRING 230, 130, "not be found. Please try again.", 1
CASE 2
PrintSTRING 230, 118, "Sorry, that file name is in use by", 1
PrintSTRING 230, 130, "another project. Please try again.", 1
CASE 3
PrintSTRING 228, 118, "Sorry, the file you want to open is", 1
PrintSTRING 228, 130, "not a .GFX file. Please try again.", 1
END SELECT

DO
DO WHILE GetMouseInput
SELECT CASE my
CASE 87 TO 99
IF mx > 379 AND mx < 401 THEN
Highlight
ELSE
UnHighlight
END IF
IF mb THEN
PUT (158, 72), ScreenBOX(), PSET
EXIT SUB
END IF
CASE 152 TO 174
SELECT CASE mx
CASE 289 TO 346 'OK
IF mb THEN
_SNDPLAY Tick&
PUT (158, 72), ScreenBOX(), PSET
EXIT SUB
END IF
CASE 349 TO 406 'Cancel
IF mb = -1 THEN
_SNDPLAY Tick&
PUT (158, 72), ScreenBOX(), PSET
EXIT SUB
END IF
END SELECT
CASE ELSE
UnHighlight
END SELECT
LOOP
LOOP

END SUB

SUB SetRECENT (Mode)
SHARED OldFILENAME$, OldPRINTNAME$

OPEN "Recent.DAT" FOR RANDOM AS #1 LEN = LEN(Recent(1))
FOR n = 1 TO 6
GET #1, n, Recent(n)
NEXT n
CLOSE #1

IF Mode = 1 THEN
FOR n = 6 TO 2 STEP -1 'shift file names down one
Recent(n) = Recent(n - 1)
NEXT n
Recent(1).PName = PrintNAME$ 'add new name to top slot
Recent(1).FName = FileNAME$
ELSE 'file to be removed from recent list
FOR n = 1 TO 6
IF UCASE$(RTRIM$(Recent(n).FName)) = UCASE$(FileNAME$) THEN
Recent(n).PName = SPACE$(32)
Recent(n).FName = SPACE$(130)
END IF
NEXT n
FileNAME$ = OldFILENAME$
PrintNAME$ = OldPRINTNAME$
END IF

FOR n = 1 TO 5 'replace duplicates with blanks
FOR nn = n + 1 TO 6
IF UCASE$(RTRIM$(Recent(nn).PName)) = UCASE$(RTRIM$(Recent(n).PName)) THEN
Recent(nn).PName = SPACE$(32)
Recent(nn).FName = SPACE$(130)
END IF
NEXT nn
NEXT n

FOR n = 1 TO 5 'move all names to top of list, blanks to bottom
IF LEN(RTRIM$(Recent(n).PName)) = 0 THEN
Hop = 1
DO
IF LEN(RTRIM$(Recent(n + Hop).PName)) <> 0 THEN
SWAP Recent(n), Recent(n + Hop)
EXIT DO
END IF
Hop = Hop + 1
IF Hop + n > 6 THEN EXIT DO
LOOP
END IF
NEXT n

OPEN "Recent.DAT" FOR RANDOM AS #1 LEN = LEN(Recent(1))
FOR n = 1 TO 6 'put new list configuration in file
PUT #1, n, Recent(n)
NEXT n
CLOSE #1

END SUB

FUNCTION GetMouseInput
GetMouseInput = _MOUSEINPUT
mx = _MOUSEX
my = _MOUSEY
mb = _MOUSEBUTTON(1)
mb2 = _MOUSEBUTTON(2)
END FUNCTION

Posted on Jan 28, 2011, 5:54 AM

Respond to this message   

Return to Index


Response TitleAuthor and Date
*EASTER EGG added: Use RIGHT CLICK with flood fill selected for a proper flood fillGalleon on Jan 28
 *Seems that flood fill is a bit buggy, I'll try and make a better one.Galleon on Jan 28
  OK, this is much better. No errors this time.Galleon on Jan 28
   *And then there's this... www.qb64.net/animate2.gfxGalleon on Jan 28
    lol - night golf is very difficult... on Jan 28
     *P.S. Thanks for the floodfill routine!! on Jan 28
      I use Windows 7 and have no issues but...Galleon on Jan 28
       I haven't had a "jumpy" mouse problem... on Jan 29
        My 'gut instinct' is that the problem lies in when you are calling _MOUSEINPUTGalleon on Jan 29
         TEST PROGRAM #1 (any phantom mouse presses here?)Galleon on Jan 29
          No problems ... on Jan 29
           In that case, I'm inclined to believe the problem is in your code...Galleon on Jan 29
            *Thanks, Galleon -- I'm sure you're right. on Jan 30
             *Double post error -- ignore. on Jan 31
             Galleon, something I should mention ... on Jan 31
              *Noted.Galleon on Feb 1
   What exactly did you change Galleon? on Jan 28
    *I fixed the missed mouse click problems and added support for an alternate flood fillGalleon on Jan 28
    RE: Your solution Clippy...Galleon on Jan 28
     Well how do I tell when the button is still down? Not just clicked.Clippy on Jan 28
      Wahts the command called?UnseenMachine on Jan 28
      If you want the current state of the mouse, skip to the last message...Galleon on Jan 28
       So reading inside the loop doesn't give you the stateClippy on Jan 29
      RE: Well how do I tell when the button is still down?Galleon on Jan 28
       How are you coding?Unseen Machine on Jan 29