'Power Programs Source release notes:
'This ascii Version does not contain the ASOS v1.34e functions unfolded.
'Please check the ASOS archive for ASOS source.
'
'BreakOut editor, Profesional version 0.5 B        
'For editting breakout levels! 
'(C) Power Programs 1996.
'A.S.O.S. (C) 1993-1996 Power Programs.  
Set Buffer 64
'
'
Rem Maximum zones,windows and the redraw-buffer size.
'
Global M_ZON,M_WIN,RED_BUF,M_MGAD,VER$,COMM$,STDFONT
M_ZON=50 : M_WIN=4 : RED_BUF=256 : M_MGAD=M_ZON*4
VER$="1.34e" : COMM$="In house. Breakedit version."
STDFONT=1
'
'
Rem ASOS arrays & variables  
'
Dim WY(M_WIN),WX(M_WIN),GD(M_ZON-M_WIN,3),ZON(M_ZON),ZOX(M_ZON),ZOX1(M_ZON),ZOY(M_ZON),ZOY1(M_ZON)
Dim WX2(M_WIN),WY2(M_WIN),CS(M_ZON-M_WIN),RS(M_ZON-M_WIN),WT(M_WIN),IC(10),NR(10,1)
Dim WT$(RED_BUF,4,3),GD$(M_ZON-M_WIN),TI$(M_WIN)
Dim PSP(M_ZON-M_WIN,6),MGAD$(M_MGAD),MGAD(M_ZON-M_WIN,3),HELP(M_WIN)
'
Global CK1,AERR,FL,WY(),WX(),GD(),FL2,ZON(),ZOX(),ZOX1(),ZOY(),ZOY1(),ZNM
Global ZNIN,WININ,WX2(),WY2(),CS(),RS(),CLK,GX1,GX2,GY1,GY2,WT(),IC(),NR()
Global WT$(),GD$(),TI$(),MGAD$(),MGAD(),HELP()
Global RST,REDRAW,ANS,ANS$,L_AERR,AERR_CN
Global OUT$,LU,LD,LF,DE,BO,ES,CX,ER,Y,PSP()
'
'
Rem standard Asos system settings. 
'
Screen Open 0,640,240,8,Hires
Screen To Front 0 : Screen 0 : Curs Off : Flash Off 
Wind Save 
Palette $1,$555,$222,$FFF,$C0,$F,$300,$0 : Paper 0 : Pen 3 : Cls 
Limit Mouse -9999,-9999 To 9999,9999
Get Rom Fonts 
F=1 : F$=Font$(F)
While F$<>""
   F$=Font$(F)
   If Lower$(Left$(F$,10))="topaz.font" and STDFONT=0 Then STDFONT=F
   F=F+1
Wend 
Set Font STDFONT
'
'
Rem BreakEdit Constantes.
'
UREG$="Breakout Extended level."
REG$="Breakout Standard level."
ED$="Breakout Editor level."
BRPACKCOMM$="Breakout level package (C) 1998 Power Programs."
BRPACKHEAD$="BRKPCK"
BRUREGHEAD$="BRKEXT"
BREDITHEAD$="BRKEDT"
BREDITVER$="05"
OBJMX=31 : OBJMY=31 : XG=12 : YG=6 : MXLEVEL=50
Dim WALL(3,3)
WALL(1,0)=0 : WALL(1,1)=0 : WALL(1,2)=5 : WALL(1,3)=250
WALL(2,0)=0 : WALL(2,1)=0 : WALL(2,2)=200 : WALL(2,3)=5
WALL(3,0)=195 : WALL(3,1)=0 : WALL(3,2)=200 : WALL(3,3)=250
'
Global UREG$,UREGCODE$,REG$,REGCODE$,ED$,EDCODE$
Global BRFILECOMM$,BRFILEHEAD$,BRPACKCOMM$,BRPACKHEAD$,BREDITHEAD$
Global BREDITVER$,BRUREGHEAD$
Global OBJMX,OBJMY,XG,YG,MXLEVEL,WALL()
'
'
Rem BreakEdit Variabelen:
'
Dim OBJ(OBJMX,OBJMY,4),LV$(MXLEVEL),BACK(2,1,MXLEVEL),LEVELS(MXLEVEL)
Global OBJ(),LEVEL,SP,LV$(),BACK(),LVCN,PCK$,BONUS,LEVELS()
Global XSP,YSP,BRICKS,ED,BRICK,BRICKTYPE,HITS,SCORE
ED=False
'
'
Rem *** Versie 1.34e van de ASOS (Amos mouSe Operated System) procedures.        
'
Procedure GENERR
Procedure WINOP[X,Y,X2,Y2,TP,NUM,TI$]
Procedure WINCL[NUM]
Procedure WINGAD[WIN,NUM,GD$,X,Y,R]
Procedure WINMGAD[WIN,NUM,GD1,GD2,X,Y,R]
Procedure MGADUPD[NUM]
Procedure MGADCON[NUM]
Procedure WTCLK[WIN]
Procedure WINTX[WIN,TX$,X,Y,MD]
Procedure STZN[NUM,X1,Y1,X2,Y2]
Procedure MSZON
Procedure RSTZN[NO1,NO2,WNFL]
Procedure WINCLR[WIN,FL]
Procedure WINBUTT[WIN,NUM,TP,X,Y]
Procedure ANPUT[WIN,NUM,DEF$,NX,Y,MX,SPC,CU,CD,CL,CR]
Procedure WINSZ[WIN]
Procedure GROWBOX
Procedure INVGAD[NUM]
Procedure RESTGAD[NUM]
Procedure WINRED[NUM]
Procedure REDRAW[NUM]
Procedure CLEAR
Procedure WINREQ
Procedure ZONREQ
Procedure CLREDRAW[NUM]
Procedure WATKEY
Procedure RESET[NUM]
Procedure SETHELP[WIN,NUM]
Procedure DELHELP[WIN]
Procedure GENHELP
Procedure ABOUT
Procedure EXEC[C$]
Procedure QUIT
'
'
Rem Asos user procedures (v1.34e).   
'
Load "Breakout:Graphics/bricks&patterns.abk"
If Fast Free>131072+(24*1024) Then Reserve As Work 5,131072 : Goto GO_ON
If Chip Free>131072+(24*1024) Then Reserve As Chip Work 5,131072 : Goto GO_ON
Locate 0,10 : Centre "There is not enough memory to run this program.."
Locate 0,20 : Centre "Press any key"
Wait Key 
Fade 5 : Wait 5*15
End 
GO_ON:
Procedure USERGADDATA
   Rem fill out data segement with multi-gadget data here.
   Restore GADDATA
   Read _MAXGADS : If _MAXGADS>M_MGAD Then _MAXGADS=M_MGAD
   For _GADREAD=1 To _MAXGADS
      Read MGAD$(_GADREAD)
   Next 
   Pop Proc
   GADDATA:
   Data 8
   Data "Extended Package"
   Data "Standard Package"
   Data "Editor Package"
   Data "Normal"
   Data "Randomizer"
   Data "Teleporter"
   Data "Reappearing"
   Data "Invisible"
End Proc
Procedure USERRESET
   Rem fill out user reset functions here.
   LVFILL
End Proc
Procedure USERHELP
'
'
Rem user procedures. 
'
Procedure LVFILL
   For I=1 To MXLEVEL
      LV$(I)="Another breakout level!"
   Next 
   For I=1 To MXLEVEL
      For Z=1 To 2
         For Z2=0 To 1
            BACK(Z,Z2,I)=Z
            If Z2=1 Then BACK(Z,Z2,I)=BACK(Z,Z2,I)+4
         Next 
      Next 
   Next 
End Proc
Procedure _DRAWBRICK
   XPASTE=X Mouse-X Hard(0)
   YPASTE=Y Mouse-Y Hard(0)
   XPASTE=(XPASTE/XG)*XG
   YPASTE=(YPASTE/YG)*YG
   If XPASTE>WALL(3,0)-XG Then Pop Proc
   If YPASTE>185 Then Pop Proc
   If YPASTE<=0 Then Pop Proc
   If XPASTE<=0 Then Pop Proc
   If YPASTE/YG>31 or YPASTE/YG<1 Then Pop Proc
   If XPASTE/XG>15 or XPASTE/XG<1 Then Pop Proc
   Paste Icon XPASTE,YPASTE,BRICK
   OBJ(XPASTE/XG,YPASTE/YG,0)=1
   OBJ(XPASTE/XG,YPASTE/YG,1)=SCORE
   OBJ(XPASTE/XG,YPASTE/YG,2)=HITS
   OBJ(XPASTE/XG,YPASTE/YG,3)=BRICK
   OBJ(XPASTE/XG,YPASTE/YG,4)=BRICKTYPE
End Proc
Procedure _DELBRICK
   XPASTE=X Mouse-X Hard(0)
   YPASTE=Y Mouse-Y Hard(0)
   XPASTE=(XPASTE/XG)*XG
   YPASTE=(YPASTE/YG)*YG
   If XPASTE>WALL(3,0)-XG Then Pop Proc
   If YPASTE>185 Then Pop Proc
   If YPASTE<=0 Then Pop Proc
   If XPASTE<=0 Then Pop Proc
   Screen Copy 1,XPASTE,YPASTE,XPASTE+XG,YPASTE+YG To 0,XPASTE,YPASTE
   OBJ(XPASTE/XG,YPASTE/YG,0)=0
   OBJ(XPASTE/XG,YPASTE/YG,1)=0
   OBJ(XPASTE/XG,YPASTE/YG,2)=0
   OBJ(XPASTE/XG,YPASTE/YG,3)=0
   OBJ(XPASTE/XG,YPASTE/YG,4)=0
End Proc
Procedure SELECTBRICK
   Screen Open 2,320,200,32,Lowres : Flash Off : Curs Off 
   Paper 0 : Pen 1
   Cls 
   Get Icon Palette : Set Red 8,0 : Set Blue 8,0 : Set Green 8,0
   Set Red 23,3 : Set Green 23,0 : Set Blue 23,0
   Set Red 22,3 : Set Green 22,3 : Set Blue 22,3
   Set Red 7,5 : Set Green 7,5 : Set Blue 7,5
   WINREQ : SELECT=ANS
   WINOP[40,40,280,160,0,SELECT,"Select-a-brick!"]
   Ink 0 : Bar 50,50 To 260,140
   XB=50+XG : YB=50+YG
   For Y=0 To 4
      For X=0 To 10
         Paste Icon XB+(X*XG)+(X*4),YB+(Y*YG)+(Y*4),((Y*11)+X)+1
      Next 
   Next 
   Bar 54+(2*XG),50+YG To 50+(5*XG)+(7*4),100+YG
   Ink 1,0 : Polyline 248+XG,126 To(14*8)-2,126 To(14*8)-2,140
   Pen 1 : Locate 10,12 : Print "Selected brick:"
   Locate 3,10 : Print "Press escape when done."
   Locate 8,3 : Print "<=" : Locate 7,4 : Print "Multi"
   Locate 6,7 : Print "Single" : Locate 8,8 : Print "=>"
   Paste Icon 240,129,BRICK
   While IN<>69
      IN$=Inkey$ : IN=Scancode
      If(Mouse Key) Then Gosub GBRICK
   Wend 
   Ink 0,0 : Window SELECT : Wind Close : RSTZN[SELECT,SELECT,1]
   Screen Close 2
   Screen 0 : Screen To Front 0 : DUMMY=Mouse Key
   Ink 0,0 : Bar 220,195 To 295,215
   Paste Icon 251,196,BRICK
   Pop Proc
   GBRICK:
   XGET=X Mouse-X Hard(0) : YGET=Y Mouse-Y Hard(0)
   XGET=XGET-50 : YGET=YGET-(50+YG)
   XGET=XGET/(XG+3) : YGET=YGET/(YG+3)
   BRICK=XGET+(11*YGET)
   If(BRICK=>2 and BRICK<=5) Then BRICK=1
   If(BRICK=>13 and BRICK<=16) Then BRICK=1
   If(BRICK=>24 and BRICK<=27) Then BRICK=1
   If(BRICK=>35 and BRICK<=38) Then BRICK=1
   If(BRICK=>46 and BRICK<=49) Then BRICK=1
   If(BRICK<1 or BRICK>55) Then BRICK=1
   Paste Icon 240,129,BRICK
   Return 
End Proc
Procedure SETBRICK
   Dim PAL(7,2)
   For PAL=0 To 7
      PAL(PAL,0)=Pal Red(PAL)
      PAL(PAL,1)=Pal Green(PAL)
      PAL(PAL,2)=Pal Blue(PAL)
   Next 
   Palette $1,$555,$222,$FFF,$C0,$F,$300,$0
   SCORE_BACK=SCORE : HITS_BACK=HITS
   WINREQ : SETB=ANS
   WINOP[40,40,280,200,0,SETB,"Set brick properties:"]
   WINTX[SETB,"Brick hits:",1,2,0]
   WINTX[SETB,"Brick score:",1,4,0]
   WINTX[SETB,"Brick type:",-1,6,0]
   ZONREQ : HIT=ANS : ANPUT[SETB,-HIT,Str$(HITS),13,3,3,4,0,0,0,0]
   ZONREQ : SCO=ANS : ANPUT[SETB,-SCO,Str$(SCORE),14,5,4,2,0,0,0,0]
   ZONREQ : BTYP=ANS : WINMGAD[SETB,BTYP,4,8,10,8,2]
   ZONREQ : KEEP=ANS : WINGAD[SETB,KEEP,"OK",25,17,2]
   ZONREQ : NKEEP=ANS : WINGAD[SETB,NKEEP,"Cancel",2,17,2]
   OK=False
   Do 
      WTCLK[SETB]
      If FL2=BTYP Then MGADUPD[BTYP]
      If FL2=HIT Then ANPUT[SETB,HIT,Str$(HITS),13,3,3,4,0,0,0,0] : HITS=Val(OUT$)
      If FL2=SCO Then ANPUT[SETB,SCO,Str$(SCORE),14,5,4,2,0,0,0,0] : SCORE=Val(OUT$)
      If FL2=KEEP Then OK=True : Exit 
      If FL2=NKEEP Then OK=False : Exit 
      NUM=HIT : ANPUT[GD(NUM,1),0,Str$(HITS),GD(NUM,2),GD(NUM,3),PSP(NUM,1),PSP(NUM,2),0,0,0,0]
      NUM=SCO : ANPUT[GD(NUM,1),0,Str$(SCORE),GD(NUM,2),GD(NUM,3),PSP(NUM,1),PSP(NUM,2),0,0,0,0]
   Loop 
   ANS=0
   If OK=True Then MGADCON[BTYP] : BRICKTYPE=ANS
   If OK=False Then SCORE=SCORE_BACK : HITS=HITS_BACK
   If SCORE>500 Then SCORE=500
   If HITS<1 and HITS<>-1 Then HITS=1
   If HITS>4 Then HITS=4
   WINCL[SETB]
   OLDLEV=LEVELS(LVCN)
   LEVELS(LVCN)=1
   DRWLEVEL[LVCN]
   LEVELS(LVCN)=OLDLEV
   For PAL=0 To 7
      Set Red(PAL),PAL(PAL,0)
      Set Green(PAL),PAL(PAL,1)
      Set Blue(PAL),PAL(PAL,2)
   Next 
End Proc
Procedure SETBACK
   Screen Open 2,320,200,32,Lowres : Flash Off : Curs Off 
   Paper 0 : Pen 1
   Cls 
   Get Icon Palette : Set Red 8,0 : Set Blue 8,0 : Set Green 8,0
   Set Red 23,3 : Set Green 23,0 : Set Blue 23,0
   Set Red 22,3 : Set Green 22,3 : Set Blue 22,3
   Set Red 7,5 : Set Green 7,5 : Set Blue 7,5
   Palette $777
   WINREQ : SELECT=ANS
   WINOP[40,40,280,190,0,SELECT,"Select-a-background!"]
   Ink 0 : Bar 50,50 To 260,170
   COUNTER=0
   XB=40+XG : YB=50+YG
   While COUNTER<32
      Paste Icon XB,YB,56+COUNTER
      COUNTER=COUNTER+1
      XB=XB+16 : If XB=>260 Then XB=40+XG : YB=YB+16
   Wend 
   Pen 1 : Locate 3,13 : Print "Press Escape when done"
   Ink 1,0 : Locate 3,10 : Print "Selected Pattern"
   Locate 3,11 : Print "Right butn zooms"
   Locate 3,14 : Print "Select pos. with F1-F4"
   Locate 3,15 : Print "Line marks position"
   Polyline 190,110 To 208,110 To 208,130 To 190,130 To 190,110
   Polyline 215,110 To 215+17,110 To 215+17,110+17 To 215,110+17 To 215,110
   Polyline 192,110+9 To 192+6,110+9 : Rem position 1 
   POSITION=1 : OPOSITION=1
   Paste Icon 191,111,BACK(1,0,LVCN)+55
   Paste Icon 199,111,BACK(2,0,LVCN)+55
   Paste Icon 191,120,BACK(1,1,LVCN)+55
   Paste Icon 199,120,BACK(2,1,LVCN)+55
   While IN<>69
      IN$=Inkey$ : IN=Scancode
      XM=X Mouse-X Hard(0) : YM=Y Mouse-Y Hard(0)
      XM=XM-(40+XG) : YM=YM-(40+YG)
      XM=XM/8 : YM=YM/8
      XM=(XM/2)*2 : YM=(((YM-1)/2)*2)+1
      If XM<0 Then XM=0
      If XM>25 Then XM=25
      If YM<1 Then YM=1
      If YM>6 Then YM=6
      If YM=5 and XM>10 Then XM=10
      XZ=(XM*8)+(40+XG) : YZ=(YM*8)+(42+YG)
      If Mouse Key=2 Then Zoom 2,XZ,YZ,XZ+8,YZ+8 To 2,216,111,215+16,110+16
      If IN=>80 and IN<84 Then POSITION=IN-79
      If OPOSITION<>POSITION
         Ink 0,0
         Polyline 192,119 To 206,119
         Polyline 192,128 To 206,128
         Ink 1,0
         OPOSITION=POSITION
      End If 
      If POSITION=1 Then XBACK=1 : YBACK=0 : XPAS=191 : YPAS=111 : Polyline 192,119 To 198,119
      If POSITION=2 Then XBACK=2 : YBACK=0 : XPAS=199 : YPAS=111 : Polyline 200,119 To 206,119
      If POSITION=3 Then XBACK=1 : YBACK=1 : XPAS=191 : YPAS=120 : Polyline 192,128 To 198,128
      If POSITION=4 Then XBACK=2 : YBACK=1 : XPAS=199 : YPAS=120 : Polyline 200,128 To 206,128
      If Mouse Click
         XM=XM/2 : YM=(YM-1)/2
         Paste Icon XPAS,YPAS,56+XM+(YM*13)
         BACK(XBACK,YBACK,LVCN)=XM+(YM*13)+1
      End If 
   Wend 
   Ink 0,0 : Window SELECT : Wind Close : RSTZN[SELECT,SELECT,1]
   Screen Close 2
   Screen 0 : Screen To Front 0 : DUMMY=Mouse Key
   Screen 1
   Cls 0
   For YI=WALL(1,1)/8 To WALL(3,3)/8
      For XI=WALL(1,0)/8 To(WALL(2,2)/7)-1
         Paste Icon(XI*7),YI*8,BACK(Z,Z2,LVCN)+55
         Z=Z+1
         If Z>2 Then Z=1
      Next 
      Z2=Z2+1
      If Z2>1 Then Z2=0
   Next 
   Screen Copy 1,0,0,WALL(2,2),WALL(3,3) To 0,0,0
   Screen 0
   For I=1 To 3
      Ink 1,0 : Bar WALL(I,0),WALL(I,1) To WALL(I,2),WALL(I,3)
   Next 
   DRWLEVEL[LVCN]
   Pop Proc
End Proc
Procedure SAVLEV[LEVEL]
   LEVELS(LEVEL)=1
   OFFSET=((465*5)*(LEVEL-1))+(Start(5)+118)
   For DY=1 To 31
      For DX=1 To 15
         Poke OFFSET,OBJ(DX,DY,0)
         OFFSET=OFFSET+1
         Poke OFFSET,OBJ(DX,DY,4)
         Poke OFFSET+1,OBJ(DX,DY,3)
         OFFSET=OFFSET+2
         Poke OFFSET,OBJ(DX,DY,2)+2
         Poke OFFSET+1,OBJ(DX,DY,1)/50
         OFFSET=OFFSET+2
      Next 
   Next 
End Proc
Procedure LODLEVEL[LEVEL]
   If LEVELS(LEVEL)<>1 Then Gosub EMPTY : Pop Proc
   Gosub EMPTY
   OFFSET=((465*5)*(LEVEL-1))+(Start(5)+118)
   For DY=1 To 31
      For DX=1 To 15
         OBJ(DX,DY,0)=Peek(OFFSET)
         OFFSET=OFFSET+1
         OBJ(DX,DY,4)=Peek(OFFSET)
         OBJ(DX,DY,3)=Peek(OFFSET+1)
         OFFSET=OFFSET+2
         OBJ(DX,DY,2)=Peek(OFFSET)-2
         OBJ(DX,DY,1)=Peek(OFFSET+1)*50
         OFFSET=OFFSET+2
      Next 
   Next 
   Pop Proc
   EMPTY:
   For DY=1 To 31
      For DX=1 To 15
         OBJ(DX,DY,0)=0 : OBJ(DX,DY,1)=0
         OBJ(DX,DY,4)=0 : OBJ(DX,DY,3)=0
         OBJ(DX,DY,2)=0
      Next 
   Next 
   Return 
End Proc
Procedure DRWLEVEL[LEVEL]
   If LEVELS(LEVEL)<>1 Then Pop Proc
   For DY=1 To 31
      For DX=1 To 15
         If OBJ(DX,DY,0)=1 Then Gosub PASTIC
      Next 
   Next 
   Pop Proc
   PASTIC:
   Paste Icon DX*XG,DY*YG,OBJ(DX,DY,3)
   Return 
End Proc
Procedure SAVFILE[F$,PKG]
   If F$="" Then Pop Proc
   If Right$(F$,4)<>".lev" Then Gosub NEWNAM : Pop Proc
   FIRSTLEV=118
   LASTLEV=0
   For I=1 To MXLEVEL
      If LEVELS(I)=1 Then LASTLEV=I
   Next 
   If LASTLEV=0 Then Pop Proc
   LASTLEV=(LASTLEV*2325)+FIRSTLEV
   OFFSET=0
   If PKG=1 Then HEAD$=BRUREGHEAD$+BREDITVER$
   If PKG=2 Then HEAD$=BRPACKHEAD$+BREDITVER$
   If PKG=3 Then HEAD$=BREDITHEAD$+BREDITVER$
   IN$=HEAD$ : IN=0 : LE=8 : Gosub SAVDAT : OFFSET=OFFSET+8
   IN$=BRPACKCOMM$ : IN=OFFSET : LE=48 : Gosub SAVDAT : OFFSET=OFFSET+48
   IN$=PCK$ : IN=OFFSET : LE=60 : Gosub SAVDAT : OFFSET=OFFSET+60
   For I=1 To MXLEVEL
      If LEVELS(I)=1 Then LASTLEV=I
   Next 
   LEVNUM=LASTLEV : LEVOFFSET=116
   OFFSET=OFFSET+(LASTLEV*2325)+1
   For I=1 To MXLEVEL
      If LEVELS(I)=1 Then LASTLEV=I
   Next 
   For LV=1 To LASTLEV
      For BY=1 To 2
         For BX=0 To 1
            Poke OFFSET+Start(5),BACK(BY,BX,LV) : OFFSET=OFFSET+1
         Next 
      Next 
   Next 
   For LV=1 To LASTLEV
      IN$=LV$(LV) : IN=OFFSET : LE=60 : Gosub SAVDAT : OFFSET=OFFSET+60
   Next 
   Poke LEVOFFSET+Start(5),LEVNUM
   Poke LEVOFFSET+1+Start(5),BONUS
   Bsave F$,Start(5) To Start(5)+OFFSET
   For I=1 To MXLEVEL
      If LEVELS(I)=1 Then LASTLEV=I
   Next 
   LASTLEV=(LASTLEV*2325)+FIRSTLEV
   Pop Proc
   SAVDAT:
   CN=1
   For OFFS=Start(5)+IN To Start(5)+IN+Len(IN$)
      Poke OFFS,Asc(Mid$(IN$,CN,1))
      CN=CN+1 : If CN>LE Then Exit 
   Next 
   If CN=>LE Then IN=0 : IN$="" : LE=0 : Return 
   For OFFS=Start(5)+IN+CN To Start(5)+IN+LE
      Poke OFFS,0
   Next 
   IN=0 : IN$="" : LE=0
   Return 
   NEWNAM:
   WINREQ : NEWNAM=ANS : WINOP[40,100,600,160,0,NEWNAM,"Anouncement:"]
   WINTX[NEWNAM,"Level-Packs need to have a '.lev' extension...",-1,2,4]
   WINTX[NEWNAM,"Press any key.",-1,4,0]
   WATKEY
   WINCL[NEWNAM]
   Return 
End Proc
Procedure LODFILE$[F$,PKG]
   If F$="" Then Pop Proc
   Bload F$,Start(5)
   OFFSET=0 : FIRSTLEV=118
   IN=OFFSET : LE=8 : Gosub GDAT : CODE$=OUT$ : OFFSET=OFFSET+8
   IN$=CODE$ : Gosub GVER : If OUT=False Then Pop Proc
   IN=OFFSET : LE=48 : Gosub GDAT : OFFSET=OFFSET+48
   IN=OFFSET : LE=60 : Gosub GDAT : PCK$=OUT$ : OFFSET=OFFSET+60
   LEVELS=Peek(Start(5)+116) : BONUS=Peek(Start(5)+117)
   For LEV=1 To LEVELS
      LEVELS(LEV)=1
   Next 
   OFFSET=OFFSET+(LEVELS*2325)+1
   For LV=1 To LEVELS
      For BY=1 To 2
         For BX=0 To 1
            BACK(BY,BX,LV)=Peek(OFFSET+Start(5)) : OFFSET=OFFSET+1
         Next 
      Next 
   Next 
   For LV=1 To LEVELS
      IN=OFFSET : LE=60 : Gosub GDAT : LV$(LV)=OUT$ : OFFSET=OFFSET+60
   Next 
   LASTLEV=(LEVELS*2325)+FIRSTLEV
   REDRAW[-1]
   Pop Proc
   GDAT:
   OUT$=""
   For OFFS=IN+Start(5) To IN+Start(5)+LE
      If Peek(OFFS)=0 Then Exit 
      OUT$=OUT$+Chr$(Peek(OFFS))
   Next 
   IN=0 : LE=0
   Return 
   GVER:
   OUT=False
   HEAD$=Left$(CODE$,6) : VER=Val(Right$(CODE$,2))
   If(HEAD$<>BRPACKHEAD$) and(HEAD$<>BREDITHEAD$) and(HEAD$<>BRUREGHEAD$) Then Goto BRKFILE
   If VER>Val(BREDITVER$) Then Goto NEWVER
   If HEAD$=BRUREGHEAD$ Then PKG=1
   If HEAD$=BRPACKHEAD$ Then PKG=2
   If HEAD$=BREDITHEAD$ Then PKG=3
   OUT=1
   Return 
   NEWVER:
   WINREQ : NEWVER=ANS : WINOP[40,100,600,160,0,NEWVER,"Anouncement:"]
   WINTX[NEWVER,"You need a newer editor version...",-1,2,4]
   WINTX[NEWVER,"Press any key.",-1,4,0]
   WATKEY
   WINCL[NEWVER]
   Return 
   BRKFILE:
   WINREQ : BRKFILE=ANS : WINOP[40,100,600,160,0,BRKFILE,"Anouncement:"]
   WINTX[BRKFILE,"This is NOT a breakout level file..",-1,2,4]
   WINTX[BRKFILE,"Press any key.",-1,4,0]
   WATKEY
   WINCL[BRKFILE]
   Return 
End Proc
'
'
Rem main loop and program. 
'
Change Mouse 2
ABOUT
USERGADDATA
LVFILL
Dim MD$(9)
MD=2 : Restore CMD
For I=1 To 9
   Read MD$(I)
Next 
LVCN=1 : PCK$="Another breakout level package!" : BONUS=25
BEGIN:
Screen Open 0,640,240,8,Hires
Screen To Front 0 : Screen 0 : Curs Off : Flash Off 
Wind Save 
Palette $1,$555,$222,$FFF,$C0,$F,$300,$0 : Paper 0 : Pen 3 : Cls 
Limit Mouse -9999,-9999 To 9999,9999
ED=False
WINREQ : EDMAIN=ANS : WINOP[10,10,630,230,0,EDMAIN,"BreakEdit v 0.1 main menu:"]
ZONREQ : EDQUIT=ANS : WINGAD[EDMAIN,EDQUIT,"Quit",36,24,2]
ZONREQ : EDLOAD=ANS : WINGAD[EDMAIN,EDLOAD,"Load",22,24,2]
ZONREQ : EDSAVE=ANS : WINGAD[EDMAIN,EDSAVE,"Save",50,24,2]
ZONREQ : EDED=ANS : WINGAD[EDMAIN,EDED,"Edit level",2,24,2]
ZONREQ : EDAS=ANS : WINGAD[EDMAIN,EDAS,"Save as",67,24,2]
WINTX[EDMAIN,"Level information:",2,2,4]
ZONREQ : LVNAM=ANS : ANPUT[EDMAIN,-LVNAM,LV$(LVCN),10,5,25,3,0,0,0,0]
WINTX[EDMAIN,"Name:",2,4,0]
WINTX[EDMAIN,"Level number:",2,6,0]
ZONREQ : LVNEXT=ANS : WINGAD[EDMAIN,LVNEXT,"Next",25,6,2]
ZONREQ : LVNT=ANS : WINGAD[EDMAIN,LVNT,"Next 10",32,6,2]
ZONREQ : LVPREV=ANS : WINGAD[EDMAIN,LVPREV,"Previous",42,6,2]
ZONREQ : LVPT=ANS : WINGAD[EDMAIN,LVPT,"Previous 10",52,6,2]
ZONREQ : LVDEL=ANS : WINGAD[EDMAIN,LVDEL,"Delete",65,6,2]
WINTX[EDMAIN,"Level package information:",2,8,4]
WINTX[EDMAIN,"Name:",2,10,0]
ZONREQ : PCKNAM=ANS : ANPUT[EDMAIN,-PCKNAM,PCK$,10,11,65,3,0,0,0,0]
WINTX[EDMAIN,"Level type:",2,14,0]
WINTX[EDMAIN,"Other info:",2,17,4]
WINTX[EDMAIN,"Free name mem:",2,19,0]
WINTX[EDMAIN,"Free level mem:",2,20,0]
WINTX[EDMAIN,"Free chip mem:",45,19,0]
WINTX[EDMAIN,"Bonus percentage:",50,14,0]
If Fast Free>0 Then WINTX[EDMAIN,"Free fast mem:",45,20,0]
Window EDMAIN : Paper 6 : Pen 3 : Locate 17,20 : Print Str$(Free)+"   "
Locate 60,20 : Print Str$(Chip Free)+"   "
If Fast Free>0 Then Locate 60,21 : Print Str$(Fast Free)+"   "
Locate 15,7 : Print Str$(LVCN)+"/50  "
Locate 18,21 : Print Str$(Length(5)-(50*1024))+"   "
ZONREQ : LVTYPE=ANS : WINMGAD[EDMAIN,LVTYPE,1,3,14,14,2]
ZONREQ : BOPERC=ANS : ANPUT[EDMAIN,-BOPERC,Str$(BONUS),70,15,3,2,0,0,0,0]
ZONREQ : ADVMEM=ANS : WINGAD[EDMAIN,ADVMEM,"Advanced Memory info",1,22,2]
ZONREQ : HELP=ANS : WINGAD[EDMAIN,HELP,"Help!",70,22,2] : SETHELP[EDMAIN,HELP]
Do 
   WTCLK[EDMAIN]
   If FL2=LVTYPE Then MGADUPD[LVTYPE]
   If FL2=LVNAM Then ANPUT[EDMAIN,LVNAM,LV$(LVCN),10,5,25,3,0,0,0,0] : LV$(LVCN)=OUT$
   If FL2=PCKNAM Then ANPUT[EDMAIN,PCKNAM,PCK$,10,11,65,3,0,0,0,0] : PCK$=OUT$
   If FL2=BOPERC Then ANPUT[EDMAIN,BOPERC,Str$(BONUS),70,15,3,2,0,0,0,0] : BONUS=Val(OUT$)
   If FL2=LVNEXT and LVCN<=MXLEVEL Then LVCN=LVCN+1
   If FL2=LVPREV and LVCN>1 Then LVCN=LVCN-1
   If FL2=LVNT and LVCN<=MXLEVEL Then LVCN=LVCN+10 : If LVCN>MXLEVEL Then LVCN=MXLEVEL
   If FL2=LVPT and LVCN>1 Then LVCN=LVCN-10 : If LVCN<1 Then LVCN=1
   If BONUS>100 Then BONUS=100
   If FL2=HELP Then GENHELP
   If FL2=EDSAVE or FL2=EDAS Then MGADCON[LVTYPE] : F$=Fsel$("Breakout:*.lev","Standard.lev","Select save file") : SAVFILE[F$,ANS]
   If FL2=EDLOAD Then MGADCON[LVTYPE] : F$=Fsel$("Breakout:*.lev","Standard.lev","Select load file") : LODFILE$[F$,ANS]
   Exit If FL2=EDED
   If FL2=EDQUIT Then QUIT
   NUM=LVNAM : ANPUT[GD(NUM,1),0,LV$(LVCN),GD(NUM,2),GD(NUM,3),PSP(NUM,1),PSP(NUM,2),0,0,0,0]
   NUM=PCKNAM : ANPUT[GD(NUM,1),0,PCK$,GD(NUM,2),GD(NUM,3),PSP(NUM,1),PSP(NUM,2),0,0,0,0]
   NUM=BOPERC : ANPUT[GD(NUM,1),0,Str$(BONUS),GD(NUM,2),GD(NUM,3),PSP(NUM,1),PSP(NUM,2),0,0,0,0]
   NUM=0
   Window EDMAIN : Paper 6 : Pen 3 : Locate 15,7 : Print Str$(LVCN)+"/50  "
   Locate 17,20 : Print Str$(Free)+"   "
   Locate 60,20 : Print Str$(Chip Free)+"   "
   If Fast Free>0 Then Locate 60,21 : Print Str$(Fast Free)+"   "
   Locate 18,21 : Print Str$(Length(5)-(50*1024))+"   "
Loop 
WINCL[EDMAIN]
WINREQ : EDWIN=ANS : WINOP[20,80,620,150,0,EDWIN,"Confirm!"]
ZONREQ : CANBUT=ANS : WINGAD[EDWIN,CANBUT,"Cancel",5,5,2]
ZONREQ : OKBUT=ANS : WINGAD[EDWIN,OKBUT," Ok ",65,5,2]
WINTX[EDWIN,"You have selected to edit level #"+Str$(LVCN)+":",-1,2,0]
WINTX[EDWIN,LV$(LVCN),-1,4,0]
WTCLK[EDWIN]
If FL2=CANBUT Then WINCL[EDWIN] : Goto BEGIN
If FL2<>OKBUT Then WINCL[EDWIN] : AERR=4 : GENERR
WINCL[EDWIN]
Screen Close 0
'
'
Rem Building up the screen.
'
ED=True
Screen Open 0,320,240,32,Lowres : Flash Off 
Curs Off : Cls 0 : Screen Hide 0
Wind Save 
Limit Mouse -9999,-9999 To 9999,9999
Screen Open 1,320,240,32,Lowres : Screen Hide 1
Z=1 : Z2=0
Screen 1
Cls 0
For YI=WALL(1,1)/8 To WALL(3,3)/8
   For XI=WALL(1,0)/8 To(WALL(2,2)/7)-1
      Paste Icon(XI*7),YI*8,BACK(Z,Z2,LVCN)+55
      Z=Z+1
      If Z>2 Then Z=1
   Next 
   Z2=Z2+1
   If Z2>1 Then Z2=0
Next 
Screen Copy 1,0,0,WALL(2,2),WALL(3,3) To 0,0,0
Screen 0
For I=1 To 3
   Ink 1,0 : Bar WALL(I,0),WALL(I,1) To WALL(I,2),WALL(I,3)
Next 
Paper 0 : Pen 1
Get Icon Palette : Set Red 8,0 : Set Green 8,0 : Set Blue 8,0
Set Red 23,3 : Set Green 23,0 : Set Blue 23,0
Set Red 22,3 : Set Green 22,3 : Set Blue 22,3
Set Red 7,5 : Set Green 7,5 : Set Blue 7,5
Screen Show 0
WINREQ : WIN1=ANS
WINOP[210,8,315,180,0,WIN1,"Commands"]
ZONREQ : DRW=ANS : WINGAD[WIN1,DRW,"   Draw   ",1,3,1]
ZONREQ : EXT=ANS : WINGAD[WIN1,EXT,"   Exit   ",1,5,1]
ZONREQ : SEL=ANS : WINGAD[WIN1,SEL,"  Select  ",1,7,1]
ZONREQ : PAL=ANS : WINGAD[WIN1,PAL,"  Palette ",1,9,1]
ZONREQ : COP=ANS : WINGAD[WIN1,COP,"   Copy   ",1,11,1]
ZONREQ : BAC=ANS : WINGAD[WIN1,BAC,"Background",1,13,1]
ZONREQ : CLE=ANS : WINGAD[WIN1,CLE,"   Clear  ",1,15,1]
ZONREQ : SET=ANS : WINGAD[WIN1,SET," Set Brick",1,17,1]
ZONREQ : FIL=ANS : WINGAD[WIN1,FIL,"   Fill   ",1,19,1]
WINREQ : WIN2=ANS
WINOP[210,190,315,230,0,WIN2,"Brick"]
Make Icon Mask 
Ink 0,0 : Bar 220,195 To 295,215
Paste Icon 251,201,1
CMD$=MD$(MD) : Ink 31,0 : Text 216,182,CMD$
LODLEVEL[LVCN]
DRWLEVEL[LVCN]
'
Rem Editor.. 
'
'
I=0
HITS=1 : BRICK=1 : BRICKTYPE=1 : SCORE=50
While I<>69
   I$=Inkey$ : I=Scancode : MSZON
   Window 1 : Locate 0,0 : Print ZNIN
   If I$="s" Then SELECTBRICK : Ink 0,0 : Bar 220,195 To 295,220 : Paste Icon 251,201,BRICK
   If I$="b" Then SETBRICK : Ink 0,0 : Bar 220,195 To 295,220 : Paste Icon 251,201,BRICK
   If I$="B" Then SETBACK
   If ZNIN=EXT+(M_WIN+1) and Mouse Click Then Exit 
   If ZNIN=SEL+(M_WIN+1) and Mouse Click Then SELECTBRICK : Ink 0,0 : Bar 220,195 To 295,220 : Paste Icon 251,201,BRICK
   If ZNIN=SET+(M_WIN+1) and Mouse Click Then SETBRICK : Ink 0,0 : Bar 220,195 To 295,220 : Paste Icon 251,201,BRICK
   If(Mouse Key=1) Then _DRAWBRICK
   If(Mouse Key=2) Then _DELBRICK
Wend 
WINCL[WIN1]
WINCL[WIN2]
ED=False
Screen Close 1 : Screen Close 0
Screen Open 0,640,240,8,Hires
Screen To Front 0 : Screen 0 : Curs Off : Flash Off 
Wind Save 
Palette $1,$555,$222,$FFF,$C0,$F,$300,$0 : Paper 0 : Pen 3 : Cls 
Limit Mouse -9999,-9999 To 9999,9999
WINREQ : EDWIN=ANS : WINOP[20,80,620,150,0,EDWIN,"Confirm!"]
ZONREQ : CANBUT=ANS : WINGAD[EDWIN,CANBUT,"Cancel",5,5,2]
ZONREQ : OKBUT=ANS : WINGAD[EDWIN,OKBUT," Ok ",65,5,2]
WINTX[EDWIN,"Keep level #"+Str$(LVCN)+" in memory?",-1,2,0]
WTCLK[EDWIN]
If FL2=CANBUT Then WINCL[EDWIN] : Goto BEGIN
WINTX[EDWIN,"Please wait, saving level....",-1,4,0]
SAVLEV[LVCN]
Ink 0,0 : Window EDWIN : Wind Close : RSTZN[EDWIN,EDWIN,1]
Screen Close 0
Goto BEGIN
Rem Commands data  
'
'
CMD:
Data "Draw","Exit","Select","Palette","Copy","Background"
Data "Clear","Set Brick","Fill"
'
Rem Closing down.. 
'
Erase 2
Erase 5
'
'
Rem End of program.  
'
End 
