home *** CD-ROM | disk | FTP | other *** search
/ Amiga Format 67 / af067a.adf / ACCESS.DMS / ACCESS.adf / Resource_Bank_Maker.AMOS / Resource_Bank_Maker.amosSourceCode
AMOS Source Code  |  1993-03-16  |  28KB  |  1,092 lines

  1. ' ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  2. '
  3. ' AMOSPro Resource Bank Maker V1.1 
  4. '
  5. '
  6. ' Default bank number is 16. Change the "BK" variable for another bank 
  7. ' Maximum bank size is in variable "BMAX"
  8. '
  9. ' By Fran�ois Lionet 
  10. '
  11. ' (c) 1992 Europress Software Ltd. 
  12. '
  13. ' ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  14. Set Buffer 32
  15.  
  16. VER$="1.1"
  17.  
  18. Global DB$,VER$
  19. Global YDI,QUIT
  20. Global BNAME$
  21. Global PUMX,NPU,CPU,PNAME$,PULAST,PUPICS
  22. Global STMX,NST
  23. Global MX,MY,MK,MZ,MS
  24. Global BXOLD,BXINK,FL
  25. Global BXX,BXY,BXSX,BXSY
  26. Global BKPOS,BKCHANGE,BK,TBNK,BKCHUNKS,BGRB,BMAX
  27.  
  28. ' Maximum number of graphic elements 
  29. PUMX=256
  30. Dim PUX(PUMX),PUY(PUMX),PUSX(PUMX),PUSY(PUMX),PU$(PUMX),PUN(PUMX)
  31. Global PUX(),PUY(),PUSX(),PUSY(),PU$(),PUN()
  32.  
  33. ' Maximum number of strings
  34. STMX=256
  35. Dim ST$(STMX)
  36. Global ST$()
  37.  
  38. ' Default bank number
  39. BK=16
  40. ' Maximum bank size (in K) 
  41. BMAX=64
  42.  
  43. ' Temporary bank 
  44. TBNK=BK+2
  45. C$=Command Line$
  46.  
  47. ' Memory check 
  48. ' ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
  49. If Chip Free+Fast Free<(BMAX+32)*1024 : LOWMEM : End If 
  50.  
  51. ' Initialisation 
  52. ' ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
  53. Erase All 
  54. INIT_SCREEN
  55. BANK_NEW
  56. If C$="GRAB" : MN_GRAB : End If 
  57. MN_MAIN[C$]
  58. ' Main Menu
  59. ' ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
  60. Procedure MN_MAIN[C$]
  61.  
  62.    Do 
  63.       If BGRB
  64.          A$="-GRABBED- "
  65.       Else 
  66.          A$=""
  67.       End If 
  68.       If BNAME$=""
  69.          Vdialog$(1,0)=A$+"Unnamed"
  70.       Else 
  71.          Vdialog$(1,0)=A$+Right$(BNAME$,24-Len(A$))
  72.       End If 
  73.  
  74.       D=Dialog Run(1,1)
  75.  
  76.       If C$="DEFAULT_RESOURCE"
  77.          MN_AUTOMATIC[Resource$(0)+"AMOSPro.Default_Resource"]
  78.       End If 
  79.       If C$="EDITOR_RESOURCE"
  80.          MN_AUTOMATIC[Resource$(0)+"AMOSPro.Editor_Resource"]
  81.       End If 
  82.       If C$="MONITOR_RESOURCE"
  83.          MN_AUTOMATIC[Resource$(0)+"AMOSPro.Monitor_Resource"]
  84.       End If 
  85.       Repeat 
  86.  
  87.          Multi Wait 
  88.          D=Dialog(1)
  89.          On D Proc MN_QUIT,MN_QUIT,MN_NEW,MN_LOAD,MN_SAVE,MN_SAVEAS,MN_GRAPHIC,MN_STRING,MN_GRAB
  90.          OLDD=D
  91.  
  92.       Until QUIT
  93.       QUIT=0
  94.  
  95.    Loop 
  96. End Proc
  97. Procedure MN_QUIT
  98.    
  99.    ' Quit the program 
  100.    
  101.    D=2
  102.    If BKCHANGE
  103.       D=Dialog Box(DB$,1,"Quit resource bank maker. Sure?")
  104.    End If 
  105.    
  106.    If D=2
  107.       
  108.       If BGRB
  109.          D=Dialog Box(DB$,1,"Copy resource bank to previous program?")
  110.          If D=2
  111.             BNK_CREATE
  112.             If Param>=0
  113.                Bsend BK
  114.             Else 
  115.                D=Dialog Box(DB$,2,"Out of memory, cannot grab bank!")
  116.                Pop Proc
  117.             End If 
  118.          Else 
  119.             D=Dialog Box(DB$,1,"Your bank will be lost if you quit. Quit anyway?")
  120.             If D<>2 : Pop Proc : End If 
  121.          End If 
  122.       End If 
  123.       
  124.       Dialog Close 1
  125.       Screen Close 0 : If PNAME$<>"" : Screen Close 1 : End If 
  126.       Erase BK : Edit 
  127.       
  128.    End If 
  129.    
  130. End Proc
  131. Procedure MN_NEW
  132.  
  133.    ' Create a new bank
  134.  
  135.    D=2
  136.    If BKCHANGE
  137.       D=Dialog Box(DB$,1,"Create a new bank, and loose current?")
  138.    End If 
  139.    If D=2 : BANK_NEW : QUIT=-1 : End If 
  140. End Proc
  141. Procedure MN_LOAD
  142.    
  143.    Dialog Freeze 
  144.    
  145.    D=2
  146.    If BKCHANGE
  147.       D=Dialog Box(DB$,1,"Load a new bank, and loose current?")
  148.    End If 
  149.    
  150.    If D=2
  151.       
  152.       BANK_NEW : QUIT=-1
  153.       
  154.       F$=Fsel$("*.Abk","","Please choose resource bank.")
  155.       If F$="" : Pop Proc : End If 
  156.       
  157.       Trap Load F$,BK
  158.  
  159.       If Errtrap=0
  160.          A$="" : If Length(BK) : A$=Peek$(Start(BK)-8,8) : End If 
  161.          If A$<>"Resource"
  162.             D=Dialog Box(DB$,2,"This bank is not a resource bank.")
  163.          Else 
  164.             BNK_DIGEST[Start(BK)]
  165.             If Param : BNAME$=F$ : End If 
  166.          End If 
  167.       Else 
  168.          D=Dialog Box(DB$,2,"Disc error: could not load bank.")
  169.       End If 
  170.       If BGRB : BKCHANGE=1 : End If 
  171.    End If 
  172.    Erase BK : Dialog Unfreeze : QUIT=-1
  173.    
  174. End Proc
  175. Procedure BNK_DIGEST[AB]
  176.  
  177.    Do 
  178.  
  179.       BKCHUNKS=Deek(AB) : DD=2 : If BKCHUNKS=0 : BKCHUNKS=2 : DD=0 : End If 
  180.  
  181.       ' Grab the graphic data
  182.       AG=Leek(AB+DD)
  183.       If AG
  184.          AG=AB+AG : NP=Deek(AG) : AP=AG+2+NP*4
  185.          Add AP,4+32*2 : L=Deek(AP) : PNAME$=Peek$(AP+2,L)
  186.  
  187.          P=0 : CPOS=0
  188.          Repeat 
  189.             A=Leek(AG+P*4+2)
  190.             If A
  191.                AP=AG+A
  192.                PUX(CPOS)=Deek(AP+4)*8 : PUY(CPOS)=Deek(AP+6)
  193.                PUSX(CPOS)=Deek(AP+8)*8 : PUSY(CPOS)=Deek(AP+10)*Deek(AP+12)
  194.                PUN(CPOS)=1
  195.                If Deek(AP-2)=$ABCD
  196.                   T=Peek(AP-3) : K=Peek(AP-4) : PUN(CPOS)=T
  197.                   If T=3
  198.                      If K=0 : PUSX(CPOS)=PUSX(CPOS)*3 : End If 
  199.                      If K=1 : PUSY(CPOS)=PUSY(CPOS)*3 : PUN(CPOS)=-PUN(CPOS) : End If 
  200.                      Add P,2
  201.                   End If 
  202.                   If T=9 : PUSX(CPOS)=PUSX(CPOS)*3 : PUSY(CPOS)=PUSY(CPOS)*3 : Add P,8 : End If 
  203.                End If 
  204.             End If 
  205.             Inc CPOS : Inc P
  206.          Until P>=NP
  207.       End If 
  208.  
  209.       ' Grab the strings 
  210.       A=Leek(AB+4+DD)
  211.       If A
  212.          AP=AB+A : ST=0
  213.          For ST=0 To STMX
  214.             L=Peek(AP+1) : Exit If L=$FF
  215.             ST$(ST)=Peek$(AP+2,L)
  216.             AP=AP+2+L
  217.          Next 
  218.       End If 
  219.  
  220.       ' Keep the other data zones in safe places 
  221.       If BKCHUNKS>2
  222.          For B=2 To BKCHUNKS-1
  223.             A=Leek(AB+DD+B*4)
  224.             If A
  225.                AP=AB+A
  226.                L=Leek(AB+DD+BKCHUNKS*4+B*4)
  227.                Reserve As Work TBNK+B,L
  228.                Copy AP,AP+L To Start(TBNK+B)
  229.             End If 
  230.          Next 
  231.       End If 
  232.  
  233.       ' Load the picture 
  234.       If PNAME$<>""
  235.          Repeat 
  236.             Trap Load Iff PNAME$,1
  237.             If Errtrap
  238.                PNAME$=Fsel$("*.Iff","","Can't load the default picture","Please enter correct pathname")
  239.                If PNAME$=""
  240.                   BANK_NEW
  241.                   D=Dialog Box(DB$,2,"Sorry, load aborted!")
  242.                   Exit 2
  243.                End If 
  244.             End If 
  245.          Until Errtrap=0
  246.          Screen To Back 1 : Screen 0
  247.       End If 
  248.  
  249.       F=-1 : Exit 
  250.  
  251.    Loop 
  252.  
  253. End Proc[F]
  254. Procedure MN_SAVE
  255.  
  256.    Dialog Freeze 
  257.  
  258.    BNK_CREATE
  259.  
  260.    If Param>0
  261.  
  262.       If BNAME$=""
  263.          F$=Fsel$("*.Abk","","Please choose a name.","The name should finish by '.Abk'")
  264.          If F$="" : Goto _END : End If 
  265.          BNAME$=F$
  266.       End If 
  267.  
  268.       If BNAME$<>""
  269.          Trap Save BNAME$,BK
  270.          If Errtrap=0
  271.             BKCHANGE=0
  272.          Else 
  273.             D=Dialog Box(DB$,2,"Disc error: could not save bank.")
  274.          End If 
  275.       End If 
  276.  
  277.    Else If Param=0
  278.  
  279.       D=Dialog Box(DB$,2,"Nothing to save!")
  280.  
  281.    Else 
  282.  
  283.       D=Dialog Box(DB$,2,"Out of memory!")
  284.  
  285.    End If 
  286.  
  287.    _END: Erase BK : Dialog Unfreeze : QUIT=-1 : Pop Proc
  288.  
  289. End Proc
  290. Procedure BNK_CREATE
  291.  
  292.    LMAX=BMAX*1024+Length(TBNK)+Length(TBNK+1)
  293.    Reserve As Data BK,LMAX
  294.  
  295.    ' Header 
  296.    Poke$ Start(BK)-8,"Resource"
  297.    AB=Start(BK) : EB=Start(BK)+LMAX
  298.    AL=AB+2+BKCHUNKS*4 : AP=AL+BKCHUNKS*4
  299.    Doke AB,BKCHUNKS
  300.  
  301.    ' Grab the graphic part  
  302.    PU_ARRAY
  303.    If PULAST>=0
  304.       Screen Hide 0
  305.       AG=AP : Loke AB+2,AG-AB
  306.       Doke AG,PUPICS : AP=AG+2+PUPICS*4
  307.  
  308.       Screen 1
  309.       Doke AP,Screen Colour : Doke AP+2,Deek(Screen Base+72) : Add AP,4
  310.       For C=0 To 31 : Doke AP,Colour(C) : Add AP,2 : Next 
  311.       Doke AP,Len(PNAME$) : Poke$ AP+2,PNAME$
  312.       AP=AP+Len(PNAME$)+2 : AP=AP+AP mod 2
  313.  
  314.       PN=0
  315.       For P=0 To PULAST
  316.          If PUN(P)
  317.             If PUN(P)>0 : Poke AP,0 : Poke AP+1,PUN(P) : End If 
  318.             If PUN(P)<0 : Poke AP,1 : Poke AP+1,-PUN(P) : End If 
  319.             Doke AP+2,$ABCD : Add AP,4
  320.             If PUN(P)=1
  321.                X=PUX(P) : Y=PUY(P) : SX=PUSX(P) : SY=PUSY(P) : Gosub BK_GRAB
  322.             Else If PUN(P)=3
  323.                SX=PUSX(P)/3 : Y=PUY(P) : SY=PUSY(P)
  324.                For XX=0 To 2 : X=PUX(P)+XX*SX : Gosub BK_GRAB : Next 
  325.             Else If PUN(P)=-3
  326.                SY=PUSY(P)/3 : X=PUX(P) : SX=PUSX(P)
  327.                For YY=0 To 2 : Y=PUY(P)+YY*SY : Gosub BK_GRAB : Next 
  328.             Else If PUN(P)=9
  329.                SX=PUSX(P)/3 : SY=PUSY(P)/3 : N=0
  330.                For YY=0 To 2 : For XX=0 To 2
  331.                      X=PUX(P)+XX*SX : Y=PUY(P)+YY*SY : Gosub BK_GRAB
  332.                Next : Next 
  333.             End If 
  334.          End If 
  335.       Next 
  336.       Loke AL,AP-AG
  337.       Screen Show 0 : Screen 0
  338.  
  339.    End If 
  340.  
  341.    ' Grab the text part 
  342.    For S=0 To STMX
  343.       If Len(ST$(S))
  344.          SM=S : Add LS,Len(ST$(S))
  345.       End If 
  346.    Next 
  347.    If LS
  348.       AG=AP : Loke AB+2+4,AP-AB
  349.       For S=0 To SM
  350.          Poke AP,0
  351.          Poke AP+1,Len(ST$(S))
  352.          Poke$ AP+2,ST$(S)
  353.          Add AP,2+Len(ST$(S))
  354.       Next 
  355.       Poke AP,0 : Poke AP+1,$FF : Add AP,2
  356.       Add AP,AP mod 2
  357.       Loke AL+4,AP-AG
  358.    End If 
  359.  
  360.    ' Restore the data zones 
  361.    If BKCHUNKS>2
  362.       For B=2 To BKCHUNKS-1
  363.          If Length(TBNK+B)
  364.             Loke AB+2+B*4,AP-AB
  365.             Loke AL+B*4,Length(TBNK+B)
  366.             Copy Start(TBNK+B),Start(TBNK+B)+Length(TBNK+B) To AP
  367.             Add AP,Length(TBNK+B)
  368.             Add AP,AP mod 2
  369.          Else 
  370.             Loke AB+2+B*4,0 : Loke AL+B*4,0
  371.          End If 
  372.       Next 
  373.    End If 
  374.  
  375.    ' Schink to the correct size 
  376.    L=AP-Start(BK) : Bank Shrink BK To L
  377.    Screen Show 0 : Screen 0
  378.    Pop Proc[L]
  379.  
  380.    BK_GRAB:
  381.    _BOX[X,Y,X+SX,Y+SY] : Wait 2 : _BOX[0,0,0,0]
  382.    Loke AG+2+PN*4,AP-AG
  383.    Pack 1 To BK+1,X,Y,X+SX,Y+SY
  384.    If AP+Length(BK+1)>=EB : Stop : End If 
  385.    Copy Start(BK+1),Start(BK+1)+Length(BK+1) To AP
  386.    AP=AP+Length(BK+1) : AP=(AP+1) and $FFFFFFFE
  387.    Erase BK+1
  388.    Inc PN : Return 
  389.  
  390. End Proc[L]
  391. Procedure MN_SAVEAS
  392.    N$=BNAME$ : BNAME$=""
  393.    MN_SAVE
  394.    If BNAME$="" : BNAME$=N$ : End If 
  395.    QUIT=-1
  396. End Proc
  397. Procedure MN_GRAB
  398.  
  399.    Dialog Freeze 
  400.    If Prg Under
  401.       D=2
  402.       If BKCHANGE
  403.          D=Dialog Box(DB$,1,"Grab a new bank, and loose current?")
  404.       End If 
  405.  
  406.       If D=2
  407.  
  408.          BANK_NEW : BGRB=-1
  409.          If Blength(BK)
  410.             If Peek$(Bstart(BK)-8,8)="Resource"
  411.                BNK_DIGEST[Bstart(BK)]
  412.             End If 
  413.          End If 
  414.  
  415.          If BGRB=0 : D=Dialog Box(DB$,2,"No bank to grab!") : End If 
  416.  
  417.       End If 
  418.    End If 
  419.    Dialog Unfreeze : QUIT=-1
  420.  
  421. End Proc
  422. Procedure MN_AUTOMATIC[F$]
  423.  
  424.    Trap Load F$,BK
  425.    D=Dialog Box(DB$,1,"Update of "+F$+"?")
  426.    If D=2
  427.       If Errtrap=0
  428.          BNK_DIGEST[Start(BK)]
  429.          If Param
  430.             BNAME$=F$
  431.             BNK_CREATE
  432.             If Param>0
  433.                Save BNAME$,BK
  434.             Else If Param=0
  435.                D=Dialog Box(DB$,2,"Nothing to save!")
  436.             Else 
  437.                D=Dialog Box(DB$,2,"Out of memory!")
  438.             End If 
  439.          End If 
  440.       Else 
  441.          D=Dialog Box(DB$,2,"Cannot load resource bank!")
  442.       End If 
  443.    End If 
  444.    BANK_NEW : BGRB=0 : MN_QUIT
  445. End Proc
  446. ' String Edition 
  447. ' ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  448. Procedure MN_STRING
  449.    POS=0
  450.    Do 
  451.       Vdialog(1,3)=Array(ST$(0))
  452.       Vdialog(1,4)=POS
  453.       D=Dialog Run(1,2)
  454.       
  455.       Do 
  456.          Multi Wait 
  457.          D=Dialog(1) : Exit If D=1,2
  458.          POS=Vdialog(1,4)
  459.          If D=6
  460.             MN_PRINT : Exit 
  461.          End If 
  462.          If D=5
  463.             A=Dialog Box(DB$,1,"Erase all strings, sure?")
  464.             If A=2 : For S=0 To STMX : ST$(S)="" : Next : Exit : End If 
  465.          End If 
  466.          
  467.          If D=4
  468.             MN_EDIT[Rdialog(1,4)] : Exit 
  469.          End If 
  470.          
  471.          OLDD=D
  472.          
  473.       Loop 
  474.       
  475.    Loop 
  476.    QUIT=1
  477.    
  478. End Proc
  479. Procedure MN_EDIT[ST]
  480.  
  481.    Vdialog(1,0)=ST
  482.    Vdialog$(1,1)=ST$(ST)
  483.    D=Dialog Run(1,3)
  484.    A$=Rdialog$(1,10)
  485.  
  486.    If D=2 : ST$(ST)=Rdialog$(1,10) : End If 
  487.    If D=3
  488.       If ST<STMX
  489.          For S=STMX-1 To ST Step -1
  490.             ST$(S+1)=ST$(S)
  491.          Next 
  492.       End If 
  493.       ST$(ST)=Rdialog$(1,10)
  494.    End If 
  495.    If D=4
  496.       If ST<STMX
  497.          For S=ST To STMX-1
  498.             ST$(S)=ST$(S+1)
  499.          Next 
  500.       End If 
  501.       ST$(STMX)=""
  502.    End If 
  503.    Inc BKCHANGE
  504.  
  505. End Proc
  506. Procedure BANK_NEW
  507.  
  508.    ' Erase the current bank from memory 
  509.    BNAME$=""
  510.    For S=0 To STMX : ST$(S)="" : Next 
  511.    For P=0 To PUMX : PU$(P)="" : PUN(P)=0 : Next 
  512.    If PNAME$<>"" : PNAME$="" : Screen Close 1 : End If 
  513.    BKCHANGE=0 : BKCHUNKS=2
  514.    Erase TBNK : Erase TBNK+1
  515. End Proc
  516. ' Graphic Element  
  517. ' ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~  
  518. Procedure MN_GRAPHIC
  519.  
  520.    If PNAME$=""
  521.       MN_GLOAD
  522.       If PNAME$="" : QUIT=-1 : Pop Proc : End If 
  523.    End If 
  524.  
  525.    CPU=0
  526.    Vdialog(1,11)=Array(PU$(0))
  527.    Vdialog(1,12)=0
  528.    D=Dialog Run(1,4)
  529.    Do 
  530.       PU_ARRAY
  531.       Dialog Update 1,12,,CPU,PULAST+2
  532.  
  533.       Repeat 
  534.          Multi Wait 
  535.  
  536.          ' Flash the current element  
  537.          CPU=Rdialog(1,12)
  538.          If CPU>=0
  539.             If PUX(CPU)>=0
  540.                Add FL,1,0 To 10
  541.                If FL=1
  542.                   _BOX[PUX(CPU),PUY(CPU),PUX(CPU)+PUSX(CPU),PUY(CPU)+PUSY(CPU)]
  543.                End If 
  544.                If FL=5 : _BOX[0,0,0,0] : End If 
  545.             End If 
  546.          End If 
  547.  
  548.          D=Dialog(1) : Exit If D=1,2
  549.          If D : _BOX[0,0,0,0] : End If 
  550.          On D-1 Proc MN_QUIT,MN_GLOAD,MN_GELEMENT,MN_GHLINE,MN_GBOX,MN_GDEL,MN_GCLEAR,MN_GVLINE
  551.  
  552.          OLDD=D
  553.  
  554.       Until QUIT
  555.       QUIT=0
  556.    Loop 
  557.    QUIT=1
  558.  
  559. End Proc
  560. Procedure MN_GLOAD
  561.  
  562.    F$=Fsel$("**","","Please choose an IFF picture")
  563.    If F$<>""
  564.       Load Iff F$,1 : Screen To Front 0 : Screen 0
  565.       PNAME$=F$
  566.       Inc BKCHANGE
  567.    End If 
  568.  
  569. End Proc
  570. Procedure MN_GDEL
  571.    MN_GSELECT
  572.    If Param
  573.       If CPU<=PULAST
  574.          For P=CPU To PUMX-1
  575.             PUX(P)=PUX(P+1) : PUY(P)=PUY(P+1)
  576.             PUSX(P)=PUSX(P+1) : PUSY(P)=PUSY(P+1)
  577.             PUN(P)=PUN(P+1) : PU$(P)=PU$(P+1)
  578.          Next 
  579.          PUN(PUMX)=0
  580.          Inc BKCHANGE
  581.       End If 
  582.    End If 
  583.    QUIT=-1
  584. End Proc
  585. Procedure MN_GELEMENT
  586.    MN_GGRAB[1]
  587. End Proc
  588. Procedure MN_GHLINE
  589.    MN_GGRAB[3]
  590. End Proc
  591. Procedure MN_GVLINE
  592.    MN_GGRAB[-3]
  593. End Proc
  594. Procedure MN_GBOX
  595.    MN_GGRAB[9]
  596. End Proc
  597. Procedure MN_GGRAB[T]
  598.  
  599.    MN_GPIC
  600.    If Param
  601.       MN_GSELECT
  602.       If Param
  603.          Dialog Freeze 
  604.          Screen Hide 0 : _GRABIT[T]
  605.          Screen Show 0 : Screen To Front 0 : Screen 0
  606.          If Param
  607.             If CPU<PUMX
  608.                If CPU<=PULAST
  609.                   For P=PUMX To CPU+1 Step -1
  610.                      PUX(P)=PUX(P-1) : PUY(P)=PUY(P-1)
  611.                      PUSX(P)=PUSX(P-1) : PUSY(P)=PUSY(P-1)
  612.                      PUN(P)=PUN(P-1) : PU$(P)=PU$(P-1)
  613.                   Next 
  614.                End If 
  615.             End If 
  616.             PUX(CPU)=BXX : PUY(CPU)=BXY
  617.             PUSX(CPU)=BXSX : PUSY(CPU)=BXSY
  618.             PUN(CPU)=T
  619.             QUIT=-1
  620.             Inc BKCHANGE
  621.          End If 
  622.          Dialog Unfreeze 
  623.       End If 
  624.    End If 
  625.  
  626. End Proc
  627. Procedure PU_ARRAY
  628.  
  629.    For P=0 To PUMX : PU$(P)="" : Next 
  630.  
  631.    PUPICS=1 : PULAST=-1
  632.    For P=0 To PUMX
  633.       If PUN(P)
  634.          A$=Str$(PUPICS) : PU$(P)=A$+Space$(4-Len(A$))
  635.          If PUN(P)=1 : A$=" - Element:" : End If 
  636.          If PUN(P)=3 : A$=" - H. Line:" : End If 
  637.          If PUN(P)=-3 : A$=" - V. Line:" : End If 
  638.          If PUN(P)=9 : A$=" - Box    :" : End If 
  639.          PU$(P)=PU$(P)+A$+Str$(PUSX(P))+" x"+Str$(PUSY(P))
  640.          Add PUPICS,Abs(PUN(P))
  641.          PULAST=P
  642.       End If 
  643.    Next 
  644.    A$=Str$(PUPICS) : PU$(PULAST+1)=A$+Space$(4-Len(A$))+" - New Element"
  645.    Dec PUPICS
  646.  
  647. End Proc
  648. Procedure MN_GCLEAR
  649.  
  650.    D=2
  651.    If PULAST>=0
  652.       D=Dialog Box(DB$,1,"Clear all graphic elements, sure?")
  653.    End If 
  654.  
  655.    If D=2
  656.       NPU=0
  657.       For N=0 To PUMX
  658.          PU$(N)="" : PUN(N)=0
  659.       Next 
  660.       P=-1
  661.    End If 
  662.    QUIT=-1
  663.    Inc BKCHANGE
  664.  
  665. End Proc[P]
  666. Procedure MN_GSELECT
  667.  
  668.    P=-1
  669.    If CPU<0
  670.       D=Dialog Box(DB$,2,"You must select an element in the list first!")
  671.       P=0
  672.    End If 
  673.  
  674. End Proc[P]
  675. Procedure MN_GPIC
  676.  
  677.    P=-1
  678.    If PNAME$=""
  679.       D=Dialog Box(DB$,2,"You must load a picture first!")
  680.       P=0
  681.    End If 
  682.  
  683. End Proc[P]
  684. Procedure _GRABIT[T]
  685.  
  686.    ' Prepare screen 1 
  687.    Screen 1 : Clip 
  688.    Gr Writing 2 : PDR=1 : O=0 : OMX=-1
  689.    Set Pattern 0 : Set Paint 0
  690.    _BOX[0,0,0,0]
  691.  
  692.    ' Open small info screen 
  693.    Screen Open 2,640,8,2,Hires
  694.    Curs Off : Palette $55A,$FFF : Screen Display 2,,320,,
  695.    If T=1 : T$="     Grabbing a simple element" : End If 
  696.    If T=3 : T$="     Grabbing an horizontal line" : End If 
  697.    If T=-3 : T$="     Grabbing a vertical line" : End If 
  698.    If T=9 : T$="     Grabbing a box" : End If 
  699.    ' Main loop  
  700.    Repeat 
  701.       Screen 1 : _MOUSE
  702.       MX=(MX+3) and $FFFFFFF8
  703.  
  704.       If Inkey$=" " : Add BXINK,1,0 To Screen Colour : End If 
  705.  
  706.       ' Change the position of the info screen 
  707.       If MY>150
  708.          Screen Display 2,,45,,
  709.       Else 
  710.          Screen Display 2,,245,,
  711.       End If 
  712.  
  713.       ' Call the proper display routine  
  714.       If MS=1
  715.          If MX<>OMX or MY<>OMY or MK<>OMK
  716.             On PDR Gosub GB1,GB2,GB3
  717.             OMX=MX : OMY=MY : OMK=MK
  718.          End If 
  719.       End If 
  720.  
  721.       ' Wait for the end 
  722.    Until PDR=0 or PDR=4
  723.  
  724.    ' Something to erase?
  725.    _BOX[0,0,0,0]
  726.  
  727.    ' Close the info screen  
  728.    Screen Close 2 : F=0
  729.    If PDR=4
  730.       BXX=X1 : BXY=Y1 : BXSX=SX : BXSY=SY
  731.       F=-1
  732.    End If 
  733.    Repeat : _MOUSE : Until MK=0
  734.    Goto _END
  735.  
  736.    ' Step 1 : set the beginning of the box
  737.    GB1:
  738.    X1=MX : Y1=MY : X2=X1 : Y2=Y1
  739.    Screen 2 : Centre T$+" - X:"+Str$(X1)+" - Y:"+Str$(Y1)+"   "
  740.    If MK=1 : PDR=2 : End If 
  741.    If MK=2 : PDR=0 : End If 
  742.    Return 
  743.  
  744.    ' Step 2 : open the box  
  745.    GB2:
  746.    If MX>X1 and MY>Y1
  747.       If T=1
  748.          X2=MX : Y2=MY : _BOX[X1,Y1,X2,Y2]
  749.       End If 
  750.       If T=3
  751.          If MX-X1>=24
  752.             X2=X1+((MX-X1)/24)*24 : Y2=MY
  753.             _BOX[X1,Y1,X2,Y2]
  754.          End If 
  755.       End If 
  756.       If T=-3
  757.          If MY-Y1>=3
  758.             Y2=Y1+((MY-Y1)/3)*3 : X2=MX
  759.             _BOX[X1,Y1,X2,Y2]
  760.          End If 
  761.       End If 
  762.       If T=9
  763.          If MX-X1>=24 and MY-Y1>3
  764.             X2=X1+((MX-X1)/24)*24 : Y2=Y1+((MY-Y1)/3)*3
  765.             _BOX[X1,Y1,X2,Y2]
  766.          End If 
  767.       End If 
  768.    End If 
  769.    Screen 2
  770.    Centre T$+" - X:"+Str$(X1)+" - Y:"+Str$(Y1)+" / SX:"+Str$(X2-X1)+" - SY:"+Str$(Y2-Y1)+"  "
  771.    If MK=0
  772.       PDR=3 : SX=X2-X1 : SY=Y2-Y1
  773.    End If 
  774.    Return 
  775.    '
  776.    ' Etape 3 : positionnement de la boite 
  777.    GB3:
  778.    X2=MX : Y2=MY : X1=MX-SX : Y1=MY-SY
  779.    If X1<0 : X1=0 : X2=SX : End If 
  780.    If Y1<0 : Y1=0 : Y2=SY : End If 
  781.    _BOX[X1,Y1,X2,Y2]
  782.    Screen 2
  783.    Centre T$+" - X:"+Str$(X1)+" - Y:"+Str$(Y1)+" / SX:"+Str$(SX)+" - SY:"+Str$(SY)+"  "
  784.    If MK=1 : PDR=4 : End If 
  785.    If MK=2
  786.       PDR=1 : Cls : _BOX[0,0,0,0]
  787.       While Mouse Key : Wend 
  788.    End If 
  789.    Return 
  790.    '
  791.    _END:
  792. End Proc[F]
  793. Procedure _BOX[X1,Y1,X2,Y2]
  794.  
  795.    ' Draw the box 
  796.    S=Screen : Screen 1
  797.    If BXOLD : Put Block 2 : Del Block 2 : BXOLD=0 : End If 
  798.    If X2>X1+1 and Y2>Y1+1
  799.       X=X1 and $FFFFFFF0
  800.       XX=Min(Screen Width,(X2+16) and $FFFFFFF0)
  801.       Gr Writing 0 : Set Pattern 2 : Set Paint 1 : Ink BXINK,BXINK,BXINK
  802.       Get Block 2,X,Y1,XX-X,Y2-Y1+1
  803.       Bar X1,Y1 To X2-1,Y2-1 : BXOLD=-1
  804.    End If 
  805.    Screen S
  806. End Proc
  807. Procedure _MOUSE
  808.  
  809.    ' Mouse input
  810.    Multi Wait 
  811.    MX=X Screen(X Mouse) : MY=Y Screen(Y Mouse)
  812.    MZ=Mouse Zone : MK=Mouse Key : MS=Mouse Screen
  813. End Proc
  814. Procedure INIT_SCREEN
  815.    
  816.    Restore DBL
  817.    Repeat 
  818.       Read A$ : DB$=DB$+A$
  819.    Until A$=""
  820.    
  821.    ESX=640 : ESY=88 : YDI=150
  822.    Screen Open 0,ESX,ESY,8,Hires
  823.    Screen Display 0,,YDI,,
  824.    Curs Off : Flash Off : Cls 0
  825.    
  826.    GRB_EDITOR_PALETTE
  827.    Paper 0 : Pen 1
  828.    Limit Mouse 96,35 To 530,312
  829.    
  830.    On Error Goto ERR
  831.    Dialog Open 1,DB$,32
  832.    Pop Proc
  833.    
  834.    ERR: Print Mid$(DB$,Edialog,80) : Wait Key : End 
  835.    
  836.    ' Definition of quick-run dialog boxes 
  837.    DBL:
  838.    Data "SVar   2,'Ok';"
  839.    Data "SVar   3,'Cancel';"
  840.    Data "SIze   1VA TW 160+,64;"
  841.    Data "BAse   SWidth SX -2/,SHeight SY- 2/;"
  842.    Data "IF     0VA 0\; [SAve   1;]"
  843.    Data "RBox   0,0,SX,SY,0;"
  844.    Data "CTxt   16,8,SX 16-,32,1,1VA;"
  845.    Data "IF     0VA 1=;"
  846.    Data "["
  847.    Data "       BJ 1,16,SY 24-,64,16,3VA; KY 27,0;"
  848.    Data "       BJ 2,SX 80-,SY 24-,64,16,2VA; KY 13,0;"
  849.    Data "       RUn    0,3;"
  850.    Data "]"
  851.    Data "IF     0VA 2=;"
  852.    Data "["
  853.    Data "       BJ 1,SX 80-,SY 24-,64,16,3VA; KY $FF,0;"
  854.    Data "       RUn    0,3;"
  855.    Data "]"
  856.    Data "EXit;"
  857.    
  858.    ' Definition of the first menu page
  859.    Data "LA 1;"
  860.    Data "SVar   0,'Resource Bank Creator V"+VER$+" - Current bank : ' 0VA !;"
  861.    Data "SVar   1,'Quit';"
  862.    Data "SVar   2,'Create a new bank';"
  863.    Data "SVar   3,'Load a bank';"
  864.    Data "SVar   4,'Save Bank';"
  865.    Data "SVar   5,'Save Bank As';"
  866.    Data "SVar   6,'Edit Graphic Elements';"
  867.    Data "SVar   7,'Edit Text Strings';"
  868.    Data "SVar   8,'Grab Previous Bank';"
  869.    Data "BAse   0,0; SIze SW,SH;"
  870.    Data "BT     1,0,0,48,16,1VA;"
  871.    Data "BI     0,XB,0,SX XB-,16,0VA;"
  872.    Data "RB     0,16,SX,SY,0;"
  873.    Data "BT     3,32,28,256,12,2VA;"
  874.    Data "BT     4,XA,YB,XB XA-,YB YA-,3VA;"
  875.    Data "BT     9,32,YB,256,YBYA-,8VA;"
  876.    Data "BT     5,XA,YB,XB XA-2/,YB YA-,4VA;"
  877.    Data "BT     6,XB,YA,XB XA-,YB YA-,5VA;"
  878.    Data "BT     7,352,28,256,24,6VA;"
  879.    Data "BT     8,XA,YB,XB XA-,YB YA-,7VA;"
  880.    Data "EXit;"
  881.    
  882.    ' Definition of the text menu page 
  883.    Data "LA 2;"
  884.    Data "SVar   0,'AMOS Resource Bank Creator - String edition';"
  885.    Data "SVar   1,'Exit';"
  886.    Data "SVar   2,'Clear';"
  887.    Data "SVar   6,'Print';"
  888.    Data "BAse   0,0; SIze SW,SH;"
  889.    Data "BT     1,0,0,48,16,1VA;"
  890.    Data "BI     0,XB,0,SX XB-,16,0VA;"
  891.    Data "RB     0,16,SX,SY,0;"
  892.    Data "LS     3,14,22,SX78-2+,SY6-,%11;"
  893.    Data "BV     6,XB,YA,32,YB YA-,6VA;"
  894.    Data "BV     5,XB,YA,32,YB YA-,2VA;"
  895.    Data "EXit;"
  896.    
  897.    ' Definition of the pop-up string edition
  898.    Data "LA 3;"
  899.    Data "SVar   2,'String number ' 0VA 1+ # !;"
  900.    Data "SVar   3,'[Esc] Cancel';"
  901.    Data "SVar   4,'[Ret] Replace';"
  902.    Data "SVar   5,'[F1] Insert';"
  903.    Data "SVar   6,'[Del] Delete';"
  904.    Data "BAse   16,8; SIze SW32-,SH16-;SA 1;"
  905.    Data "RBox   0,0,SX,SY,0;"
  906.    Data "RBox   8,4,SX8-,20,1;"
  907.    Data "POut   2VA CX,8,2VA,0,3;"
  908.    Data "RBox   13,30,SX 13-,42,1;"
  909.    Data "EDit   10,16,32,72,250,1VA,0,3;"
  910.    Data "BJ     1,SX 144-,SY 24-,128,16,3VA; KY 27,0;"
  911.    Data "BJ     2,16,SY 24-,128,16,4VA; KY 13,0;"
  912.    Data "BJ     3,XB,YA,XB XA-,YB YA-,5VA; KY $D0,0;"
  913.    Data "BJ     4,XB,YA,XB XA-,YB YA-,6VA; KY $C6,0;"
  914.    Data "RU     0,3;"
  915.    Data "EXit;"
  916.    
  917.    ' Definition of the graphic element menu 
  918.    Data "LA 4;"
  919.    Data "SVar   0,'AMOS Resource Bank Creator - Graphic Elements Edition';"
  920.    Data "SVar   1,'Exit';"
  921.    Data "SVar   2,'Change Picture';"
  922.    Data "SVar   3,'Grab One Element';"
  923.    Data "SVar   4,'Grab Horiz. Line';"
  924.    Data "SVar   5,'Grab A Box';"
  925.    Data "SVar   6,'Del';"
  926.    Data "SVar   7,'Clear';"
  927.    Data "SVar   8,'Grab Vert. Line';"
  928.    Data "BAse   0,0; SIze SW,SH;"
  929.    Data "BT     1,0,0,48,16,1VA;"
  930.    Data "BI     0,XB,0,SX XB-,16,0VA;"
  931.    Data "RB     0,16,SX,SY,0;"
  932.    Data "BT     3,14,22,128,SY28-,2VA;"
  933.    Data "BT     4,XB 16+,YA,160,15,3VA;"
  934.    Data "BT     5,XA,YB,XB XA-,YB YA-,4VA;"
  935.    Data "BT     9,XA,YB,XB XA-,YB YA-,8VA;"
  936.    Data "BT     6,XA,YB,XB XA-,YB YA-,5VA;"
  937.    Data "LS     11,XB 16+,22,SX77-,SY6-,%100;"
  938.    Data "BV     7,XB,22,32,YB22-,6VA;"
  939.    Data "BV     8,XB,22,32,YB22-,7VA;"
  940.    Data "EXit;"
  941.    
  942.    ' -------------------------------- 
  943.    ' List Slider: draw a list + a slider, linked together 
  944.    ' LS zone,x,y,x,y,flags
  945.    Data "UI     LS,6; ["
  946.    Data "RB     P2,P3,P2 16+,P5,1;"
  947.    Data "RB     XB,YA,P4,P5,1;"
  948.    Data "SZone  P1;"
  949.    Data "VSlide P1,P2 3+,P3 2+,9,P5 P3- 4-,1P1+VA,7,256,1;[ZChange ZNum 1+,ZPos;SVar 1ZN+,ZPos;]"
  950.    Data "AList  P1 1+,P2 18+,P3 2+,P4 P2- 18- 8/,P5 P3- 8/,P1 VA,1P1+VA,P6,0,3;[]"
  951.    Data "XY     P2,P3,P4,P5;]"
  952.    '----------------------------------------
  953.    ' One button, with vertical text, click only   
  954.    ' BV zone,x,y,sx,sy,text 
  955.    Data "UI     BV,6; ["
  956.    Data "SZone  P6;"
  957.    Data "BU     P1,P2,P3,P4,P5,0,0,1;"
  958.    Data "       [RB 0,0,SX,SY,BP;"
  959.    Data "        VTxt SX 2/ 4- BP+,SY ZVarTLen TH* - 2/ BP+,ZV,3;]"
  960.    Data "       [BR 0;]"
  961.    Data "]"
  962.    '----------------------------------------
  963.    ' One button, with text, click only  
  964.    ' BT zone,x,y,sx,sy,text 
  965.    Data "UI     BT,6; ["
  966.    Data "SZone  P6;"
  967.    Data "BU     P1,P2,P3,P4,P5,0,0,1;"
  968.    Data "       [RB 0,0,SX,SY,BP;"
  969.    Data "        PR ZV CX BP+,SY TH- 2/ BP+,ZV,3;]"
  970.    Data "       [BR 0;]"
  971.    Data "]"
  972.    '----------------------------------------  
  973.    ' One button, with text to move the screen 
  974.    ' BT zone,x,y,sx,sy,text 
  975.    Data "UI     BI,6; ["
  976.    Data "SZone  P6;"
  977.    Data "BU     P1,P2,P3,P4,P5,0,0,1;"
  978.    Data "       [RB 0,0,SX,SY,BP;"
  979.    Data "        PR ZV CX BP+,SY TH- 2/ BP+,ZV,3;]"
  980.    Data "       [SMove;BR 0;]"
  981.    Data "]"
  982.    '----------------------------------------
  983.    ' One button, with text, click only, QUIT!   
  984.    ' BJ zone,x,y,sx,sy,text 
  985.    Data "UI     BJ,6; ["
  986.    Data "SZone  P6;"
  987.    Data "BU     P1,P2,P3,P4,P5,0,0,1;"
  988.    Data "       [RB 0,0,SX,SY,BP;"
  989.    Data "        PO ZV CX BP+,SY TH- 2/ BP+,ZV,0,3;]"
  990.    Data "       [BR 0;BQuit;]"
  991.    Data "]"
  992.    '----------------------------------------
  993.    ' Text centered in one RB
  994.    ' CT x1,y1,x2,y2,act,text
  995.    Data "UI     CT,6; ["
  996.    Data "RB     P1,P2,P3,P4,P5;"
  997.    Data "PRint  P3 P1- P6TW- 2/ P1+,P4 P2- TH- 2/ P2+,P6,3;"
  998.    Data "XY     P1,P2,P3,P4;]"
  999.    '----------------------------------------
  1000.    ' Ronnies Simpson graphic box definition 
  1001.    ' RB x1,y1,x2,y2,activated 
  1002.    Data "UI     RB,5; [SWrite 1; SPattern 0,0;"
  1003.    Data "IF     P5 0=;["
  1004.    Data "INk    0,0,0; GSquare P1,P2,P3 1-,P4 1-;"
  1005.    Data "INk    6,6,6; GBox P1 1+,P2 1+,P3 2-,P4 2-; "
  1006.    Data "INk    5,5,5; GLine P1 2+,P4 2-,P1 2+,P2 1+;"
  1007.    Data "              GLine P1 1+,P4 2-,P1 1+,P2 1+;"
  1008.    Data "              GLine P1 1+,P2 1+,P3 2-,P2 1+;"
  1009.    Data "INk    2,2,2; GLine P1 2+,P4 2-,P3 2-,P4 2-;"
  1010.    Data "              GLine P3 3-,P2 2+,P3 3-,P4 2-;"
  1011.    Data "              GLine P3 2-,P2 1+,P3 2-,P4 2-;"
  1012.    Data "INk    3,3,3; GLine P1 3+,P2 2+,P1 4+,P2 2+;]"
  1013.    Data "IF     P5 0\;["
  1014.    Data "INk    0,0,0; GSquare P1,P2,P3 1-,P4 1-;"
  1015.    Data "INk    2,2,2; GBox P1 1+,P2 1+,P3 2-,P4 2-; "
  1016.    Data "INk    1,1,1; GLine P1 2+,P4 2-,P1 2+,P2 1+;"
  1017.    Data "              GLine P1 1+,P4 2-,P1 1+,P2 1+;"
  1018.    Data "              GLine P1 1+,P2 1+,P3 2-,P2 1+;"
  1019.    Data "INk    5,5,5; GLine P1 2+,P4 2-,P3 2-,P4 2-;"
  1020.    Data "              GLine P3 3-,P2 2+,P3 3-,P4 2-;"
  1021.    Data "              GLine P3 2-,P2 1+,P3 2-,P4 2-;]"
  1022.    Data "SWrite 0; XY P1,P2,P3,P4;]"
  1023.    Data ""
  1024.    
  1025. End Proc
  1026. Procedure GRB_EDITOR_PALETTE
  1027.    ADAT=Leek(Dreg(3))
  1028.    If ADAT=0
  1029.       Palette 0,$6F,$77,$EEE,$F00,$DD,$AA,$FF3
  1030.    Else 
  1031.       For C=0 To 7
  1032.          Colour C,Deek(ADAT+28+C*2)
  1033.       Next 
  1034.       Colour 1,(Colour(2) and $EEE)/2
  1035.    End If 
  1036. End Proc
  1037. Procedure LOWMEM
  1038.    
  1039.    Screen Open 0,640,8,2,Hires : Curs Off 
  1040.    Colour 1,$FFF
  1041.    Centre "Memory too low. Press any key to abort."
  1042.    Wait Key 
  1043.    Edit 
  1044.    
  1045. End Proc
  1046. Procedure MN_PRINT
  1047.    
  1048.    Dialog Freeze 
  1049.    
  1050.    For MS=STMX To 0 Step -1
  1051.       Exit If ST$(MS)-" "<>""
  1052.    Next 
  1053.    
  1054.    If MS>=0
  1055.       
  1056.       X=Free
  1057.       
  1058.       D=Dialog Box(DB$,1,"Print all strings: please check printer and click on [OK]") : If D<>2 : Pop Proc : End If 
  1059.       
  1060.       Do 
  1061.          Trap Printer Open 
  1062.          Exit If Errtrap=0
  1063.          R=Dialog Box(DB$,1,"Printer not ready. Click on [Ok] to try again.")
  1064.          If R<>2 : Pop Proc : End If 
  1065.       Loop 
  1066.       
  1067.       D=Dialog Box(DB$,0,"Printing resource strings.")
  1068.       
  1069.       For S=0 To MS
  1070.          
  1071.          If Printer Online=0
  1072.             Repeat 
  1073.                R=Dialog Box(DB$,1,"Printer not ready. Click on [Ok] to try again.")
  1074.                Exit If R<>2,2
  1075.             Until Printer Online
  1076.          End If 
  1077.          
  1078.          A$=Mid$(Str$(S),2)+"-"+ST$(S)
  1079.          Trap Printer Send A$+Chr$(27)+"E"
  1080.          Repeat : Exit If Inkey$<>"",2 : Multi Wait : Until Printer Check
  1081.          
  1082.       Next 
  1083.       
  1084.       Repeat : Exit If Inkey$<>"" : Until Printer Check
  1085.       Trap Printer Close 
  1086.       
  1087.    End If 
  1088.    
  1089.    Dialog Unfreeze 
  1090.    Pop Proc
  1091.    
  1092. End Proc