home *** CD-ROM | disk | FTP | other *** search
/ AmigActive 26 / AACD 26.iso / AACD / Programming / AllPlaton / LOM / NewMapEditor.AMOS / NewMapEditor.amosSourceCode
Encoding:
AMOS Source Code  |  1995-11-03  |  70.7 KB  |  2,751 lines

  1. ' *************************************
  2. ' *                                   *
  3. ' *     LOM Level Map Editor V0.6     *
  4. ' *      Written by Chris Hodges      *
  5. ' *                                   *
  6. ' *************************************
  7. '
  8. Set Buffer 40
  9. If Screen<>-1 Then Screen Close 0
  10. MXFILES=200
  11. Dim FIL$(MXFILES)
  12. Dim BOOL$(1),TIAR$(7,1),INVO$(7,1),ACTI$(7,1)
  13. Dim FB(60,4),FB$(60)
  14. Global FB(),FB$()
  15. TH=8
  16. Global TH
  17. If Exist("EditorDats/LastSession.Abk") Then Load "EditorDats/LastSession.Abk"
  18. Break Off 
  19. Gosub INIT
  20. TILRAN1=0 : TILRAN2=0
  21. Gosub MAIN
  22. If Param=0 Then Save "EditorDats/LastSession.Abk"
  23. Fade 1 : Wait 16 : Screen Close 0
  24. Fade 1 : Wait 16 : Screen Close 1
  25. Erase All 
  26. End 
  27. EVENTLOOP:
  28.   OMK=MK
  29.   Screen 0
  30.   If Key Shift and 32 Then X Mouse=X Hard(XM)
  31.   If Key Shift and 16 Then Y Mouse=Y Hard(YM)
  32.   XM=X Screen(X Mouse) : YM=Y Screen(Y Mouse) : MK=Mouse Key : I$=Inkey$
  33.   If MO>-1
  34.     If MK=0
  35.       Limit Mouse 128,40 To 447,300
  36.     Else 
  37.       If YM>84
  38.         Limit Mouse 128,40+85 To 447,300
  39.       Else 
  40.         Limit Mouse 128,40 To 447,300
  41.       End If 
  42.     End If 
  43.   End If 
  44.   If I$="" Then Multi Wait 
  45.   BT=0
  46.   If YM=0 : I$=Cup$ : End If 
  47.   If YM>84
  48.     If XM=0 : I$=Cleft$ : End If 
  49.     If XM=638 : I$=Cright$ : End If 
  50.     If MK<>0 and YM=85 : I$=Cup$ : End If 
  51.     If YM=260 : I$=Cdown$ : End If 
  52.     If MO=0
  53.       XB=XM/32+MAPX
  54.       YB=Y Screen(1,Y Mouse)/16+MAPY
  55.     End If 
  56.     If MO=1
  57.       X=XM/32
  58.       Y=Y Screen(1,Y Mouse)/16+YOF
  59.       XB=Min(X+Y*20,NI-1) : YB=0
  60.     End If 
  61.     If MO=2
  62.       XB=(XM/320)*8+Min(Y Screen(1,Y Mouse)/22,7) : YB=0
  63.     End If 
  64.     If MO=3
  65.       XB=(XM/320)*10+Min(Y Screen(1,Y Mouse)/17,9)+AROF : YB=0
  66.     End If 
  67.     If MO=4
  68.       XB=(XM/160)*10+Min(Y Screen(1,Y Mouse)/17,9)+ANOF : YB=(XM mod 160)/80
  69.     End If 
  70.     If MK
  71.       If XB<>OXB or YB<>OYB
  72.         Gosub BUTPRESS
  73.         OXB=XB : OYB=YB
  74.       End If 
  75.     Else 
  76.       OXB=-1 : OYB=-1
  77.     End If 
  78.   Else 
  79.     If MK=1 and OMK<>1
  80.       CHKMOUSE[XM,YM,25,59]
  81.       BT=Param
  82.     End If 
  83.   End If 
  84.   Gosub UPDATINFO
  85.   If BT=31 and MO<>0 Then Gosub VIEMAP
  86.   If BT=36 and MO<>1 Then Gosub VIETILES
  87.   If BT=51 Then UNDO
  88.   If BT=52 Then REDO
  89.   If BT>38 and BT<44 and VIMO<>BT-39
  90.     FB(39+VIMO,4)=1 : RELEGAD[39+VIMO]
  91.     VIMO=BT-39
  92.     FB(39+VIMO,4)=5 : PUSHGAD[39+VIMO]
  93.   End If 
  94.   If BT=47
  95.     If BOMO=0
  96.       FB(47,4)=5 : PUSHGAD[47]
  97.       BOMO=1
  98.     Else 
  99.       FB(47,4)=1 : RELEGAD[47]
  100.       BOMO=0
  101.     End If 
  102.   End If 
  103.   If BT=49
  104.     If AUMO=0
  105.       If Length(30)=0
  106.         REQUEST["Please define one autowall first!","Ok"]
  107.         Gosub AUTOWALL
  108.       End If 
  109.       FB(49,4)=5 : PUSHGAD[49]
  110.       AUMO=1
  111.     Else 
  112.       FB(49,4)=1 : RELEGAD[49]
  113.       AUMO=0
  114.     End If 
  115.   End If 
  116.   If I$<>""
  117.     Gosub CONTROLS
  118.     Screen 1
  119.     If MO=0 : Gosub VIEMAPCONTROLS : End If 
  120.     If MO=1 : Gosub VIETILECONTROLS : End If 
  121.     If MO=2 : Gosub VIEAUTOWALLCONTROLS : End If 
  122.     If MO=3 : Gosub VIEATTRCONTROLS : End If 
  123.   End If 
  124.   If BT=26 Then Amos To Back 
  125. Return 
  126. BUTPRESS:
  127. ' Map
  128.   If MO=0 and VIMO>-1
  129.     If MK=1
  130.       If BOMO=0
  131.         If VIMO<2
  132.           If TILRAN1<>TILRAN2
  133.             TIL=TILRAN1+Rnd(TILRAN2-TILRAN1)
  134.           Else 
  135.             TIL=TILRAN1
  136.           End If 
  137.           Screen 1
  138.           If OMK=0
  139.             NEWUNDO
  140.           End If 
  141.           If AUMO=0
  142.             PLT[XB,YB,TIL]
  143.           Else 
  144.             PLTAUMO[XB,YB,TIL]
  145.           End If 
  146.         End If 
  147.       Else 
  148.         If OMK=0
  149.           XB1=XB : YB1=YB
  150.         Else 
  151.           UNDO
  152.         End If 
  153.         NEWUNDO
  154.         Screen 1
  155.         If TILRAN1=TILRAN2
  156.           For Y=YB1 To YB Step(YB<YB1)*2+1
  157.             For X=XB1 To XB Step(XB<XB1)*2+1
  158.               If AUMO=0
  159.                 PLT[X,Y,TILRAN1]
  160.               Else 
  161.                 PLTAUMO[X,Y,TILRAN1]
  162.               End If 
  163.             Next 
  164.           Next 
  165.         Else 
  166.           For Y=YB1 To YB Step(YB<YB1)*2+1
  167.             For X=XB1 To XB Step(XB<XB1)*2+1
  168.               If AUMO=0
  169.                 PLT[X,Y,TILRAN1+Rnd(TILRAN2-TILRAN1)]
  170.               Else 
  171.                 PLTAUMO[X,Y,TILRAN1+Rnd(TILRAN2-TILRAN1)]
  172.               End If 
  173.             Next 
  174.           Next 
  175.         End If 
  176.       End If 
  177.     Else 
  178.       If VIMO=0
  179.         TILRAN1=Min(Deek(MAPST+(XB+YB*MAPMAXX)*4),NI-1)
  180.         TILRAN2=TILRAN1
  181.       End If 
  182.       If VIMO=1
  183.         If BOMO
  184.           If OMK=0
  185.             XB1=XB : YB1=YB
  186.           Else 
  187.             UNDO
  188.           End If 
  189.           NEWUNDO
  190.           Screen 1
  191.           For Y=YB1 To YB Step(YB<YB1)*2+1
  192.             For X=XB1 To XB Step(XB<XB1)*2+1
  193.               PLT[X,Y,NULTIL]
  194.             Next 
  195.           Next 
  196.         Else 
  197.           Screen 1
  198.           PLT[XB,YB,NULTIL]
  199.         End If 
  200.       End If 
  201.     End If 
  202.   End If 
  203. ' Map + Attr-Edit
  204.   If MO=0 and VIMO=-1 and MK<>0
  205.     If MK=1
  206.       A=TIAR or $8000
  207.     Else 
  208.       A=0
  209.     End If 
  210.     If BOMO=0
  211.       Screen 1
  212.       If OMK=0
  213.         NEWUNDO
  214.       End If 
  215.       PATTR[XB,YB,A]
  216.     Else 
  217.       If OMK=0
  218.         XB1=XB : YB1=YB
  219.       Else 
  220.         UNDO
  221.       End If 
  222.       NEWUNDO
  223.       Screen 1
  224.       For Y=YB1 To YB Step(YB<YB1)*2+1
  225.         For X=XB1 To XB Step(XB<XB1)*2+1
  226.           PATTR[X,Y,A]
  227.         Next 
  228.       Next 
  229.     End If 
  230.   End If 
  231. ' Tiles-Selector 
  232.   If MO=1
  233.     If MK=1
  234.       If OMK=0
  235.         TILRAN1=XB : TILRAN2=XB
  236.       Else 
  237.         TILRAN2=Min(Max(TILRAN1,XB),TILRAN1+6)
  238.       End If 
  239.       Gosub UPDATSELLINE
  240.     Else 
  241.       NULTIL=XB
  242.     End If 
  243.   End If 
  244. ' Autowall Editor  
  245.   If MO=2
  246.     If OMK=0
  247.       If MK=1
  248.         Doke AWST+CUAW*64+XB*4,TILRAN1
  249.         Doke AWST+CUAW*64+XB*4+2,TILRAN2
  250.       Else 
  251.         Doke AWST+CUAW*64+XB*4,0
  252.         Doke AWST+CUAW*64+XB*4+2,0
  253.       End If 
  254.       Screen 1
  255.       Gosub UPDATAUTOWALL
  256.     End If 
  257.   End If 
  258. ' Attributes Editor  
  259.   If MO=3
  260.     If OMK=0
  261.       If MK=1
  262.         Doke ARST+XB*4,TIAR
  263.         Gosub VIEATTRIBUTES
  264.       Else 
  265.         Doke ARST+XB*4,0
  266.         Gosub VIEATTRIBUTES
  267.       End If 
  268.     End If 
  269.   End If 
  270. ' Animation Editor   
  271.   If MO=4
  272.     If OMK=0
  273.       If MK=1
  274.         Doke ANST+XB*4+YB*2,TILRAN1
  275.         Gosub VIETILEANIM
  276.       Else 
  277.         Doke ANST+XB*4+YB*2,0
  278.         Gosub VIETILEANIM
  279.       End If 
  280.     End If 
  281.   End If 
  282. Return 
  283. INIT:
  284.   BOOL$(0)="no "
  285.   BOOL$(1)="yes"
  286.   TIAR$(0,0)="sld"
  287.   TIAR$(1,0)="wtr"
  288.   TIAR$(2,0)="lth"
  289.   TIAR$(3,0)="anm"
  290.   TIAR$(0,1)="solid"
  291.   TIAR$(1,1)="water"
  292.   TIAR$(2,1)="lethal"
  293.   TIAR$(3,1)="sp.anim"
  294.   INVO$(0,0)="noinv"
  295.   INVO$(1,0)="inv ^"
  296.   INVO$(2,0)="inv >"
  297.   INVO$(3,0)="inv v"
  298.   INVO$(4,0)="inv <"
  299.   INVO$(5,0)="inv +"
  300.   INVO$(6,0)="inv X"
  301.   INVO$(7,0)="inv *"
  302.   INVO$(0,1)="no invoke"
  303.   INVO$(1,1)="invoke ^"
  304.   INVO$(2,1)="invoke >"
  305.   INVO$(3,1)="invoke v"
  306.   INVO$(4,1)="invoke <"
  307.   INVO$(5,1)="invoke +"
  308.   INVO$(6,1)="invoke X"
  309.   INVO$(7,1)="invoke *"
  310.   ACTI$(0,0)="n/a"
  311.   ACTI$(1,0)="spc"
  312.   ACTI$(2,0)="exit"
  313.   ACTI$(3,0)="door"
  314.   ACTI$(4,0)="lddr"
  315.   ACTI$(0,1)="no action"
  316.   ACTI$(1,1)="special"
  317.   ACTI$(2,1)="map exit"
  318.   ACTI$(3,1)="door"
  319.   ACTI$(4,1)="ladder"
  320.   NI=Length(2)
  321.   MO=-1 : VIMO=0 : BOMO=1 : CUAW=0 : AUMO=0
  322.   FAUW$="EditorDats/Default.auw"
  323.   FAWD$="EditorDats/Default.awd"
  324.   FARD$="Maps/Attributes.dat"
  325.   FAND$="Maps/Animations.tan"
  326.   FMAP$="Maps/TestMap.map"
  327.   FPIC$="RAM:Test.iff"
  328.   FICO$="EditorDats/Default.abk"
  329.   FPTL$="Graphics/AllGfx.ptl"
  330.   Screen Open 1,320,176,32,0
  331.   Curs Off : Flash Off : Paper 0 : Pen 1 : Cls 0
  332.   Screen Display 1,128,40+85,320,176
  333.   If NI
  334.     Get Icon Palette 
  335.   Else 
  336.     Colour 17,$BDF : Colour 18,$6F : Colour 19,$12
  337.   End If 
  338.   Screen Open 0,640,84,16,$8000
  339.   Curs Off : Flash Off : Paper 0 : Pen 1 : Cls 0
  340.   Get Palette 1
  341.   Palette 0,$FFF,$AAA,$666
  342.   Colour 17,$BDF : Colour 18,$6F : Colour 19,$12
  343.   Screen Display 0,128,40,320,84
  344.   Wait Vbl 
  345.   Limit Mouse 
  346.   Gosub CREATEMAINSCREEN
  347.   If Length(9)
  348.     ST=Start(9)
  349.     MAPST=Start(9)+256
  350.     MAPMAXX=Deek(ST+4)
  351.     MAPMAXY=Deek(ST+6)
  352.     MAPSCRX=Deek(ST+8)
  353.     MAPSCRY=Deek(ST+10)
  354.   End If 
  355.   If Length(30) Then AWST=Start(30)
  356.   If Length(2) and Length(9)
  357.     FB(31,4)=5 : PUSHGAD[31]
  358.     Screen 1 : MO=0 : Gosub UPDATWHOLEMAP
  359.   End If 
  360.   CLRUNDO
  361.   TILSUM=-1 : OLDSUM=-1
  362.   If MO=1 Then Screen 1 : Gosub UPDATSELLINE
  363.   Screen 0
  364.   Gosub UPDATINFO
  365. Return 
  366. CREATEMAINSCREEN:
  367.   Screen 0
  368.   Gr Writing 0
  369.   Cls 0
  370.   DEFCLOWIN[25,0,0]
  371.   TEXBOX[19,0,616,10,0,"Land Of Magic - Map Editor V0.6"]
  372.   DEFSCRTBK[26,617,0]
  373.   FILBOX[0,11,639,83,0]
  374.   DEFTEX[27,4,13,84,23,"Load Map",1]
  375.   DEFTEX[28,4,25,84,35,"Save Map",1]
  376.   DEFTEX[29,4,37,84,47,"Set Size",1]
  377.   DEFTEX[30,4,49,84,59,"Clear Map",1]
  378.   DEFTEX[31,4,61,84,71,"View Map",1]
  379.   DEFTEX[32,87,13,174,23,"Load Ptile",1]
  380.   DEFTEX[33,87,25,174,35,"Save Ptile",1]
  381.   DEFTEX[34,87,37,174,47,"Load Icons",1]
  382.   DEFTEX[35,87,49,174,59,"Save Icons",1]
  383.   DEFTEX[36,87,61,174,71,"View Tiles",1]
  384.   DEFTEX[37,177,13,264,23,"Grab Icons",1]
  385.   DEFTEX[38,177,25,264,35,"Save Iff",1]
  386.   DEFTEX[39,267,13,354,23,"Sel. Tile",1]
  387.   DEFTEX[40,267,25,354,35,"Draw Tile",1]
  388.   DEFTEX[41,267,37,354,47,"Set Enemy",1]
  389.   DEFTEX[42,267,49,354,59,"Set Items",1]
  390.   DEFTEX[43,267,61,354,71,"Info",1]
  391.   DEFTEX[44,177,37,264,47,"Editors",1]
  392.   ' Anim Editor, Block Editor, Autowall Editor, Enemy Editor 
  393.   DEFTEX[46,177,61,264,71,"View En/It",1]
  394.   DEFTEX[47,357,13,444,23,"Box mode",1+BOMO*4]
  395.   DEFTEX[48,357,25,444,35,"Block mode",1]
  396.   DEFTEX[49,357,37,444,47,"Autowall",1+AUMO*4]
  397.   DEFTEX[51,357,61,399,71,"Undo",1]
  398.   DEFTEX[52,402,61,444,71,"Redo",1]
  399.   DEFBOX[60,4,73,635,81,0]
  400.   DRAPROCBAR[60,1,1]
  401.   DRABOX[500,13,635,71,0]
  402.   DEAGAD[41] : DEAGAD[42] : DEAGAD[43]
  403.   DEAGAD[46] : DEAGAD[48]
  404.   FB(39+VIMO,4)=5 : PUSHGAD[39+VIMO]
  405.   If MO=0 Then Gosub VIEMAP
  406.   If MO=1 Then Gosub VIETILES
  407.   If MO>-1 Then Gosub UPDATSELLINE
  408. Return 
  409. CREATEAUTOWALLSCREEN:
  410.   Screen 0
  411.   Gr Writing 0
  412.   Cls 0
  413.   DEFCLOWIN[25,0,0]
  414.   TEXBOX[19,0,616,10,0,"Land Of Magic - Autowall Editor V1.0"]
  415.   DEFSCRTBK[26,617,0]
  416.   FILBOX[0,11,639,83,0]
  417.   DEFBOX[60,4,73,635,81,0]
  418.   DRAPROCBAR[60,1,1]
  419.   DRABOX[500,13,635,71,0]
  420.   DEFTEX[27,4,13,84,23,"Load Def",1]
  421.   DEFTEX[28,4,25,84,35,"Save Def",1]
  422.   DEFTEX[29,4,37,84,47,"Load All",1]
  423.   DEFTEX[30,4,49,84,59,"Save All",1]
  424.   DEFTEX[31,4,61,84,71,"View Map",1]
  425.   DEFTEX[32,87,13,174,59,"<",1]
  426.   DEFTEX[33,177,13,264,59,">",1]
  427.   DEFTEX[36,87,61,174,71,"View Tiles",1]
  428.   DEFTEX[39,267,13,354,23,"Sel. Tile",1]
  429.   DEFTEX[40,267,25,354,35,"Draw Tile",1]
  430.   DEFTEX[41,267,37,354,47,"Set Enemy",1]
  431.   DEFTEX[42,267,49,354,59,"Set Items",1]
  432.   DEFTEX[43,267,61,354,71,"Info",1]
  433.   DEFTEX[46,177,61,264,71,"View Auto",5]
  434.   DEFTEX[47,357,13,444,23,"Box mode",1+BO*4]
  435.   DEFTEX[48,357,25,444,35,"Block mode",1]
  436.   DEFTEX[49,357,37,444,47,"Autowall",1+AUMO*4]
  437.   DEFTEX[51,357,61,399,71,"Undo",1]
  438.   DEFTEX[52,402,61,444,71,"Redo",1]
  439.   DEAGAD[31]
  440.   DEAGAD[41] : DEAGAD[42] : DEAGAD[43]
  441.   DEAGAD[47] : DEAGAD[48] : DEAGAD[49] : DEAGAD[51] : DEAGAD[52]
  442.   FB(39+VIMO,4)=5 : PUSHGAD[39+VIMO]
  443.   Gosub VIEAUTOWALL
  444. Return 
  445. CREATEATTRIBUTESSCREEN:
  446.   Screen 0
  447.   Gr Writing 0
  448.   Cls 0
  449.   DEFCLOWIN[25,0,0]
  450.   TEXBOX[19,0,616,10,0,"Land Of Magic - Attributes Editor V0.8"]
  451.   DEFSCRTBK[26,617,0]
  452.   FILBOX[0,11,639,83,0]
  453.   DEFBOX[60,4,73,635,81,0]
  454.   DRAPROCBAR[60,1,1]
  455.   DRABOX[500,13,635,71,0]
  456.   DEFTEX[27,4,13,84,35,"Load Att",1]
  457.   DEFTEX[28,4,37,84,59,"Save Att",1]
  458.   DEFTEX[31,4,61,84,71,"View Map",1]
  459.   DEFTEX[32,87,13,174,23,"<",1]
  460.   DEFTEX[33,177,13,264,23,">",1]
  461.   DEFTEX[53,87,25,174,35,"Solid",1+(TIAR and 1)*4]
  462.   DEFTEX[54,87,37,174,47,"Water",1+(TIAR and 2)*2]
  463.   DEFTEX[55,87,49,174,59,"Lethal",1+(TIAR and 4)]
  464.   DEFTEX[56,177,25,264,35,"S-Anim",1+((TIAR and 8)/2)]
  465.   DEFTEX[57,177,37,264,47,"@"+INVO$((TIAR/16) and 7,1),1]
  466.   DEFTEX[58,177,49,264,59,"@"+ACTI$((TIAR/128) and 7,1),1]
  467.   DEFTEX[36,87,61,174,71,"View Tiles",1]
  468.   DEFTEX[39,267,13,354,23,"Set Attr.",4]
  469.   DEFTEX[40,267,25,354,35,"Draw Tile",1]
  470.   DEFTEX[41,267,37,354,47,"Set Enemy",1]
  471.   DEFTEX[42,267,49,354,59,"Set Items",1]
  472.   DEFTEX[43,267,61,354,71,"Info",1]
  473.   DEFTEX[46,177,61,264,71,"View Attr",5]
  474.   DEFTEX[47,357,13,444,23,"Box mode",1+BOMO*4]
  475.   DEFTEX[48,357,25,444,35,"Block mode",1]
  476.   DEFTEX[49,357,37,444,47,"Autowall",1+AUMO*4]
  477.   DEFTEX[51,357,61,399,71,"Undo",1]
  478.   DEFTEX[52,402,61,444,71,"Redo",1]
  479. '  DEAGAD[31]
  480.   DEAGAD[40]
  481.   DEAGAD[41] : DEAGAD[42] : DEAGAD[43]
  482. '  DEAGAD[47]  
  483.   DEAGAD[48]
  484. '  DEAGAD[49] : DEAGAD[51] : DEAGAD[52]  
  485.   Gosub VIEATTRIBUTES
  486. Return 
  487. CREATETILEANIMSCREEN:
  488.   Screen 0
  489.   Gr Writing 0
  490.   Cls 0
  491.   DEFCLOWIN[25,0,0]
  492.   TEXBOX[19,0,616,10,0,"Land Of Magic - Tile Animation Editor V0.0"]
  493.   DEFSCRTBK[26,617,0]
  494.   FILBOX[0,11,639,83,0]
  495.   DEFBOX[60,4,73,635,81,0]
  496.   DRAPROCBAR[60,1,1]
  497.   DRABOX[500,13,635,71,0]
  498.   DEFTEX[27,4,13,84,35,"Load Ani",1]
  499.   DEFTEX[28,4,37,84,59,"Save Ani",1]
  500.   DEFTEX[31,4,61,84,71,"View Map",1]
  501.   DEFTEX[32,87,13,174,59,"<",1]
  502.   DEFTEX[33,177,13,264,59,">",1]
  503.   DEFTEX[36,87,61,174,71,"View Tiles",1]
  504.   DEFTEX[39,267,13,354,23,"Sel. Tile",1]
  505.   DEFTEX[40,267,25,354,35,"Draw Tile",1]
  506.   DEFTEX[41,267,37,354,47,"Set Enemy",1]
  507.   DEFTEX[42,267,49,354,59,"Set Items",1]
  508.   DEFTEX[43,267,61,354,71,"Info",1]
  509.   DEFTEX[46,177,61,264,71,"View Anim",5]
  510.   DEFTEX[47,357,13,444,23,"Box mode",1+BO*4]
  511.   DEFTEX[48,357,25,444,35,"Block mode",1]
  512.   DEFTEX[49,357,37,444,47,"Autowall",1+AUMO*4]
  513.   DEFTEX[51,357,61,399,71,"Undo",1]
  514.   DEFTEX[52,402,61,444,71,"Redo",1]
  515.   DEAGAD[31]
  516.   DEAGAD[41] : DEAGAD[42] : DEAGAD[43]
  517.   DEAGAD[47] : DEAGAD[48] : DEAGAD[49] : DEAGAD[51] : DEAGAD[52]
  518.   FB(39+VIMO,4)=5 : PUSHGAD[39+VIMO]
  519.   Gosub VIETILEANIM
  520. Return 
  521. CONTROLS:
  522.   If I$="i"
  523.     A$="System Information:�CPU: "+ Extension_8_0EB8( Extension_8_060E ,5)+"�FPU: "+ Extension_8_0EB8( Extension_8_0618 ,5)
  524.     A$=A$+"��Chip Free: "+ Extension_8_0EC8(Chip Free/1024,6)+"KB�"
  525.     A$=A$+"Fast Free: "+ Extension_8_0EC8(Fast Free/1024,6)+"KB�"
  526.     A$=A$+"�Time: "+ Extension_8_0F1A( Extension_8_07E0 )+" Date: "+ Extension_8_0F0A( Extension_8_07CE )
  527.     A$=A$+"��Map size: "+ Extension_8_0EC8(Length(9),6)+" ("+ Extension_8_0EB8(MAPMAXX,3)+"*"+ Extension_8_0EB8(MAPMAXY,3)+")"
  528.     A$=A$+"�Screen size: "+ Extension_8_0EB8(MAPSCRX,3)+"*"+ Extension_8_0EB8(MAPSCRY,3)+" Blocks"
  529.     A$=A$+"��Icons:"+Str$(NI)
  530.     A$=A$+"��Undo buffer free: "+ Extension_8_0EC8(Leek(UNDOST-4)-Leek(UNDOST-8),5)
  531.     A$=A$+"�Redo buffer free: "+ Extension_8_0EC8(Leek(REDOST-4)-Leek(REDOST-8),5)
  532.     Screen 0
  533.     REQUEST[A$,"Interesting!"]
  534.     Screen 1
  535.   End If 
  536.   If I$="u" and(FB(51,4) and 1) Then UNDO
  537.   If I$="r" and(FB(52,4) and 1) Then REDO
  538.   If Key Shift and 7
  539.     If I$="+" and TILRAN2<NI-1 and TILRAN2-TILRAN1<6
  540.       Inc TILRAN2
  541.       If MO=1
  542.         Gosub UPDATSELLINE
  543.       End If 
  544.       Gosub UPDATINFO
  545.     End If 
  546.     If I$="-" and TILRAN1<>TILRAN2
  547.       Dec TILRAN2
  548.       If MO=1
  549.         Gosub UPDATSELLINE
  550.       End If 
  551.       Gosub UPDATINFO
  552.     End If 
  553.   Else 
  554.     If I$="+" and TILRAN2<NI-1
  555.       Inc TILRAN1 : Inc TILRAN2
  556.       If MO=1
  557.         Gosub UPDATSELLINE
  558.       End If 
  559.       Gosub UPDATINFO
  560.     End If 
  561.     If I$="-" and TILRAN1>0
  562.       Dec TILRAN1 : Dec TILRAN2
  563.       If MO=1
  564.         Gosub UPDATSELLINE
  565.       End If 
  566.       Gosub UPDATINFO
  567.     End If 
  568.   End If 
  569.   If I$=" " and MO<>1 and(FB(36,4) and 1) Then Gosub VIETILES : Return 
  570.   If I$=" " and MO<>0 and(FB(31,4) and 1) Then Gosub VIEMAP : Return 
  571. '  If I$=" " and MO<>2 and(FB(46,4) and 1) Then Gosub VIEAUTOWALL : Return 
  572. Return 
  573. VIETILECONTROLS:
  574.   If I$=Cdown$ and NI-1-YOF*20>219
  575.     If Key Shift and 7
  576.       YOF=Min(YOF+11,(NI-201)/20)
  577.       Screen 0 : Gosub VIETILES
  578.     Else 
  579.       Inc YOF
  580.       Screen Copy 1,0,16,320,176 To 1,0,0
  581.       Cls 0,0,160 To 320,176
  582.       For A=200 To Min(NI-1-YOF*20,219)
  583.         I=A+YOF*20
  584.         Paste Icon(A mod 20)*16,160,I+1
  585.         If I=>TILRAN1 and I<=TILRAN2
  586.           Draw(A mod 20)*16,160 To(A mod 20)*16+15,160
  587.           Draw(A mod 20)*16,175 To(A mod 20)*16+15,175
  588.         End If 
  589.       Next 
  590.     End If 
  591.   End If 
  592.   If I$=Cup$ and YOF>0
  593.     If Key Shift and 7
  594.       YOF=Max(YOF-11,0)
  595.       Screen 0 : Gosub VIETILES
  596.     Else 
  597.       Dec YOF
  598.       Screen Copy 1,0,0,320,160 To 1,0,16
  599.       For A=0 To Min(NI-1-YOF*20,19)
  600.         I=A+YOF*20
  601.         Paste Icon(A mod 20)*16,0,I+1
  602.         If I=>TILRAN1 and I<=TILRAN2
  603.           Draw(A mod 20)*16,0 To(A mod 20)*16+15,0
  604.           Draw(A mod 20)*16,15 To(A mod 20)*16+15,15
  605.         End If 
  606.       Next 
  607.     End If 
  608.   End If 
  609. Return 
  610. VIEMAPCONTROLS:
  611.   If I$=Cleft$ and MAPX>0
  612.     If Key Shift and 7
  613.       MAPX=Max(MAPX-20,0) : Gosub UPDATWHOLEMAP
  614.     Else 
  615.       Dec MAPX
  616.       PO=MAPST+(MAPX+MAPY*MAPMAXX)*4
  617.       Screen Copy 1,0,0,304,176 To 1,16,0
  618.       For Y=0 To 10
  619.         Paste Icon 0,Y*16,Min(Deek(PO+(Y*MAPMAXX)*4)+1,NI)
  620.         If VIMO=-1 and Deek(PO+(Y*MAPMAXX)*4+2)<>0
  621.           Ink 0 : Box 0,Y*16 To 2,Y*16+2
  622.         End If 
  623.       Next 
  624.       Gosub UPDATMAPLINES
  625.     End If 
  626.   End If 
  627.   If I$=Cright$ and MAPX<MAPMAXX-20
  628.     If Key Shift and 7
  629.       MAPX=Min(MAPX+20,MAPMAXX-20) : Gosub UPDATWHOLEMAP
  630.     Else 
  631.       Inc MAPX
  632.       PO=MAPST+(MAPX+MAPY*MAPMAXX)*4
  633.       Screen Copy 1,16,0,320,176 To 1,0,0
  634.       For Y=0 To 10
  635.         Paste Icon 304,Y*16,Min(Deek(PO+(19+Y*MAPMAXX)*4)+1,NI)
  636.         If VIMO=-1 and Deek(PO+(19+Y*MAPMAXX)*4+2)<>0
  637.           Ink 0 : Box 304,Y*16 To 306,Y*16+2
  638.         End If 
  639.       Next 
  640.       Gosub UPDATMAPLINES
  641.     End If 
  642.   End If 
  643.   If I$=Cup$ and MAPY>0
  644.     If Key Shift and 7
  645.       MAPY=Max(MAPY-11,0) : Gosub UPDATWHOLEMAP
  646.     Else 
  647.       Dec MAPY
  648.       PO=MAPST+(MAPX+MAPY*MAPMAXX)*4
  649.       Screen Copy 1,0,0,320,160 To 1,0,16
  650.       For X=0 To 19
  651.         Paste Icon X*16,0,Min(Deek(PO+X*4)+1,NI)
  652.         If VIMO=-1 and Deek(PO+X*4+2)<>0
  653.           Ink 0 : Box X*16,0 To X*16+2,2
  654.         End If 
  655.       Next 
  656.       Gosub UPDATMAPLINES
  657.     End If 
  658.   End If 
  659.   If I$=Cdown$ and MAPY<MAPMAXY-11
  660.     If Key Shift and 7
  661.       MAPY=Min(MAPY+11,MAPMAXY-11) : Gosub UPDATWHOLEMAP
  662.     Else 
  663.       Inc MAPY
  664.       PO=MAPST+(MAPX+MAPY*MAPMAXX)*4
  665.       Screen Copy 1,0,16,320,176 To 1,0,0
  666.       For X=0 To 19
  667.         Paste Icon X*16,160,Min(Deek(PO+(X+10*MAPMAXX)*4)+1,NI)
  668.         If VIMO=-1 and Deek(PO+(X+10*MAPMAXX)*4+2)<>0
  669.           Ink 0 : Box X*16,160 To X*16+2,162
  670.         End If 
  671.       Next 
  672.       Gosub UPDATMAPLINES
  673.     End If 
  674.   End If 
  675. Return 
  676. VIEAUTOWALLCONTROLS:
  677.   If I$=Cleft$ and CUAW>0 Then Dec CUAW : Gosub VIEAUTOWALL
  678.   If I$=Cright$ and CUAW<31 Then Inc CUAW : Gosub VIEAUTOWALL
  679. Return 
  680. VIEATTRCONTROLS:
  681.   If I$=Cleft$ and AROF>0 Then AROF=Max(AROF-20,0) : Gosub VIEATTRIBUTES
  682.   If I$=Cright$ and AROF<NI-20 Then Add AROF,20 : Gosub VIEATTRIBUTES
  683. Return 
  684. MAIN:
  685.   Do 
  686.     Gosub EVENTLOOP
  687.     Screen 0
  688.     If BT=25
  689.       REQUEST["Are you sure you want to quit the map editor?","Quit&Save|Quit|Abort"]
  690.       Exit If Param=0
  691.     End If 
  692.     If BT=27 Then Gosub LOAMAP
  693.     If BT=28 Then Gosub SAVMAP
  694.     If BT=29 Then Gosub SETSIZE
  695.     If BT=30 Then Gosub CLEARMAP2
  696.     If BT=32 Then Gosub LOAPTILE
  697.     If BT=33 Then Gosub SAVPTILE
  698.     If BT=34 Then Gosub LOAICONS
  699.     If BT=35 Then Gosub SAVICONS
  700.     If BT=37 Then Gosub LOAPIC
  701.     If BT=38 Then Gosub SAVPIC
  702.     If BT=44
  703.       REQUEST["Select editor:","Config|Attributes|Anims|Autowall|Enemies|Cancel"]
  704.       PED=Param
  705.       If PED=1 : Gosub ARIBUTES : End If 
  706.       If PED=2 : Gosub TILEANIM : End If 
  707.       If PED=3 : Gosub AUTOWALL : End If 
  708.     End If 
  709.   Loop 
  710. Return 
  711. ARIBUTES:
  712.   Gosub KILGADS
  713.   OVIMO=VIMO : VIMO=-1
  714.   If Length(31)=0
  715.     Reserve As Data 31,4096
  716.      Extension_8_028C 31,"Attributes"
  717.   End If 
  718.   ARST=Start(31)
  719.   AROF=Max(Min(TILRAN1,NI-21),0)
  720.   AROF=AROF-(AROF mod 20)
  721.   Gosub CREATEATTRIBUTESSCREEN
  722.   Do 
  723.     Gosub EVENTLOOP
  724.     If BT=27 Then Gosub LOAARDEF
  725.     If BT=28 Then Gosub SAVARDEF
  726.     If BT=32 and AROF>0 Then AROF=Max(AROF-20,0) : Gosub VIEATTRIBUTES
  727.     If BT=33 and AROF<NI-20 Then Add AROF,20 : Gosub VIEATTRIBUTES
  728.     If BT>52 and BT<57
  729.       B=BT-53
  730.       If TIAR and Extension_8_04F8(B)
  731.         FB(BT,4)=1 : RELEGAD[BT]
  732.         TIAR=TIAR and($FFFF- Extension_8_04F8(B))
  733.       Else 
  734.         FB(BT,4)=5 : PUSHGAD[BT]
  735.         TIAR=TIAR or Extension_8_04F8(B)
  736.       End If 
  737.     End If 
  738.     If BT=57
  739.       INVO=(TIAR/16) and 7
  740.       Add INVO,1,0 To 7
  741.       TIAR=(TIAR and $FF8F)+INVO*16
  742.       NEWTEX[BT,"@"+INVO$(INVO,1)]
  743.     End If 
  744.     If BT=58
  745.       ACTI=(TIAR/128) and 7
  746.       Add ACTI,1,0 To 4
  747.       TIAR=(TIAR and $FC7F)+ACTI*128
  748.       NEWTEX[BT,"@"+ACTI$(ACTI,1)]
  749.     End If 
  750.     If BT=46 and MO<>3 Then Gosub VIEATTRIBUTES
  751.     Exit If BT=25
  752.   Loop 
  753.   MO=0
  754.   TILSUM=-1
  755.   VIMO=OVIMO
  756.   Gosub CREATEMAINSCREEN
  757. Return 
  758. TILEANIM:
  759.   Gosub KILGADS
  760.   If Length(32)=0
  761.     Reserve As Data 32,4096
  762.      Extension_8_028C 32,"TileAnim"
  763.   End If 
  764.   ANST=Start(32)
  765.   ANOF=Max(Min(TILRAN1,NI-41),0)
  766.   ANOF=ANOF-(ANOF mod 40)
  767.   Gosub CREATETILEANIMSCREEN
  768.   Do 
  769.     Gosub EVENTLOOP
  770.     If BT=27 Then Gosub LOAANDEF
  771.     If BT=28 Then Gosub SAVANDEF
  772.     If BT=32 and ANOF>0 Then ANOF=Max(ANOF-40,0) : Gosub VIETILEANIM
  773.     If BT=33 and ANOF<NI-40 Then Add ANOF,40 : Gosub VIETILEANIM
  774.     If BT=46 and MO<>2 Then Gosub VIETILEANIM
  775.     Exit If BT=25
  776.   Loop 
  777.   MO=0
  778.   Gosub CREATEMAINSCREEN
  779. Return 
  780. AUTOWALL:
  781.   Gosub KILGADS
  782.   If Length(30)=0
  783.     Reserve As Data 30,2048
  784.      Extension_8_028C 30,"AutoWall"
  785.   End If 
  786.   AWST=Start(30)
  787.   Gosub CREATEAUTOWALLSCREEN
  788.   Do 
  789.     Gosub EVENTLOOP
  790.     If BT=27 Then Gosub LOAAWDEF
  791.     If BT=28 Then Gosub SAVAWDEF
  792.     If BT=29 Then Gosub LOAAUTOWALL
  793.     If BT=30 Then Gosub SAVAUTOWALL
  794.     If BT=32 and CUAW>0 Then Dec CUAW : Gosub VIEAUTOWALL
  795.     If BT=33 and CUAW<31 Then Inc CUAW : Gosub VIEAUTOWALL
  796.     If BT=46 and MO<>2 Then Gosub VIEAUTOWALL
  797.     Exit If BT=25
  798.   Loop 
  799.   MO=0
  800.   Gosub CREATEMAINSCREEN
  801. Return 
  802. SETREFRESH:
  803.   OLDSUM=-1 : TILSUM=-1 : AWSUM=-1 : ARSUM=-1
  804. Return 
  805. VIETILES:
  806.   If NI=0 Then REQUEST["There are no tiles to show!","Oooops!"] : Return 
  807.   FB(36,4)=5 : PUSHGAD[36]
  808.   If MO=0 Then FB(31,4)=1 : RELEGAD[31]
  809.   If MO=2 or MO=3 or MO=4 Then FB(46,4)=1 : RELEGAD[46]
  810.   Screen 1 : Cls : Ink 1
  811.   For A=0 To Min(NI-1-YOF*20,219)
  812.     I=A+YOF*20
  813.     X=(A mod 20)*16 : Y=(A/20)*16
  814.     Paste Icon X,Y,I+1
  815.     If I=>TILRAN1 and I<=TILRAN2 Then Draw X,Y To X+15,Y : Draw X,Y+15 To X+15,Y+15
  816.   Next 
  817.   MO=1
  818.   Screen 0
  819.   Gosub SETREFRESH
  820.   XB=0 : Gosub UPDATINFO
  821. Return 
  822. VIEMAP:
  823.   If Length(9)=0 Then REQUEST["No map has been defined yet!","Geee!"] : Return 
  824.   If Length(2)=0 Then REQUEST["Cannot show map without any icons!","Sorry."] : Return 
  825.   If MO=1 Then FB(36,4)=1 : RELEGAD[36]
  826.   If MO=3 Then FB(46,4)=1 : RELEGAD[46]
  827.   FB(31,4)=5 : PUSHGAD[31]
  828.   MO=0
  829.   Screen 1
  830.   XB=0 : YB=0
  831.   Gosub SETREFRESH
  832.   Gosub UPDATWHOLEMAP
  833.   Screen 0 : Gosub UPDATINFO
  834. Return 
  835. VIEAUTOWALL:
  836.   FB(46,4)=5 : PUSHGAD[46]
  837.   If MO=1 Then FB(36,4)=1 : RELEGAD[36]
  838.   Screen 1 : Cls : Ink 1
  839.   For XB=0 To 15
  840.     Gosub UPDATAUTOWALL
  841.   Next 
  842.   XB=0 : MO=2
  843.   Gosub SETREFRESH
  844. Return 
  845. VIETILEANIM:
  846.   FB(46,4)=5 : PUSHGAD[46]
  847.   If MO=1 Then FB(36,4)=1 : RELEGAD[36]
  848.   Screen 1 : Cls : Ink 1
  849.   For A=0 To 39
  850.     X=(A/10)*80 : Y=(A mod 10)*17
  851.     If A+ANOF<NI
  852.       Ink 1,0 : Box X,Y To X+17,Y+17
  853.       Paste Icon X+1,Y+1,A+ANOF+1
  854.       Ink 1,0 : Box X+23,Y To X+40,Y+17
  855.       Paste Icon X+24,Y+1,Deek(ANST+((A+ANOF)*4))+1
  856.       Ink Extension_8_1504((Colour(1) and $EEE)/2),0 : Box X+47,Y To X+64,Y+17
  857.       Paste Icon X+48,Y+1,Deek(ANST+((A+ANOF)*4)+2)+1
  858.     End If 
  859.   Next 
  860.   XB=0 : MO=4
  861.   Gosub SETREFRESH
  862. Return 
  863. VIEATTRIBUTES:
  864.   FB(46,4)=5 : PUSHGAD[46]
  865.   If MO=1 Then FB(36,4)=1 : RELEGAD[36]
  866.   Screen 1 : Cls : Ink 1
  867.   For A=0 To 19
  868.     X=(A/10)*160 : Y=(A mod 10)*17
  869.     If A+AROF<NI
  870.       V=Deek(ARST+(A+AROF)*4)
  871.       Gosub CREATTRSTRING
  872.       Ink 1,0 : Box X,Y To X+17,Y+17
  873.       Paste Icon X+1,Y+1,A+AROF+1
  874.       Text X+20,Y+Text Base+5,T$
  875.     End If 
  876.   Next 
  877.   XB=0 : MO=3
  878.   Gosub SETREFRESH
  879. Return 
  880. CREATTRSTRING:
  881.   If(V and 15)=0
  882.     T$="--- "
  883.   Else 
  884.     T$=""
  885.     If V and 1 : T$=TIAR$(0,0)+" " : End If 
  886.     If V and 2 : T$=T$+TIAR$(1,0)+" " : End If 
  887.     If V and 4 : T$=T$+TIAR$(2,0)+" " : End If 
  888.     If V and 8 : T$=T$+TIAR$(3,0)+" " : End If 
  889.   End If 
  890.   T$=T$+INVO$((V/16) and 7,0)+" "+ACTI$((V/128) and 7,0)
  891. Return 
  892. UPDATWHOLEMAP:
  893.   If Length(2)=0 Then Return 
  894.   PO=MAPST+(MAPX+MAPY*MAPMAXX)*4
  895.   For Y=0 To 10
  896.     For X=0 To 19
  897.       Paste Icon X*16,Y*16,Min(Deek(PO+(X+Y*MAPMAXX)*4)+1,NI)
  898.       If VIMO=-1 and Deek(PO+(X+Y*MAPMAXX)*4+2)<>0
  899.         Ink 0 : Box X*16,Y*16 To X*16+2,Y*16+2
  900.       End If 
  901.     Next 
  902.   Next 
  903.   Gosub UPDATMAPLINES
  904. Return 
  905. UPDATAUTOWALL:
  906.   X=(XB/8)*160
  907.   Y=(XB mod 8)*22
  908.   Ink 1 : Box X,Y To X+17,Y+17
  909.   If XB and 1 Then Bar X+6,Y+2 To X+11,Y+5
  910.   If XB and 2 Then Bar X+2,Y+6 To X+5,Y+11
  911.   If XB and 4 Then Bar X+12,Y+6 To X+15,Y+11
  912.   If XB and 8 Then Bar X+6,Y+12 To X+11,Y+15
  913.   T1=Deek(AWST+CUAW*64+XB*4) : T2=Deek(AWST+CUAW*64+XB*4+2)
  914.   For B=0 To 6
  915.     Box X+24+B*17,Y To X+41+B*17,Y+17
  916.     If T1+B<=T2
  917.       Paste Icon X+25+B*17,Y+1,Min(T1+B+1,NI)
  918.     Else 
  919.       Ink 0 : Bar X+25+B*17,Y+1 To X+40+B*17,Y+16
  920.       Ink 1 : Draw X+25+B*17,Y+1 To X+40+B*17,Y+16
  921.       Draw X+25+B*17,Y+16 To X+40+B*17,Y+1
  922.     End If 
  923.   Next 
  924. Return 
  925. UPDATMAPLINES:
  926.   Ink 1
  927.   X1=(((100*MAPSCRX)-MAPX) mod MAPSCRX)*16 : Y1=(((100*MAPSCRY)-MAPY) mod MAPSCRY)*16
  928.   X2=(((100*MAPSCRX-1)-MAPX) mod MAPSCRX)*16 : Y2=(((100*MAPSCRY-1)-MAPY) mod MAPSCRY)*16
  929.   Draw X1,0 To X1,176 : Draw 0,Y1 To 320,Y1
  930.   Draw X2+15,0 To X2+15,176 : Draw 0,Y2+15 To 320,Y2+15
  931. Return 
  932. UPDATINFO:
  933.   If MO=-1 Then Return 
  934.   If MO=3
  935.     SUM=AROF+XB+YB+TIAR
  936.     If SUM<>ARSUM
  937.       FILBOX[500,13,635,71,0]
  938.       TEX[505,14,630,22,"T1:"+ Extension_8_0EB8(AROF+1,4)+" T2:"+ Extension_8_0EB8(Min(AROF+20,NI),4)]
  939.       TEX[505,22,630,30,"Cur. Icon: "+ Extension_8_0EB8(XB,4)]
  940.       TEX[505,30,630,39,"Solid : "+BOOL$(TIAR and 1)]
  941.       TEX[505,38,630,47,"Water : "+BOOL$((TIAR and 2)/2)]
  942.       TEX[505,46,630,55,"Lethal: "+BOOL$((TIAR and 4)/4)]
  943.       TEX[505,54,630,63,"SpAnim: "+BOOL$((TIAR and 8)/8)]
  944.       ARSUM=SUM
  945.     End If 
  946.   End If 
  947.   If MO=0 or MO=1
  948.     SUM=AROF+XB+YB+TIAR
  949.     If VIMO=-1 and ARSUM<>TIAR
  950.       V=Deek(MAPST+(XB+YB*MAPMAXX)*4+2) : Gosub CREATTRSTRING
  951.       TEX[505,46,630,55,T$]
  952.       V=TIAR : Gosub CREATTRSTRING
  953.       TEX[505,54,630,63,T$]
  954.       ARSUM=SUM
  955.     End If 
  956.     SUM=MAPMAXX+MAPMAXY+MAPX+MAPY+XB+YB
  957.     If SUM<>OLDSUM
  958. '      FILBOX[500,13,635,71,0] 
  959.       If VIMO>-1
  960.         Ink 2 : Bar 505,38 To 630,51
  961.       End If 
  962.       TEX[505,14,630,22,"MX: "+ Extension_8_0EB8(MAPMAXX,3)+" MY: "+ Extension_8_0EB8(MAPMAXY,3)]
  963.       TEX[505,22,630,30,"X1: "+ Extension_8_0EB8(MAPX,3)+" Y1: "+ Extension_8_0EB8(MAPY,3)]
  964.       TEX[505,30,630,38,"X2: "+ Extension_8_0EB8(MAPX+19,3)+" Y2: "+ Extension_8_0EB8(MAPY+10,3)]
  965.       If MO=0
  966.         TEX[505,38,630,46,"CX: "+ Extension_8_0EB8(XB,3)+" CY: "+ Extension_8_0EB8(YB,3)]
  967.       Else 
  968.         TEX[505,38,630,46,"Cur. Icon: "+ Extension_8_0EB8(XB,4)]
  969.       End If 
  970.       OLDSUM=SUM
  971.     End If 
  972.   End If 
  973.   If MO=2
  974.     T1=Deek(AWST+CUAW*64+XB*4) : T2=Deek(AWST+CUAW*64+XB*4+2)
  975.     SUM=CUAW+XB+T1+T2
  976.     If SUM<>AWSUM
  977.       TEX[505,14,630,22,"AutoWall Editor"]
  978.       TEX[505,22,630,30,"Current Def: "+ Extension_8_0EB8(CUAW,2)]
  979.       TEX[505,30,630,38,"Current Pos: "+ Extension_8_0EB8(XB,2)]
  980.       TEX[505,38,630,46,"T1: "+ Extension_8_0EB8(T1,3)+" T2: "+ Extension_8_0EB8(T2,3)]
  981.       AWSUM=SUM
  982.     End If 
  983.   End If 
  984.   If(MO=0 or MO=1 or MO=2 or MO=4) and VIMO>-1
  985.     If TILRAN1+TILRAN2<>TILSUM
  986.       If Length(2)=0 : Return : End If 
  987.       FILBOX[510,52,529+16*(TILRAN2-TILRAN1),69,0]
  988.       Ink 2 : Bar 530+16*(TILRAN2-TILRAN1),52 To 630,69
  989.       For A=0 To TILRAN2-TILRAN1
  990.         Paste Icon 512+A*16,53,A+TILRAN1+1
  991.       Next 
  992.       TILSUM=TILRAN1+TILRAN2
  993.       OTILRAN1=TILRAN1 : OTILRAN2=TILRAN2
  994.     End If 
  995.   End If 
  996. Return 
  997. UPDATSELLINE:
  998.   If TILRAN1=OTILRAN1 and TILRAN2=OTILRAN2 Then Return 
  999.   Screen 1 : Ink 1
  1000.   For A=Max(Min(TILRAN1-YOF*20,OTILRAN1-YOF*20),0) To Max(TILRAN2-YOF*20,OTILRAN2-YOF*20)
  1001.     I=A+YOF*20
  1002.     X=(A mod 20)*16 : Y=(A/20)*16
  1003.     Paste Icon X,Y,I+1
  1004.     If I=>TILRAN1 and I<=TILRAN2 Then Draw X,Y To X+15,Y : Draw X,Y+15 To X+15,Y+15
  1005.   Next 
  1006.   OTILRAN1=TILRAN1 : OTILRAN2=TILRAN2
  1007.   Screen 0
  1008. Return 
  1009. LOAAWDEF:
  1010.   FILEREQ[-1,480,160,-1,"Select an autowall definition", Extension_8_02F0(FAWD$), Extension_8_03E0(FAWD$),"#?.awd","Load","Abort","","P"]
  1011.   If Param$="" Then Return 
  1012.   FAWD$=Param$
  1013.   If Exist(FAWD$)=0
  1014.     REQUEST["File does not exist!","Sorry."]
  1015.     Return 
  1016.   End If 
  1017.   Trap Bload FAWD$,AWST+CUAW*64
  1018.   If Errtrap
  1019.     REQUEST["Error while loading definition!","What a pity :-("]
  1020.     Return 
  1021.   End If 
  1022.   Gosub VIEAUTOWALL
  1023. Return 
  1024. SAVAWDEF:
  1025.   FILEREQ[-1,480,160,-1,"Select an autowall definiton", Extension_8_02F0(FAWD$), Extension_8_03E0(FAWD$),"#?.awd","Save","Abort","","PS"]
  1026.   If Param$="" Then Return 
  1027.   FAWD$=Param$
  1028.   If Exist(FAWD$)
  1029.     REQUEST["File already exists, overwrite?","Overwrite|Cancel"]
  1030.     If Param=1 : Return : End If 
  1031.   End If 
  1032.   Trap Bsave FAWD$,AWST+CUAW*64 To AWST+CUAW*64+64
  1033.   If Errtrap
  1034.     REQUEST["Error while saving definiton!","Oh No!"]
  1035.   Else 
  1036.     REQUEST["Definition saved successfully!","Yeah!"]
  1037.   End If 
  1038.   FILEREQNOTIFY
  1039. Return 
  1040. LOAANDEF:
  1041.   FILEREQ[-1,480,160,-1,"Select a tileanim definition", Extension_8_02F0(FAND$), Extension_8_03E0(FAND$),"#?.tan","Load","Abort","","P"]
  1042.   If Param$="" Then Return 
  1043.   FAND$=Param$
  1044.   If Exist(FAND$)=0
  1045.     REQUEST["File does not exist!","Sorry."]
  1046.     Return 
  1047.   End If 
  1048.   Trap Extension_8_0464 FAND$,32
  1049.   If Errtrap
  1050.     REQUEST["Error while loading definition!","What a pity :-("]
  1051.     Return 
  1052.   End If 
  1053.   Gosub VIETILEANIM
  1054. Return 
  1055. SAVANDEF:
  1056.   FILEREQ[-1,480,160,-1,"Select a tileanim definiton", Extension_8_02F0(FAND$), Extension_8_03E0(FAND$),"#?.tan","Save","Abort","","PS"]
  1057.   If Param$="" Then Return 
  1058.   FAND$=Param$
  1059.   If Exist(FAND$)
  1060.     REQUEST["File already exists, overwrite?","Overwrite|Cancel"]
  1061.     If Param=1 : Return : End If 
  1062.   End If 
  1063.   Trap Extension_8_0472 FAND$,32
  1064.   If Errtrap
  1065.     REQUEST["Error while saving definiton!","Oh No!"]
  1066.   Else 
  1067.     REQUEST["Definition saved successfully!","Yeah!"]
  1068.   End If 
  1069.   FILEREQNOTIFY
  1070. Return 
  1071. LOAARDEF:
  1072.   FILEREQ[-1,480,160,-1,"Select an attributes definition", Extension_8_02F0(FARD$), Extension_8_03E0(FARD$),"#?.dat","Load","Abort","","P"]
  1073.   If Param$="" Then Return 
  1074.   FARD$=Param$
  1075.   If Exist(FARD$)=0
  1076.     REQUEST["File does not exist!","Sorry."]
  1077.     Return 
  1078.   End If 
  1079.   Trap Extension_8_0464 FARD$,31
  1080.   If Errtrap
  1081.     REQUEST["Error while loading definition!","What a pity :-("]
  1082.     Erase 31
  1083.     Return 
  1084.   End If 
  1085.   Gosub VIEATTRIBUTES
  1086. Return 
  1087. SAVARDEF:
  1088.   FILEREQ[-1,480,160,-1,"Select an attributes definiton", Extension_8_02F0(FARD$), Extension_8_03E0(FARD$),"#?.dat","Save","Abort","","PS"]
  1089.   If Param$="" Then Return 
  1090.   FARD$=Param$
  1091.   If Exist(FARD$)
  1092.     REQUEST["File already exists, overwrite?","Overwrite|Cancel"]
  1093.     If Param=1 : Return : End If 
  1094.   End If 
  1095.   Trap Extension_8_0472 FARD$,31
  1096.   If Errtrap
  1097.     REQUEST["Error while saving definiton!","Oh No!"]
  1098.   Else 
  1099.     REQUEST["Definition saved successfully!","Yeah!"]
  1100.   End If 
  1101.   FILEREQNOTIFY
  1102. Return 
  1103. LOAAUTOWALL:
  1104.   FILEREQ[-1,480,160,-1,"Select an autowall file", Extension_8_02F0(FAUW$), Extension_8_03E0(FAUW$),"#?.auw","Load","Abort","","P"]
  1105.   If Param$="" Then Return 
  1106.   FAUW$=Param$
  1107.   If Exist(FAUW$)=0
  1108.     REQUEST["File does not exist!","Sorry."]
  1109.     Return 
  1110.   End If 
  1111.   Trap Bload FAUW$,AWST
  1112.   If Errtrap
  1113.     REQUEST["Error while loading autowall file!","What a pity :-("]
  1114.     Return 
  1115.   End If 
  1116.   Gosub VIEAUTOWALL
  1117. Return 
  1118. SAVAUTOWALL:
  1119.   FILEREQ[-1,480,160,-1,"Select an autowall file", Extension_8_02F0(FAUW$), Extension_8_03E0(FAUW$),"#?.auw","Save","Abort","","PS"]
  1120.   If Param$="" Then Return 
  1121.   FAUW$=Param$
  1122.   If Exist(FAUW$)
  1123.     REQUEST["File already exists, overwrite?","Overwrite|Cancel"]
  1124.     If Param=1 : Return : End If 
  1125.   End If 
  1126.   Trap Extension_8_0472 FAUW$,30
  1127.   If Errtrap
  1128.     REQUEST["Error while saving autowall file!","Oh No!"]
  1129.   Else 
  1130.     REQUEST["All autowall definitions saved successfully!","Yeah!"]
  1131.   End If 
  1132.   FILEREQNOTIFY
  1133. Return 
  1134. LOAPTILE:
  1135.   FILEREQ[-1,480,160,-1,"Select a ptile file", Extension_8_02F0(FPTL$), Extension_8_03E0(FPTL$),"#?.ptl","Load","Abort","","P"]
  1136.   If Param$="" Then Return 
  1137.   FPTL$=Param$
  1138.   If Exist(FPTL$)=0
  1139.     REQUEST["File does not exist!","Sorry."]
  1140.     Return 
  1141.   End If 
  1142.   Trap Extension_8_0456 FPTL$-".ptl"+".pal",20
  1143.   If Errtrap=0
  1144.     Screen 1
  1145.     For A=0 To 31
  1146.       Colour A,Deek(Start(20)+A*2)
  1147.     Next 
  1148.     Screen 0
  1149.   End If 
  1150.   Trap Extension_8_0456 FPTL$,20
  1151.   If Errtrap
  1152.     Erase 20
  1153.     REQUEST["Error while loading ptiles!","What a pity :-("]
  1154.     Return 
  1155.   End If 
  1156.   ST=Start(20) : NI=Deek(ST)
  1157.    Extension_8_0A24 20
  1158.   Screen 1
  1159.   Erase 2
  1160.   For A=0 To NI-1
  1161.      Extension_8_0A36 0,0,A
  1162.     Get Icon A+1,0,0 To 16,16
  1163.   Next 
  1164.   Erase 20
  1165.   If MO=0 Then Gosub VIEMAP
  1166.   If MO=1 Then Gosub VIETILES
  1167.   Screen 0
  1168. Return 
  1169. SAVPTILE:
  1170.   FILEREQ[-1,480,160,-1,"Select a ptile file", Extension_8_02F0(FPTL$), Extension_8_03E0(FPTL$),"#?.ptl","Save","Abort","","PS"]
  1171.   If Param$="" Then Return 
  1172.   FPTL$=Param$
  1173.   If Exist(FPTL$)
  1174.     REQUEST["File already exists, overwrite?","Overwrite|Cancel"]
  1175.     If Param=1 : Return : End If 
  1176.   End If 
  1177.   Reserve As Work 20,64
  1178.   Screen 1
  1179.   For A=0 To 31
  1180.     Doke Start(20)+A*2,Colour(A)
  1181.   Next 
  1182.    Extension_8_0472 FPTL$-".ptl"+".pal",20
  1183.   Reserve As Work 20,4+32*5*NI
  1184.   ST=Start(20)
  1185.   Doke ST,NI
  1186.   Doke ST+2,4
  1187.   Add ST,4
  1188.   For A=0 To NI-1
  1189.     Paste Icon 0,0,A+1
  1190.     For P=0 To 4
  1191.       For Y=0 To 15
  1192.         Doke ST,Deek(Logbase(P)+Y*40) : Add ST,2
  1193.       Next 
  1194.     Next 
  1195.   Next 
  1196.   If MO=0 Then Gosub VIEMAP
  1197.   If MO=1 Then Gosub VIETILES
  1198.   Screen 0
  1199.   Trap Extension_8_0472 FPTL$,20
  1200.   If Errtrap
  1201.     REQUEST["Error while saving ptiles!","Oh No!"]
  1202.   Else 
  1203.     REQUEST["Ptiles saved successfully!","Yeah!"]
  1204.   End If 
  1205.   Erase 20
  1206.   FILEREQNOTIFY
  1207. Return 
  1208. LOAMAP:
  1209.   FILEREQ[-1,480,160,-1,"Select a map file", Extension_8_02F0(FMAP$), Extension_8_03E0(FMAP$),"#?.map","Load","Abort","","P"]
  1210.   If Param$="" Then Return 
  1211.   FMAP$=Param$
  1212.   If Exist(FMAP$)=0
  1213.     REQUEST["File does not exist!","Sorry."]
  1214.     Return 
  1215.   End If 
  1216.   Trap Extension_8_0464 FMAP$,20
  1217.   If Errtrap
  1218.     Erase 20
  1219.     REQUEST["Error while loading map!","What a pity :-("]
  1220.     Return 
  1221.   End If 
  1222.   ST=Start(20)
  1223.   If Leek(ST)= Extension_8_0998("GMAP")
  1224.     Erase 9
  1225.     Bank Swap 9,20
  1226.     ST=Start(9)
  1227.     MAPST=Start(9)+256
  1228.     MAPX=0 : MAPY=0
  1229.     MAPMAXX=Deek(ST+4)
  1230.     MAPMAXY=Deek(ST+6)
  1231.     MAPSCRX=Deek(ST+8)
  1232.     MAPSCRY=Deek(ST+10)
  1233.     If MAPSCRX=0 or MAPSCRY=0
  1234.       MAPSCRX=20
  1235.       MAPSCRY=11
  1236.     End If 
  1237.     Gosub VIEMAP
  1238.   Else 
  1239.     Gosub CONVOLDMAP
  1240.   End If 
  1241.   CLRUNDO
  1242. Return 
  1243. SAVMAP:
  1244.   FILEREQ[-1,480,160,-1,"Select a map file", Extension_8_02F0(FMAP$), Extension_8_03E0(FMAP$),"#?.map","Save","Abort","","PS"]
  1245.   If Param$="" Then Return 
  1246.   FMAP$=Param$
  1247.   If Exist(FMAP$)
  1248.     REQUEST["File already exists, overwrite?","Overwrite|Cancel"]
  1249.     If Param=1 : Return : End If 
  1250.   End If 
  1251.   Trap Extension_8_0472 FMAP$,9
  1252.   If Errtrap
  1253.     REQUEST["Error while saving map!","Oh No!"]
  1254.   Else 
  1255.     REQUEST["Map saved successfully!","Yeah!"]
  1256.   End If 
  1257.   FILEREQNOTIFY
  1258. Return 
  1259. CONVOLDMAP:
  1260.   REQUEST["This seems to be an old map file. Attempt to convert the map?","Convert|Cancel"]
  1261.   If Param=1 Then Erase 20 : Return 
  1262.   LE=Length(20)/2
  1263.   MX=LE/220
  1264.   NUMENT["Enter the width (in screens) of the map","Ok|Abort",6,0,MX]
  1265.   P=Val(Left$(Param$,1))
  1266.   NEWMAXX=Val(Mid$(Param$,2))*20
  1267.   If P=1 or NEWMAXX=0 Then Return 
  1268.   MY=(LE-(MX*220))/11
  1269.   NUMENT["Enter the height (in screens) of the map","Ok|Abort",MY,0,MY]
  1270.   P=Val(Left$(Param$,1))
  1271.   NEWMAXY=Val(Mid$(Param$,2))*11
  1272.   If P=1 or NEWMAXY=0 Then Return 
  1273.   LE=256+4*NEWMAXX*NEWMAXY
  1274.   REQUEST["The new map will take about"+Str$(LE)+" Bytes of memory.","Continue|Cancel"]
  1275.   If Param=1 Then Return 
  1276.   Reserve As Data 9,LE
  1277.   ST=Start(9)+256 : STO=Start(20)
  1278.   For Y=0 To NEWMAXY-1
  1279.     DRAPROCBAR[60,Y+1,NEWMAXY]
  1280.     For X=0 To NEWMAXX-1
  1281.       Doke ST+(X+Y*NEWMAXX)*4,Peek(STO+(X+Y*NEWMAXX)*2)-1
  1282.       Poke ST+(X+Y*NEWMAXX)*4+2,Peek(STO+X+(Y*NEWMAXX)*2+1)
  1283.     Next 
  1284.   Next 
  1285.   Erase 20
  1286.   ST=Start(9) : MAPST=Start(9)+256
  1287.   MAPMAXX=NEWMAXX : MAPMAXY=NEWMAXY
  1288.   Loke ST, Extension_8_0998("GMAP")
  1289.   Doke ST+4,MAPMAXX
  1290.   Doke ST+6,MAPMAXY
  1291.   Doke ST+8,20
  1292.   Doke ST+10,11
  1293.   MAPX=0 : MAPY=0 : If MO=0 Then Gosub VIEMAP
  1294.   CLRUNDO
  1295. Return 
  1296. LOAICONS:
  1297.   FILEREQ[-1,480,160,-1,"Select an icon bank", Extension_8_02F0(FICO$), Extension_8_03E0(FICO$),"#?.abk","Load","Abort","","P"]
  1298.   If Param$="" Then Return 
  1299.   FICO$=Param$
  1300.   If Exist(FICO$)=0
  1301.     REQUEST["File does not exist!","Sorry."]
  1302.     Return 
  1303.   End If 
  1304.   Erase 2
  1305.   Trap Load FICO$,2
  1306.   If Errtrap
  1307.     MO=-1 : Screen 1 : Cls : Screen 0
  1308.     Erase 2
  1309.     REQUEST["Error while loading icon bank!","What a pity :-("]
  1310.     Return 
  1311.   End If 
  1312.   Screen 1 : YOF=0 : NI=Length(2)
  1313.   Get Icon Palette 
  1314.   If MO=1 Then Gosub VIETILES
  1315.   If MO=0 Then Gosub VIEMAP
  1316.   Screen 0
  1317. Return 
  1318. SAVICONS:
  1319.   FILEREQ[-1,480,160,-1,"Select an icon bank", Extension_8_02F0(FICO$), Extension_8_03E0(FICO$),"#?.abk","Save","Abort","","PS"]
  1320.   If Param$="" Then Return 
  1321.   FICO$=Param$
  1322.   If Exist(FICO$)
  1323.     REQUEST["File already exists, overwrite?","Overwrite|Cancel"]
  1324.     If Param=1 : Return : End If 
  1325.   End If 
  1326.   Trap Save FICO$,2
  1327.   If Errtrap
  1328.     REQUEST["Error while saving icon bank!","Argl :("]
  1329.     Return 
  1330.   End If 
  1331. Return 
  1332. LOAPIC:
  1333.   FILEREQ[-1,480,160,-1,"Select an IFF picture", Extension_8_02F0(FPIC$), Extension_8_03E0(FPIC$),"","Load","Abort","","P"]
  1334.   If Param$="" Then Return 
  1335.   FPIC$=Param$
  1336.   If Exist(FPIC$)=0
  1337.     REQUEST["File does not exist!","Sorry."]
  1338.     Return 
  1339.   End If 
  1340.   Trap Load Iff FPIC$,2
  1341.   If Errtrap
  1342.     Trap Screen Close 2
  1343.     REQUEST["Error while loading picture!","What a pity :-("]
  1344.     Return 
  1345.   End If 
  1346.   Screen Display 2,128,40+85,320,176
  1347.   Screen 0
  1348.   REQUEST["Do you want to add the icons from this picture?","Append|Overwrite|Cancel"]
  1349.   P=Param
  1350.   If P=2 Then Screen Close 2 : Return 
  1351.   NI=Length(2) : LI=0
  1352.   If P=1 Then NI=0 : Erase 2
  1353.   Screen 2
  1354.   BX=Screen Width/17 : BY=Screen Height/17
  1355.   EL=0
  1356.   For Y=0 To BY-1
  1357.     For X=0 To BX-1
  1358.       Screen 0
  1359.       DRAPROCBAR[60,Y*BX+X+1,BX*BY]
  1360.       Screen 2
  1361.       For YY=1 To 16
  1362.         For XX=1 To 16
  1363.           Exit If Extension_8_039E(X*17+XX,Y*17+YY),2
  1364.         Next 
  1365.       Next 
  1366.       If XX=17 and YY=17 and EL=0
  1367.         Screen 0
  1368.         REQUEST["Keep empty tiles?","Yes|No"]
  1369.         If Param=0
  1370.           EL=1
  1371.         Else 
  1372.           EL=-1
  1373.         End If 
  1374.         Screen 2
  1375.       End If 
  1376.       If XX<>17 or YY<>17 Then LI=NI
  1377.       If XX=17 and YY=17 and EL=-1
  1378.         Ink 1 : Draw X*17+1,Y*17+1 To X*17+16,Y*17+16
  1379.         Draw X*17+16,Y*17+1 To X*17+1,Y*17+16
  1380.       Else 
  1381.         Inc NI
  1382.         Get Icon NI,X*17+1,Y*17+1 To X*17+17,Y*17+17
  1383.       End If 
  1384.     Next 
  1385.   Next 
  1386.   For A=LI+2 To NI
  1387.     Del Icon A
  1388.   Next 
  1389.   NI=LI+1
  1390.   Screen Close 2
  1391.   Screen 1 : YOF=0
  1392.   Get Icon Palette : If MO=1 Then Gosub VIETILES
  1393.   Screen 0
  1394. Return 
  1395. SAVPIC:
  1396.   FILEREQ[-1,480,160,-1,"Select an IFF picture", Extension_8_02F0(FPIC$), Extension_8_03E0(FPIC$),"","Save","Abort","","PS"]
  1397.   If Param$="" Then Return 
  1398.   FPIC$=Param$
  1399.   If Exist(FPIC$)
  1400.     REQUEST["File already exists, overwrite?","Overwrite|Cancel"]
  1401.     If Param=1 : Return : End If 
  1402.   End If 
  1403.   RX=20
  1404.   Screen Open 2,((RX*17)+15 and $FFF0),((NI+RX-1)/RX)*17,32,0
  1405.   Curs Off : Flash Off : Paper 0 : Pen 1 : Cls 
  1406.   Screen Display 2,128,40+85,320,176
  1407.   Screen 2 : View 
  1408.   Get Icon Palette 
  1409.   For A=0 To NI-1
  1410.     Paste Icon(A mod RX)*17+1,(A/RX)*17+1,A+1
  1411.   Next 
  1412.   Wait Vbl 
  1413.   Trap Save Iff FPIC$
  1414.   If Errtrap
  1415.     Screen Close 2
  1416.     REQUEST["Error while saving picture!","What a pity :-("]
  1417.     FILEREQNOTIFY
  1418.     Return 
  1419.   End If 
  1420.   Screen Close 2
  1421.   REQUEST["Picture saved successfully.","Great"]
  1422.   FILEREQNOTIFY
  1423. Return 
  1424. CLEARMAP2:
  1425.   If Length(9)=0 Then REQUEST["Define a map first!","Eh?"] : Return 
  1426.   REQUEST["Are you sure you want to clear the map?","Clear it!|Cancel"]
  1427.   If Param=1 Then Return 
  1428.   Gosub CLEARMAP
  1429.   If MO=0 Then Gosub VIEMAP
  1430.   CLRUNDO
  1431. Return 
  1432. CLEARMAP:
  1433.   MAPST=Start(9)+256
  1434.   If TILRAN1<>TILRAN2
  1435.     For Y=0 To MAPMAXY-1
  1436.       DRAPROCBAR[60,Y+1,MAPMAXY]
  1437.       For X=0 To MAPMAXX-1
  1438.         Doke MAPST+(X+Y*MAPMAXX)*4,TILRAN1+Rnd(TILRAN2-TILRAN1)
  1439.       Next 
  1440.     Next 
  1441.   Else 
  1442.     For Y=0 To MAPMAXY-1
  1443.       DRAPROCBAR[60,Y+1,MAPMAXY]
  1444.       For X=0 To MAPMAXX-1
  1445.         Doke MAPST+(X+Y*MAPMAXX)*4,TILRAN1
  1446.       Next 
  1447.     Next 
  1448.   End If 
  1449.   CLRUNDO
  1450. Return 
  1451. SETSIZE:
  1452.   NUMENT["Enter the width of one screen","Ok|Abort",20,0,40]
  1453.   P=Val(Left$(Param$,1))
  1454.   NEWSCRX=Val(Mid$(Param$,2))
  1455.   If P=1 or NEWSCRX<20 Then Return 
  1456.   NUMENT["Enter the height of one screen","Ok|Abort",11,0,22]
  1457.   P=Val(Left$(Param$,1))
  1458.   NEWSCRY=Val(Mid$(Param$,2))
  1459.   If P=1 or NEWSCRY<11 Then Return 
  1460.   NUMENT["Enter the width (in screens) of the map","Ok|Abort",10,0,100]
  1461.   P=Val(Left$(Param$,1))
  1462.   NEWMAXX=Val(Mid$(Param$,2))*NEWSCRX
  1463.   If P=1 or NEWMAXX=0 Then Return 
  1464.   NUMENT["Enter the height (in screens) of the map","Ok|Abort",10,0,100]
  1465.   P=Val(Left$(Param$,1))
  1466.   NEWMAXY=Val(Mid$(Param$,2))*NEWSCRY
  1467.   If P=1 or NEWMAXY=0 Then Return 
  1468.   If Length(9)
  1469.     REQUEST["Keep old map?","Yes|No"]
  1470.     If Param=1
  1471.       Erase 9 : Erase 20
  1472.     Else 
  1473.       Erase 20
  1474.       Bank Swap 9,20
  1475.     End If 
  1476.   Else 
  1477.     Erase 20
  1478.   End If 
  1479.   LE=256+4*NEWMAXX*NEWMAXY
  1480.   REQUEST["The new map will take about"+Str$(LE)+" Bytes of memory.","Continue|Cancel"]
  1481.   If Param=1
  1482.     If Length(20)
  1483.       Bank Swap 9,20
  1484.     End If 
  1485.     Return 
  1486.   End If 
  1487.   Reserve As Data 9,LE
  1488.   REQUEST["Use current tile(s) to fill the map?","Current|Back-Tile"]
  1489.   If Param=1
  1490.     TILRAN1=NULTIL : TILRAN2=NULTIL
  1491.   End If 
  1492.   Swap MAPMAXX,NEWMAXX
  1493.   Swap MAPMAXY,NEWMAXY
  1494.   Gosub CLEARMAP
  1495.   Swap MAPMAXX,NEWMAXX
  1496.   Swap MAPMAXY,NEWMAXY
  1497.   If Length(20)
  1498.     If MAPMAXX>NEWMAXX or MAPMAXY>NEWMAXY
  1499.       REQUEST["This will cut some parts of the old map. Are you sure you want this?","Ok|Cancel"]
  1500.       If Param=1
  1501.         Bank Swap 9,20
  1502.         Erase 20
  1503.         Return 
  1504.       End If 
  1505.     End If 
  1506.     ST=Start(9)+256 : STO=Start(20)+256
  1507.     For Y=0 To Min(MAPMAXY-1,NEWMAXY-1)
  1508.       DRAPROCBAR[60,Y+1,Min(MAPMAXY,NEWMAXY)]
  1509.       For X=0 To Min(MAPMAXX-1,NEWMAXX-1)
  1510.         Loke ST+(X+Y*NEWMAXX)*4,Leek(STO+(X+Y*MAPMAXX)*4)
  1511.       Next 
  1512.     Next 
  1513.     Erase 20
  1514.   End If 
  1515.   ST=Start(9) : MAPST=Start(9)+256
  1516.   MAPMAXX=NEWMAXX : MAPMAXY=NEWMAXY
  1517.   MAPSCRX=NEWSCRX : MAPSCRY=NEWSCRY
  1518.   Loke ST, Extension_8_0998("GMAP")
  1519.   Doke ST+4,MAPMAXX
  1520.   Doke ST+6,MAPMAXY
  1521.   Doke ST+8,MAPSCRX
  1522.   Doke ST+10,MAPSCRY
  1523.   If MO-1 Then MO=0
  1524.   MAPX=0 : MAPY=0 : If MO=0 Then Gosub VIEMAP
  1525.   CLRUNDO
  1526. Return 
  1527. KILGADS:
  1528.   For A=25 To 60
  1529.     DISGAD[A]
  1530.   Next 
  1531. Return 
  1532. Procedure CLRUNDO
  1533.   Shared UNDOST,REDOST
  1534.   Reserve As Work 14,20480
  1535.   UNDOST=Start(14)+8
  1536.   Loke UNDOST-8,UNDOST+8
  1537.   Loke UNDOST-4,Start(14)+Length(14)-256
  1538.   Doke UNDOST,-2 : Doke UNDOST+2,-2 : Doke UNDOST+4,-2 : Doke UNDOST+6,-2
  1539.   Reserve As Work 13,20480
  1540.   REDOST=Start(13)+8
  1541.   Loke REDOST-8,REDOST+8
  1542.   Loke REDOST-4,Start(13)+Length(13)-256
  1543.   Doke REDOST,-2 : Doke REDOST+2,-2 : Doke REDOST+4,-2 : Doke REDOST+6,-2
  1544. End Proc
  1545. Procedure NEWUNDO
  1546.   Shared UNDOST,REDOST
  1547.   UNDO=Leek(UNDOST-8)
  1548.   If Extension_8_0BE4(UNDO-2)<>-1
  1549.     Loke UNDO,-1 : Loke UNDO+4,-1
  1550.     Add UNDO,8
  1551.   End If 
  1552.   If UNDO=>Leek(UNDOST-4)
  1553.     Copy UNDOST+520,UNDO To UNDOST+8
  1554.     Loke UNDOST+8,-1 : Loke UNDOST+12,-1
  1555.     Add UNDO,-512
  1556.   End If 
  1557.   Loke UNDOST-8,UNDO
  1558.   Loke REDOST-8,REDOST+8
  1559. End Proc
  1560. Procedure PLTAUMO[X,Y,T]
  1561.   Shared AWST,MAPST,MAPMAXX,MAPMAXY
  1562.   For CW=0 To 31
  1563.     AD=AWST+CW*64
  1564.     For A=1 To 14
  1565.       T1=Deek(AD) : T2=Deek(AD+2) : Add AD,4
  1566.       Exit If T=>T1 and T<=T2 and T1<>0,2
  1567.     Next 
  1568.   Next 
  1569.   If CW=32 Then PLT[X,Y,T] : Pop Proc
  1570.   XB=X : YB=Y
  1571.   Gosub PUWALL : Gosub ENVMOD
  1572. Pop Proc
  1573. PUWALL:
  1574.   Gosub CHKWALL
  1575.   TYP=F10+F01*2+F21*4+F12*8
  1576.   T1=Deek(AWST+CW*64+TYP*4) : T2=Deek(AWST+CW*64+TYP*4+2)
  1577.   If T1=T2
  1578.     PLT[XB,YB,T1]
  1579.   Else 
  1580.     PLT[XB,YB,T1+Rnd(T2-T1)]
  1581.   End If 
  1582. Return 
  1583. CHKWALL:
  1584.   If YB>0
  1585.     AD=XB+(YB-1)*MAPMAXX : Gosub CHKEX
  1586.     F10=RE
  1587.   Else 
  1588.     F10=0
  1589.   End If 
  1590.   If XB>0
  1591.     AD=(XB-1)+YB*MAPMAXX : Gosub CHKEX
  1592.     F01=RE
  1593.   Else 
  1594.     F01=0
  1595.   End If 
  1596.   If XB<MAPMAXX-1
  1597.     AD=(XB+1)+YB*MAPMAXX : Gosub CHKEX
  1598.     F21=RE
  1599.   Else 
  1600.     F21=0
  1601.   End If 
  1602.   If YB<MAPMAXY-1
  1603.     AD=XB+(YB+1)*MAPMAXX : Gosub CHKEX
  1604.     F12=RE
  1605.   Else 
  1606.     F12=0
  1607.   End If 
  1608. Return 
  1609. CHKEX:
  1610.   T=Deek(MAPST+AD*4)
  1611.   For A=0 To 15
  1612.     T1=Deek(AWST+CW*64+A*4) : T2=Deek(AWST+CW*64+A*4+2)
  1613.     If T=>T1 and T<=T2 Then RE=1 : Return 
  1614.   Next 
  1615.   RE=0
  1616. Return 
  1617. ENVMOD:
  1618.   XG=XB : YG=YB
  1619.   G10=F10 : G01=F01 : G21=F21 : G12=F12
  1620.   If G10 Then XB=XG : YB=YG-1 : Gosub PUWALL
  1621.   If G01 Then XB=XG-1 : YB=YG : Gosub PUWALL
  1622.   If G21 Then XB=XG+1 : YB=YG : Gosub PUWALL
  1623.   If G12 Then XB=XG : YB=YG+1 : Gosub PUWALL
  1624.   XB=XG : YB=YG
  1625. Return 
  1626. End Proc
  1627. Procedure PLT[X,Y,T]
  1628.   Shared MAPST,MAPMAXX,UNDOST,MAPX,MAPY
  1629.   AD=MAPST+(X+Y*MAPMAXX)*4
  1630.   OT=Deek(AD)
  1631.   If OT=T and Deek(AD+2)=0 Then Pop Proc
  1632.   UNDO=Leek(UNDOST-8)
  1633.   Doke UNDO,X : Doke UNDO+2,Y : Doke UNDO+4,OT : Doke UNDO+6,Deek(AD+2)
  1634.   Add UNDO,8
  1635.   If UNDO=>Leek(UNDOST-4)
  1636.     Copy UNDOST+520,UNDO To UNDOST+8
  1637.     Loke UNDOST+8,-1 : Loke UNDOST+12,-1
  1638.     Add UNDO,-512
  1639.   End If 
  1640.   Loke UNDOST-8,UNDO
  1641.   Doke AD,T : Doke AD+2,0
  1642.   Paste Icon(X-MAPX)*16,(Y-MAPY)*16,T+1
  1643. End Proc
  1644. Procedure PATTR[X,Y,T]
  1645.   Shared MAPST,MAPMAXX,UNDOST,MAPX,MAPY
  1646.   AD=MAPST+(X+Y*MAPMAXX)*4
  1647.   OT=Deek(AD+2)
  1648. '  If OT=T Then Pop Proc 
  1649.   UNDO=Leek(UNDOST-8)
  1650.   Doke UNDO,X : Doke UNDO+2,Y : Doke UNDO+4,Deek(AD) : Doke UNDO+6,OT
  1651.   Add UNDO,8
  1652.   If UNDO=>Leek(UNDOST-4)
  1653.     Copy UNDOST+520,UNDO To UNDOST+8
  1654.     Loke UNDOST+8,-1 : Loke UNDOST+12,-1
  1655.     Add UNDO,-512
  1656.   End If 
  1657.   Loke UNDOST-8,UNDO
  1658.   Doke AD+2,T
  1659.   If T Then Ink 1 : Box(X-MAPX)*16,(Y-MAPY)*16 To(X-MAPX)*16+2,(Y-MAPY)*16+2
  1660. End Proc
  1661. Procedure UNDO
  1662.   Shared MAPST,MAPMAXX,UNDOST,MAPX,MAPY,MO,REDOST
  1663.   UNDO=Leek(UNDOST-8)
  1664.   REDO=Leek(REDOST-8)
  1665.   If Extension_8_0BE4(UNDO-2)=-2 Then REQUEST["No more undo.","Ok"] : Pop Proc
  1666.   Screen 1
  1667.   Loke REDO,-1 : Loke REDO+4,-1
  1668.   Add REDO,8
  1669.   While Extension_8_0BE4(UNDO-2)<>-2 and Extension_8_0BE4(UNDO-2)<>-1
  1670.     Add UNDO,-8
  1671.     X=Deek(UNDO) : Y=Deek(UNDO+2) : T=Deek(UNDO+4) : TT=Deek(UNDO+6)
  1672.     AD=MAPST+(X+Y*MAPMAXX)*4
  1673.     Loke REDO,Leek(UNDO) : Loke REDO+4,Leek(AD)
  1674.     Add REDO,8
  1675.     Doke AD,T : Doke AD+2,TT
  1676.     If MO=0
  1677.       Paste Icon(X-MAPX)*16,(Y-MAPY)*16,T+1
  1678.       If TT
  1679.         Ink 0 : Box(X-MAPX)*16,(Y-MAPY)*16 To(X-MAPX)*16+2,(Y-MAPY)*16+2
  1680.       End If 
  1681.     End If 
  1682.   Wend 
  1683.   Add UNDO,-8
  1684.   Loke UNDOST-8,UNDO
  1685.   Loke REDOST-8,REDO
  1686.   Screen 0
  1687. End Proc
  1688. Procedure REDO
  1689.   Shared MAPST,MAPMAXX,UNDOST,MAPX,MAPY,MO,REDOST
  1690.   UNDO=Leek(UNDOST-8)
  1691.   REDO=Leek(REDOST-8)
  1692.   If Extension_8_0BE4(REDO-2)=-2 Then REQUEST["No more redo.","Ok"] : Pop Proc
  1693.   Screen 1
  1694.   Loke UNDO,-1 : Loke UNDO+4,-1
  1695.   Add UNDO,8
  1696.   While Extension_8_0BE4(REDO-2)<>-2 and Extension_8_0BE4(REDO-2)<>-1
  1697.     Add REDO,-8
  1698.     X=Deek(REDO) : Y=Deek(REDO+2) : T=Deek(REDO+4) : TT=Deek(REDO+6)
  1699.     AD=MAPST+(X+Y*MAPMAXX)*4
  1700.     Loke UNDO,Leek(REDO) : Loke UNDO+4,Leek(AD)
  1701.     Add UNDO,8
  1702.     Doke AD,T : Doke AD+2,TT
  1703.     If MO=0
  1704.       Paste Icon(X-MAPX)*16,(Y-MAPY)*16,T+1
  1705.       If TT
  1706.         Ink 0 : Box(X-MAPX)*16,(Y-MAPY)*16 To(X-MAPX)*16+2,(Y-MAPY)*16+2
  1707.       End If 
  1708.     End If 
  1709.   Wend 
  1710.   Add REDO,-8
  1711.   Loke REDOST-8,REDO
  1712.   Loke UNDOST-8,UNDO
  1713.   Screen 0
  1714. End Proc
  1715. Procedure FILEREQNOTIFY
  1716.   Shared FIL$()
  1717.   FIL$(0)=""
  1718. End Proc
  1719. Procedure FILEREQ[SN,SX,SY,YP,T$,F$,D$,PAT$,OK$,FAIL$,FON$,OP$]
  1720.   Shared FIL$(),MXFILES
  1721.   OTH=TH
  1722.   Gosub INIT
  1723.   Gosub SETUPSCREEN
  1724.   Gosub REFRESH
  1725.   Multi Wait : Limit Mouse 
  1726.   OMK=0 : EXA=0 : ENT=0
  1727.   Do 
  1728.     If Timer>25 and RDIR=1
  1729.       Sort FIL$(0)
  1730.       Gosub REFRESH
  1731.       Timer=0
  1732.     End If 
  1733.     Repeat 
  1734.       If RDIR Then Gosub EXAMINDIR Else Multi Wait 
  1735.     Until Amos Here
  1736.     XM=X Screen(X Mouse) : YM=Y Screen(Y Mouse) : MK=Mouse Key : I$=Inkey$
  1737.     If MK=2 Then Gosub DEVLIST
  1738.     If I$<>"" and ENT>0
  1739.       STRGAD[ENT,I$]
  1740.       If Param=-1
  1741.         If ENT=6
  1742.           F$=Mid$(FB$(6),2) : BT=4
  1743.           FIL$(0)= Extension_8_08C4(FILOFF)+ Extension_8_08C4(MXNAMLEN)+RDIR$
  1744.           Exit 
  1745.         End If 
  1746.         If ENT=7
  1747.           DD$=D$
  1748.           D$=Mid$(FB$(7),2)
  1749.           If Exist(D$)
  1750.             Gosub NEWREAD
  1751.           Else 
  1752.             REQUEST["Directory "+D$+" not found!","Oh sorry!"]
  1753.             D$=DD$
  1754.             NEWTEX[7,"{"+D$]
  1755.           End If 
  1756.         End If 
  1757.         If ENT=8
  1758.           PAT$=Mid$(FB$(8),2)
  1759.           Gosub NEWREAD
  1760.         End If 
  1761.         ENT=0
  1762.       End If 
  1763.     End If 
  1764.     BT=0
  1765.     If MK=1 and OMK<>1
  1766.       CHKMOUSE[XM,YM,1,15]
  1767.       BT=Param
  1768.     End If 
  1769.     If BT and ENT Then NEWTEX[ENT,FB$(ENT)] : ENT=0
  1770.     If BT=1 Then Gosub DRAGSCREEN
  1771.     If BT=11 Then Gosub SELECT
  1772.     If BT=2 or BT=4 or BT=5
  1773.       If RDIR
  1774.         FIL$(0)=""
  1775.       Else 
  1776.         FIL$(0)= Extension_8_08C4(FILOFF)+ Extension_8_08C4(MXNAMLEN)+RDIR$
  1777.       End If 
  1778.       Exit 
  1779.     End If 
  1780.     If BT=3 Then Amos To Back 
  1781.     If BT>5 and BT<9 Then ENT=BT : STRGAD[BT,""]
  1782.     If BT=9 Then Gosub DEVLIST
  1783.     If BT=10 Then Gosub PARDIR
  1784.     If BT=12 Then Gosub DRAGSLIDER
  1785.     If BT=13 Then Gosub ARROWUP
  1786.     If BT=14 Then Gosub ARROWDOWN
  1787.     If BT=15 Then Gosub FLIPPAGE
  1788.     OMK=MK
  1789.   Loop 
  1790.   Screen Close SN
  1791.   For A=1 To 15
  1792.     DISGAD[A]
  1793.   Next 
  1794.   If BT=4 Then A$= Extension_8_03EC(D$)+F$ Else A$=""
  1795.   TH=OTH
  1796.   Trap Limit Mouse 
  1797. Pop Proc[A$]
  1798. INIT:
  1799.   If SN<0
  1800.     For A=0 To 7
  1801.       Trap Screen A
  1802.       If Errtrap : SN=A : Exit : End If 
  1803.     Next 
  1804.   End If 
  1805.   If T$="" Then T$="AMCAF File Selector"
  1806.   If D$="" Then D$= Extension_8_03E0(Dir$)
  1807.   If Instr(OP$,"P") Then PAT=1 Else PAT=0
  1808.   If Instr(OP$,"R") Then FIL$(0)=""
  1809.   If Instr(OP$,"D") Then DIONLY=1 Else DIONLY=0
  1810.   If Instr(OP$,"Q") Then QUICK=1 Else QUICK=0
  1811.   If Instr(OP$,"S") Then SAVREQ=1 Else SAVREQ=0
  1812.   KICK=Deek(Leek(4)+20)
  1813.   If KICK<37 Then PAT=0
  1814.   SX=Max(Min((SX+15) and $FFE0,640),160)
  1815.   SY=Max(Min(SY,256),96)
  1816.   If YP<40 Then YP=168-SY/2
  1817.   If FIL$(0)<>""
  1818.     RDIR$=Mid$(FIL$(0),5)
  1819.     If D$<>RDIR$
  1820.       FIL$(0)=""
  1821.       RDIR=1 : NUMFIL=0 : FILOFF=0 : SELFIL=-1
  1822.       Return 
  1823.     Else 
  1824.       SELFIL=-1
  1825.       FILOFF= Extension_8_098C(FIL$(0))
  1826.     End If 
  1827.     For A=1 To MXFILES
  1828.       Exit If FIL$(A)=Chr$(255)
  1829.     Next 
  1830.     NUMFIL=A-1
  1831.     MXNAMLEN= Extension_8_098C(Mid$(FIL$(0),3))
  1832.     RDIR=0
  1833.   Else 
  1834.     RDIR=1 : NUMFIL=0 : FILOFF=0 : SELFIL=-1
  1835.     MXNAMLEN=0
  1836.   End If 
  1837. Return 
  1838. SETUPSCREEN:
  1839.   Screen Open SN,SX,SY,4,$8000
  1840.   Curs Off : Flash Off : Paper 2 : Pen 1 : Cls 0
  1841.   Palette 0,$FFF,$AAA,$666
  1842.   Colour 17,$BDF : Colour 18,$6F : Colour 19,$12
  1843.   Screen Display SN,288-SX/4,YP,SX,SY
  1844.   If FON$<>""
  1845.     A=Val(Left$(FON$,2))
  1846.     If A>0
  1847.       Trap Extension_8_05B0 Mid$(FON$,3),A
  1848.       If Errtrap=0
  1849.         TH=A
  1850.       End If 
  1851.     End If 
  1852.   End If 
  1853.   Gr Writing 0
  1854.   DEFCLOWIN[2,0,0]
  1855.   FILBOX[0,TH+3,SX-1,SY-1,0]
  1856.   DEFTEX[1,19,0,SX-24,TH+2,"{"+T$,3]
  1857.   DEFSCRTBK[3,SX-23,0]
  1858.   A=Text Length("Pattern:")+8
  1859.   If DIONLY=0
  1860.     DEFTEX[6,A,SY-TH*2-9,SX-5,SY-TH-7,"{"+F$,7]
  1861.     TEX[4,FB(6,1),FB(6,0),FB(6,3),"}File:"]
  1862.     FY2=SY-TH*3-13
  1863.   Else 
  1864.     FY2=SY-TH*2-9
  1865.   End If 
  1866.   DEFTEX[7,A,FY2,SX-5,FY2+TH+2,"{"+D$,7]
  1867.   TEX[4,FB(7,1),FB(7,0),FB(7,3),"}Dir:"]
  1868.   If PAT
  1869.     DEFTEX[8,A,FY2-TH-4,SX-5,FY2-2,"{"+PAT$,7]
  1870.     TEX[4,FB(8,1),FB(8,0),FB(8,3),"}Pattern:"]
  1871.     FY2=FB(8,1)-2
  1872.   Else 
  1873.     FY2=FB(7,1)-2
  1874.   End If 
  1875.   DEFTEX[4,4,SY-TH-5,SX/4-2,SY-3,OK$,1]
  1876.   DEFTEX[9,SX/4+1,SY-TH-5,SX/2-3,SY-3,"Devices",1]
  1877.   DEFTEX[10,SX/2,SY-TH-5,SX/2+SX/4-4,SY-3,"Parent",1]
  1878.   If Right$(D$,1)=":" Then DEAGAD[10]
  1879.   DEFTEX[5,SX/2+SX/4-1,SY-TH-5,SX-5,SY-3,FAIL$,1]
  1880.   DEFARROWU[13,SX-22,FY2-17]
  1881.   DEFARROWD[14,SX-22,FY2-8]
  1882.   D=(FY2-TH-9)
  1883.   MXLIN=D/TH
  1884.   FY1=TH+7+(D-TH*MXLIN)/2
  1885.   DEFBOX[15,SX-22,TH+5,SX-5,FY2-18,3]
  1886.   DRASLIDER[15,FILOFF,MXLIN,NUMFIL,12]
  1887. Return 
  1888. PARDIR:
  1889.   If Right$(D$,1)=":" Then Return 
  1890.   If RDIR Then Extension_8_0660 
  1891.   D$= Extension_8_03E0(D$)
  1892.   Gosub NEWREAD
  1893. Return 
  1894. NEWREAD:
  1895.   If RDIR Then Extension_8_0660 
  1896.   NEWTEX[7,"{"+D$]
  1897.   EXA=0 : RDIR=1 : Gosub EXAMINDIR
  1898.   If Right$(D$,1)=":" Then DEAGAD[10] Else ACTGAD[10]
  1899.   ACTGAD[9]
  1900. Return 
  1901. DEVLIST:
  1902.   If RDIR=1 or Left$(FIL$(NUMFIL),1)=>"A" Then Return 
  1903.   FILOFF=NUMFIL
  1904.   F$=Dev First$("")
  1905.   While NUMFIL<MXFILES and(F$<>"")
  1906.     F$=Mid$(F$,2,Instr(F$,":")-1)
  1907.     TYP= Extension_8_02D0(F$)
  1908.     If TYP=0
  1909.       MXNAMLEN=Max(MXNAMLEN,Len(F$))
  1910.       Request Off 
  1911.       Trap Extension_8_0672 F$
  1912.       A=Errtrap
  1913.       Request On 
  1914.       If A=0
  1915.         NAM$= Extension_8_06D8 
  1916.         SOR$="A"+Upper$(F$)+Chr$(0)+"  <Dev> "+F$+Chr$(0)+" ("+NAM$+") "
  1917.       Else 
  1918.         SOR$="A"+Upper$(F$)+Chr$(0)+"  <Dev> "+F$+Chr$(0)+" "+ Extension_8_0522( Extension_8_0532 )
  1919.       End If 
  1920.       Inc NUMFIL
  1921.       FIL$(NUMFIL)=SOR$
  1922.     End If 
  1923.     If TYP=1
  1924.       MXNAMLEN=Max(MXNAMLEN,Len(F$))
  1925.       Inc NUMFIL
  1926.       FIL$(NUMFIL)="B"+Upper$(F$)+Chr$(0)+"  <Dir> "+F$+Chr$(0)+" Assign"
  1927.     End If 
  1928.     F$=Dev Next$
  1929.   Wend 
  1930.   Sort FIL$(0)
  1931.   FILOFF=Min(FILOFF,NUMFIL-MXLIN)
  1932.   Gosub REFRESH
  1933.   DEAGAD[9]
  1934. Return 
  1935. SELECT:
  1936.   Y=YM-FY1
  1937.   If Y<0 or Y>=FY1+MXLIN*TH Then Return 
  1938.   F=Y/TH+FILOFF+1
  1939.   If F>NUMFIL Then Return 
  1940.   TYP=Asc(FIL$(F))
  1941.   A$=Peek$(Varptr(FIL$(F))+Instr(FIL$(F),Chr$(0))+8,40,Chr$(0))
  1942.   If TYP=32
  1943.     D$= Extension_8_03EC(D$)+A$
  1944.     Gosub NEWREAD
  1945.   End If 
  1946.   If TYP=45
  1947.     F$=A$
  1948.     NEWTEX[6,"{"+F$]
  1949.     If SELFIL<>F
  1950.       If SELFIL-FILOFF=>0 and SELFIL-FILOFF<=MXLIN
  1951.         A=SELFIL-FILOFF-1 : SELFIL=-1
  1952.         Gosub LISTFILE
  1953.       End If 
  1954.       SELFIL=F : A=SELFIL-FILOFF-1 : Timer=0
  1955.       Gosub LISTFILE
  1956.     Else 
  1957.       If Timer<50 and SAVREQ=0
  1958.         BT=4
  1959.       End If 
  1960.     End If 
  1961.   End If 
  1962.   If TYP=65 or TYP=66
  1963.     D$=A$ : Gosub NEWREAD
  1964.   End If 
  1965. Return 
  1966. DRAGSCREEN:
  1967.   PUSHGAD[BT]
  1968.   A=YM
  1969.   Limit Mouse X Hard(0),40+A To X Hard(SX-1),296-SY+A
  1970.   Repeat 
  1971.     If RDIR : Gosub EXAMINDIR : Else Multi Wait : End If 
  1972.     YM=Y Screen(Y Mouse)-A : MK=Mouse Key : I$=Inkey$
  1973.     Add YP,YM
  1974.     Screen Display SN,,YP,,
  1975.   Until MK<>1
  1976.   Multi Wait : Limit Mouse 
  1977.   OMK=1
  1978.   RELEGAD[BT]
  1979. Return 
  1980. ARROWUP:
  1981.   PUSHGAD[BT]
  1982.   Repeat 
  1983.     Multi Wait 
  1984.     MK=Mouse Key : I$=Inkey$
  1985.     If FILOFF>0
  1986.       Dec FILOFF
  1987.       Gosub SCROLFILES
  1988.     End If 
  1989.   Until MK<>1
  1990.   RELEGAD[BT]
  1991. Return 
  1992. ARROWDOWN:
  1993.   PUSHGAD[BT]
  1994.   Repeat 
  1995.     Multi Wait 
  1996.     MK=Mouse Key : I$=Inkey$
  1997.     If FILOFF<NUMFIL-MXLIN
  1998.       Inc FILOFF
  1999.       Gosub SCROLFILES
  2000.     End If 
  2001.   Until MK<>1
  2002.   RELEGAD[BT]
  2003. Return 
  2004. DRAGSLIDER:
  2005.   DISGAD[12]
  2006.   O=YM-FB(12,1)
  2007.   Repeat 
  2008.     Multi Wait 
  2009.     XM=X Screen(X Mouse) : YM=Y Screen(Y Mouse) : MK=Mouse Key : I$=Inkey$
  2010.     DRAGSLIDER[15,YM-O,MXLIN,NUMFIL,12]
  2011.     If NUMFIL>MXLIN
  2012.       FILOFF=Param
  2013.       Gosub SCROLFILES
  2014.     End If 
  2015.   Until MK<>1
  2016.   ENAGAD[12]
  2017.   DRASLIDER[15,FILOFF,MXLIN,NUMFIL,12]
  2018.   OMK=1
  2019. Return 
  2020. REFRESH:
  2021.   DEFBOX[11,4,TH+5,SX-25,FY2,7]
  2022.   If NUMFIL>0
  2023.     For A=0 To Min(MXLIN-1,NUMFIL-1)
  2024.       Gosub LISTFILE
  2025.     Next 
  2026.     OLDOFF=FILOFF
  2027.   End If 
  2028.   If FB(12,4) and 1 Then DRASLIDER[15,FILOFF,MXLIN,NUMFIL,12]
  2029. Return 
  2030. SCROLFILES:
  2031.   If OLDOFF=FILOFF Then Return 
  2032.   X1=FB(11,0)+2 : X2=FB(11,2)-2 : Y1=FY1+1 : Y2=FY1+TH*MXLIN+1
  2033.   D=FILOFF-OLDOFF
  2034.   If Abs(D)>MXLIN-2 Then Gosub REFRESH : Return 
  2035.   If D>0
  2036.     Screen Copy SN,X1,Y1+D*TH,X2,Y2 To SN,X1,Y1
  2037.     For A=MXLIN-D To MXLIN-1
  2038.       Gosub LISTFILE
  2039.     Next 
  2040.   Else 
  2041.     Screen Copy SN,X1,Y1,X2,Y2+D*TH To SN,X1,Y1-D*TH
  2042.     For A=0 To -D-1
  2043.       Gosub LISTFILE
  2044.     Next 
  2045.   End If 
  2046.   OLDOFF=FILOFF
  2047.   If FB(12,4) and 1 Then DRASLIDER[15,FILOFF,MXLIN,NUMFIL,12]
  2048. Return 
  2049. FLIPPAGE:
  2050.   If NUMFIL<MXLIN Then Return 
  2051.   If YM>(FB(12,1)+FB(12,3))/2
  2052.     FILOFF=Min(FILOFF+MXLIN,NUMFIL-MXLIN)
  2053.   Else 
  2054.     FILOFF=Max(FILOFF-MXLIN,0)
  2055.   End If 
  2056.   Gosub REFRESH
  2057.   DRASLIDER[15,FILOFF,MXLIN,NUMFIL,12]
  2058. Return 
  2059. LISTFILE:
  2060.   If QUICK
  2061.     A$=FIL$(A+FILOFF+1)
  2062.     A$=Peek$(Varptr(A$)+Instr(A$,Chr$(0)),40,Chr$(0))
  2063.   Else 
  2064.     A$=FIL$(A+FILOFF+1)
  2065.     B$=Mid$(A$,Instr(A$,Chr$(0))+1)
  2066.     FIL$=Left$(B$,Instr(B$,Chr$(0))-1)
  2067.     RES$=Mid$(B$,Len(FIL$)+2)
  2068.     A$=FIL$+Space$(MXNAMLEN-(Len(FIL$)-8))+RES$
  2069.   End If 
  2070.   If Asc(FIL$(A+FILOFF+1))<>45
  2071.     TEX2[6,FY1+A*TH,SX-28,FY1+(A+1)*TH+1,"{"+A$]
  2072.   Else 
  2073.     TEX[6,FY1+A*TH,SX-28,FY1+(A+1)*TH+1,"{"+A$]
  2074.   End If 
  2075.   If A+FILOFF+1=SELFIL
  2076.     Gr Writing 2
  2077.     Ink 2 : Bar 8,FY1+A*TH+1 To SX-29,FY1+(A+1)*TH
  2078.     Gr Writing 0
  2079.   End If 
  2080. Return 
  2081. EXAMINDIR:
  2082.   If EXA=0
  2083.     FILOFF=0 : NUMFIL=0 : MXNAMLEN=5 : RDIR$=D$
  2084.     SELFIL=-1
  2085.     For A=1 To MXFILES
  2086.       FIL$(A)=Chr$(255)
  2087.     Next 
  2088.     Trap Extension_8_063A D$
  2089.     If Errtrap=0
  2090.       EXA=1 : Timer=0
  2091.     Else 
  2092.       Gosub REFRESH
  2093.       REQUEST[ Extension_8_0522( Extension_8_0532 )+"!","Cancel"]
  2094.       RDIR=0 : Return 
  2095.     End If 
  2096.   End If 
  2097.   If NUMFIL=MXFILES
  2098.      Extension_8_0660 
  2099.     Sort FIL$(0)
  2100.     RDIR=0
  2101.     Gosub REFRESH
  2102.     Return 
  2103.   End If 
  2104.   FIL$= Extension_8_064C 
  2105.   If FIL$=""
  2106.     Sort FIL$(0)
  2107.     Timer=0 : RDIR=0 : Gosub REFRESH
  2108.     Return 
  2109.   End If 
  2110.   TYP= Extension_8_0688 
  2111.   If QUICK=0
  2112.     DATE$=Mid$( Extension_8_0F0A( Extension_8_06F4 ),4)+" "+ Extension_8_0F1A( Extension_8_070E )
  2113.     COM$= Extension_8_0762 
  2114.     FLAG$= Extension_8_0728( Extension_8_0742 )
  2115.   End If 
  2116.   If TYP<0
  2117.     If DIONLY=0
  2118.       If KICK>36
  2119.         A= Extension_8_0300(FIL$,PAT$)
  2120.       Else 
  2121.         A=-1
  2122.       End If 
  2123.     Else 
  2124.       A=0
  2125.     End If 
  2126.     If A
  2127.       MXNAMLEN=Max(MXNAMLEN,Len(FIL$))
  2128.       SIZE$= Extension_8_0EC8( Extension_8_06A2 ,7)
  2129.       Inc NUMFIL
  2130.       If QUICK
  2131.         FIL$(NUMFIL)="-"+Upper$(FIL$)+Chr$(0)+SIZE$+" "+FIL$+Chr$(0)
  2132.       Else 
  2133.         SOR$="-"+Upper$(FIL$)+Chr$(0)+SIZE$+" "+FIL$+Chr$(0)+DATE$+" "+FLAG$+" "+COM$
  2134.         FIL$(NUMFIL)=SOR$
  2135.       End If 
  2136.     End If 
  2137.   Else 
  2138.     MXNAMLEN=Max(MXNAMLEN,Len(FIL$))
  2139.     Inc NUMFIL
  2140.     If QUICK
  2141.       FIL$(NUMFIL)=" "+Upper$(FIL$)+Chr$(0)+"  <Dir> "+FIL$+Chr$(0)
  2142.     Else 
  2143.       SOR$=" "+Upper$(FIL$)+Chr$(0)+"  <Dir> "+FIL$+Chr$(0)+DATE$+" "+FLAG$+" "+COM$
  2144.       FIL$(NUMFIL)=SOR$
  2145.     End If 
  2146.   End If 
  2147. Return 
  2148. End Proc
  2149. Procedure REQUEST[T$,OP$]
  2150.   Dim LIN$(20)
  2151.   OPT=1 : OTH=TH
  2152.   For A=1 To Len(OP$)
  2153.     If Mid$(OP$,A,1)="|" Then Inc OPT
  2154.   Next 
  2155.   If Screen=-1
  2156.     TH=8
  2157.     SX=Max(Len(OP$)*8+OPT*32+8+15,320) and $FE0
  2158.     LPR=SX/8-2
  2159.   Else 
  2160.     SX=Max(Text Length(OP$)+OPT*32+8+15,320) and $FE0
  2161.     LPR=SX/Text Length("M")-2
  2162.   End If 
  2163.   LI=0 : LP=1 : LILE=0
  2164.   For A=1 To Len(T$)
  2165.     P=Asc(Mid$(T$,A,1))
  2166.     Inc LILE
  2167.     If LILE>LPR
  2168.       LIN$(LI)=Mid$(T$,LP,SP-LP+1)
  2169.       LP=SP+2 : LILE=A-LP
  2170.       Inc LI
  2171.     End If 
  2172.     If P=32 Then SP=A-1
  2173.     If P=167 Then LILE=LPR+2 : SP=A-1
  2174.   Next 
  2175.   LIN$(LI)=Mid$(T$,LP) : Inc LI
  2176.   NBLI=LI-1
  2177.   SY=32+LI*TH
  2178.   If Screen=-1
  2179.     SN=0
  2180.     Screen Open SN,SX,SY,4,$8000
  2181.     Curs Off : Flash Off : Paper 2 : Pen 1 : Cls 0
  2182.     Palette 0,$FFF,$AAA,$666
  2183.     Colour 17,$BDF : Colour 18,$6F : Colour 19,$12
  2184.     Screen Display SN,288-SX/4,168-SY/2,SX,SY
  2185.     Gr Writing 0
  2186.     Wait Vbl : Limit Mouse 
  2187.     OLDSCR=-1
  2188.     XP=0 : YP=0
  2189.   Else 
  2190.     If Screen Height<SY or Screen Width<SX or Screen Colour<4
  2191.       OLDSCR=Screen
  2192.       For A=0 To 7
  2193.         Trap Screen A
  2194.         If Errtrap : SN=A : Exit : End If 
  2195.       Next 
  2196.       Screen Open SN,SX,SY,4,$8000
  2197.       Curs Off : Flash Off : Paper 2 : Pen 1 : Cls 0
  2198.       Get Palette OLDSCR
  2199.       Screen Display SN,288-SX/4,168-SY/2,SX,SY
  2200.       Gr Writing 0
  2201.       Wait Vbl : Limit Mouse 
  2202.       XP=0 : YP=0
  2203.     Else 
  2204.       XP=(Screen Width-SX)/2
  2205.       YP=(Screen Height-SY)/2
  2206.       SN=-1
  2207.       Get Cblock 9,XP-4,YP-2,SX+16,SY+4
  2208.       DRABOX[XP-4,YP-2,XP+SX+3,YP+SY+1,0]
  2209.       DRABOX[XP-2,YP-1,XP+SX+1,YP+SY,1]
  2210.       Limit Mouse X Hard(XP),Y Hard(YP) To X Hard(XP+SX-1),Y Hard(YP+SY-1)
  2211.     End If 
  2212.   End If 
  2213.   FILBOX[XP,YP,XP+SX-1,YP+SY-1,0]
  2214.   For A=0 To NBLI
  2215.     TEX[XP+4,YP+4+A*TH,XP+SX-5,YP+12+A*TH,LIN$(A)]
  2216.   Next 
  2217.   OP=0
  2218.   For A=1 To OPT
  2219.     NP=Instr(OP$,"|",OP+1) : If NP=0 Then NP=Len(OP$)+1
  2220.     T$=Mid$(OP$,OP+1,NP-OP-1)
  2221.     X1=XP+4+((A-1)*(SX-6))/OPT
  2222.     X2=XP+1+(A*(SX-6))/OPT
  2223.     DEFTEX[15+A,X1,YP+SY-TH-14,X2,YP+SY-3,T$,1]
  2224.     OP=NP
  2225.   Next 
  2226.   OMK=0
  2227.   Do 
  2228.     Repeat : Multi Wait : Until Amos Here
  2229.     XM=X Screen(X Mouse) : YM=Y Screen(Y Mouse) : MK=Mouse Key : I$=Inkey$
  2230.     BT=0
  2231.     If MK=1 and OMK<>1
  2232.       CHKMOUSE[XM,YM,16,15+OPT]
  2233.       BT=Param
  2234.     End If 
  2235.     Exit If BT
  2236.     OMK=MK
  2237.   Loop 
  2238.   For A=1 To OPT
  2239.     DISGAD[15+A]
  2240.   Next 
  2241.   Limit Mouse 
  2242.   If SN>-1
  2243.     Screen Close SN
  2244.     If OLDSCR>-1
  2245.       Screen OLDSCR
  2246.     End If 
  2247.   Else 
  2248.     Put Cblock 9
  2249.     Del Cblock 9
  2250.   End If 
  2251.   TH=OTH
  2252. End Proc[BT-16]
  2253. Procedure NUMENT[T$,OP$,DEFNUM,LOWER,UPPER]
  2254.   Dim LIN$(10)
  2255.   OPT=1 : OTH=TH
  2256.   For A=1 To Len(OP$)
  2257.     If Mid$(OP$,A,1)="|" Then Inc OPT
  2258.   Next 
  2259.   If Screen=-1
  2260.     TH=8
  2261.     SX=Max(Len(OP$)*8+OPT*32+8+15,320) and $FE0
  2262.     LPR=SX/8-2
  2263.   Else 
  2264.     SX=Max(Text Length(OP$)+OPT*32+8+15,320) and $FE0
  2265.     LPR=SX/Text Length("M")-2
  2266.   End If 
  2267.   LI=0 : LP=1 : LILE=0
  2268.   For A=1 To Len(T$)
  2269.     P=Asc(Mid$(T$,A,1))
  2270.     Inc LILE
  2271.     If LILE>LPR
  2272.       LIN$(LI)=Mid$(T$,LP,SP-LP+1)
  2273.       LP=SP+2 : LILE=A-LP
  2274.       Inc LI
  2275.     End If 
  2276.     If P=32 Then SP=A-1
  2277.     If P=167 Then LILE=LPR+2 : SP=A-1
  2278.   Next 
  2279.   LIN$(LI)=Mid$(T$,LP) : Inc LI
  2280.   NBLI=LI-1
  2281.   SY=48+LI*TH
  2282.   If Screen=-1
  2283.     SN=0
  2284.     Screen Open SN,SX,SY,4,$8000
  2285.     Curs Off : Flash Off : Paper 2 : Pen 1 : Cls 0
  2286.     Palette 0,$FFF,$AAA,$666
  2287.     Colour 17,$BDF : Colour 18,$6F : Colour 19,$12
  2288.     Screen Display SN,288-SX/4,168-SY/2,SX,SY
  2289.     Gr Writing 0
  2290.     Wait Vbl : Limit Mouse 
  2291.     OLDSCR=-1
  2292.     XP=0 : YP=0
  2293.   Else 
  2294.     If Screen Height<SY or Screen Width<SX or Screen Colour<4
  2295.       For A=0 To 7
  2296.         Trap Screen A
  2297.         If Errtrap : SN=A : Exit : End If 
  2298.       Next 
  2299.       OLDSCR=Screen
  2300.       Screen Open SN,SX,SY,4,$8000
  2301.       Curs Off : Flash Off : Paper 2 : Pen 1 : Cls 0
  2302.       Get Palette OLDSCR
  2303.       Screen Display SN,288-SX/4,168-SY/2,SX,SY
  2304.       Gr Writing 0
  2305.       Wait Vbl : Limit Mouse 
  2306.       XP=0 : YP=0
  2307.     Else 
  2308.       XP=(Screen Width-SX)/2
  2309.       YP=(Screen Height-SY)/2
  2310.       SN=-1
  2311.       Get Cblock 9,XP-4,YP-2,SX+16,SY+4
  2312.       DRABOX[XP-4,YP-2,XP+SX+3,YP+SY+1,0]
  2313.       DRABOX[XP-2,YP-1,XP+SX+1,YP+SY,1]
  2314.       Limit Mouse X Hard(XP),Y Hard(YP) To X Hard(XP+SX-1),Y Hard(YP+SY-1)
  2315.     End If 
  2316.   End If 
  2317.   FILBOX[XP,YP,XP+SX-1,YP+SY-1,0]
  2318.   For A=0 To NBLI
  2319.     TEX[XP+4,YP+4+A*TH,XP+SX-5,YP+12+A*TH,LIN$(A)]
  2320.   Next 
  2321.   DEFTEX[16,XP+4,YP+SY-TH*2-18,XP+SX-5,YP+SY-TH-16,"{"+Mid$(Str$(DEFNUM),2),7]
  2322.   OP=0
  2323.   For A=1 To OPT
  2324.     NP=Instr(OP$,"|",OP+1) : If NP=0 Then NP=Len(OP$)+1
  2325.     T$=Mid$(OP$,OP+1,NP-OP-1)
  2326.     X1=XP+4+((A-1)*(SX-6))/OPT
  2327.     X2=XP+1+(A*(SX-6))/OPT
  2328.     DEFTEX[16+A,X1,YP+SY-TH-14,X2,YP+SY-3,T$,1]
  2329.     OP=NP
  2330.   Next 
  2331.   OMK=0
  2332.   STRGAD[16,""]
  2333.   Do 
  2334.     Repeat : Multi Wait : Until Amos Here
  2335.     XM=X Screen(X Mouse) : YM=Y Screen(Y Mouse) : MK=Mouse Key : I$=Inkey$
  2336.     BT=17
  2337.     If I$<>""
  2338.       If I$<" " or(I$>="0" and I$<="9")
  2339.         If Not(I$="0" and NUM=0)
  2340.           STRGAD[16,I$]
  2341.           Exit If Param=-1
  2342.         End If 
  2343.       End If 
  2344.     End If 
  2345.     NUM=Val(Mid$(FB$(16),2))
  2346.     If NUM<LOWER
  2347.       NUM=LOWER
  2348.       NEWTEX[16,"{"+Mid$(Str$(NUM),2)]
  2349.       STRGAD[16,""]
  2350.     End If 
  2351.     If NUM>UPPER
  2352.       NUM=UPPER
  2353.       NEWTEX[16,"{"+Mid$(Str$(NUM),2)]
  2354.       STRGAD[16,""]
  2355.     End If 
  2356.     BT=0
  2357.     If MK=1 and OMK<>1
  2358.       CHKMOUSE[XM,YM,16,16+OPT]
  2359.       BT=Param
  2360.     End If 
  2361.     Exit If BT>16
  2362.     OMK=MK
  2363.   Loop 
  2364.   For A=1 To OPT+1
  2365.     DISGAD[15+A]
  2366.   Next 
  2367.   Limit Mouse 
  2368.   If SN>-1
  2369.     Screen Close SN
  2370.     If OLDSCR>-1
  2371.       Screen OLDSCR
  2372.     End If 
  2373.   Else 
  2374.     Put Cblock 9
  2375.     Del Cblock 9
  2376.   End If 
  2377.   TH=OTH
  2378.   A$= Extension_8_0EB8(BT-17,1)+Mid$(Str$(NUM),2)
  2379. End Proc[A$]
  2380. Procedure TXTENT[T$,OP$,DEFTXT$,NUMLET]
  2381.   Dim LIN$(10)
  2382.   OPT=1 : OTH=TH
  2383.   For A=1 To Len(OP$)
  2384.     If Mid$(OP$,A,1)="|" Then Inc OPT
  2385.   Next 
  2386.   If Screen=-1
  2387.     TH=8
  2388.     SX=Max(Len(OP$)*8+OPT*32+8+15,320) and $FE0
  2389.     LPR=SX/8-2
  2390.   Else 
  2391.     SX=Max(Text Length(OP$)+OPT*32+8+15,320) and $FE0
  2392.     LPR=SX/Text Length("M")-2
  2393.   End If 
  2394.   LI=0 : LP=1 : LILE=0
  2395.   For A=1 To Len(T$)
  2396.     P=Asc(Mid$(T$,A,1))
  2397.     Inc LILE
  2398.     If LILE>LPR
  2399.       LIN$(LI)=Mid$(T$,LP,SP-LP+1)
  2400.       LP=SP+2 : LILE=A-LP
  2401.       Inc LI
  2402.     End If 
  2403.     If P=32 Then SP=A-1
  2404.     If P=167 Then LILE=LPR+2 : SP=A-1
  2405.   Next 
  2406.   LIN$(LI)=Mid$(T$,LP) : Inc LI
  2407.   NBLI=LI-1
  2408.   SY=48+LI*TH
  2409.   If Screen=-1
  2410.     SN=0
  2411.     Screen Open SN,SX,SY,4,$8000
  2412.     Curs Off : Flash Off : Paper 2 : Pen 1 : Cls 0
  2413.     Palette 0,$FFF,$AAA,$666
  2414.     Colour 17,$BDF : Colour 18,$6F : Colour 19,$12
  2415.     Screen Display SN,288-SX/4,168-SY/2,SX,SY
  2416.     Gr Writing 0
  2417.     Wait Vbl : Limit Mouse 
  2418.     OLDSCR=-1
  2419.     XP=0 : YP=0
  2420.   Else 
  2421.     If Screen Height<SY or Screen Width<SX or Screen Colour<4
  2422.       For A=0 To 7
  2423.         Trap Screen A
  2424.         If Errtrap : SN=A : Exit : End If 
  2425.       Next 
  2426.       OLDSCR=Screen
  2427.       Screen Open SN,SX,SY,4,$8000
  2428.       Curs Off : Flash Off : Paper 2 : Pen 1 : Cls 0
  2429.       Get Palette OLDSCR
  2430.       Screen Display SN,288-SX/4,168-SY/2,SX,SY
  2431.       Gr Writing 0
  2432.       Wait Vbl : Limit Mouse 
  2433.       XP=0 : YP=0
  2434.     Else 
  2435.       XP=(Screen Width-SX)/2
  2436.       YP=(Screen Height-SY)/2
  2437.       SN=-1
  2438.       Get Cblock 9,XP-4,YP-2,SX+16,SY+4
  2439.       DRABOX[XP-4,YP-2,XP+SX+3,YP+SY+1,0]
  2440.       DRABOX[XP-2,YP-1,XP+SX+1,YP+SY,1]
  2441.       Limit Mouse X Hard(XP),Y Hard(YP) To X Hard(XP+SX-1),Y Hard(YP+SY-1)
  2442.     End If 
  2443.   End If 
  2444.   FILBOX[XP,YP,XP+SX-1,YP+SY-1,0]
  2445.   For A=0 To NBLI
  2446.     TEX[XP+4,YP+4+A*TH,XP+SX-5,YP+12+A*TH,LIN$(A)]
  2447.   Next 
  2448.   DEFTEX[16,XP+4,YP+SY-TH*2-18,XP+SX-5,YP+SY-TH-16,"{"+DEFTXT$,7]
  2449.   OP=0
  2450.   For A=1 To OPT
  2451.     NP=Instr(OP$,"|",OP+1) : If NP=0 Then NP=Len(OP$)+1
  2452.     T$=Mid$(OP$,OP+1,NP-OP-1)
  2453.     X1=XP+4+((A-1)*(SX-6))/OPT
  2454.     X2=XP+1+(A*(SX-6))/OPT
  2455.     DEFTEX[16+A,X1,YP+SY-TH-14,X2,YP+SY-3,T$,1]
  2456.     OP=NP
  2457.   Next 
  2458.   OMK=0
  2459.   STRGAD[16,""]
  2460.   Do 
  2461.     Repeat : Multi Wait : Until Amos Here
  2462.     XM=X Screen(X Mouse) : YM=Y Screen(Y Mouse) : MK=Mouse Key : I$=Inkey$
  2463.     BT=17
  2464.     If I$<>""
  2465.       STRGAD[16,I$]
  2466.       Exit If Param=-1
  2467.     End If 
  2468.     TXT$=Mid$(FB$(16),2)
  2469.     If Len(TXT$)>NUMLET
  2470.       NEWTEX[16,"{"+Left$(TXT$,NUMLET)]
  2471.       STRGAD[16,""]
  2472.     End If 
  2473.     BT=0
  2474.     If MK=1 and OMK<>1
  2475.       CHKMOUSE[XM,YM,16,16+OPT]
  2476.       BT=Param
  2477.     End If 
  2478.     Exit If BT>16
  2479.     OMK=MK
  2480.   Loop 
  2481.   For A=1 To OPT+1
  2482.     DISGAD[15+A]
  2483.   Next 
  2484.   Limit Mouse 
  2485.   If SN>-1
  2486.     Screen Close SN
  2487.     If OLDSCR>-1
  2488.       Screen OLDSCR
  2489.     End If 
  2490.   Else 
  2491.     Put Cblock 9
  2492.     Del Cblock 9
  2493.   End If 
  2494.   TH=OTH
  2495.   A$= Extension_8_0EB8(BT-17,1)+TXT$
  2496. End Proc[A$]
  2497. Procedure CHKMOUSE[XM,YM,LL,UL]
  2498.   For BT=LL To UL
  2499.     If XM=>FB(BT,0) and XM<=FB(BT,2) and YM=>FB(BT,1) and YM<=FB(BT,3) and(FB(BT,4) and 1) Then Exit 
  2500.   Next 
  2501.   If BT>UL Then Pop Proc[0]
  2502.   If FB(BT,4) and 2 Then Pop Proc[BT]
  2503.   OST=-1 : AA=0
  2504.   ST= Extension_8_093A(FB(BT,4) and 4,2)
  2505.   Repeat 
  2506.     Multi Wait 
  2507.     XM=X Screen(X Mouse) : YM=Y Screen(Y Mouse) : MK=Mouse Key : I$=Inkey$
  2508.     If XM=>FB(BT,0) and XM<=FB(BT,2) and YM=>FB(BT,1) and YM<=FB(BT,3) Then A=1 Else A=0
  2509.     If AA<>A Then AA=A : ST=1-ST
  2510.     If OST<>ST
  2511.       If ST
  2512.         PUSHGAD[BT]
  2513.       Else 
  2514.         RELEGAD[BT]
  2515.       End If 
  2516.       OST=ST
  2517.     End If 
  2518.   Until MK<>1
  2519.   If A=0 Then Pop Proc[0]
  2520.   If ST
  2521.     RELEGAD[BT]
  2522.   Else 
  2523.     PUSHGAD[BT]
  2524.   End If 
  2525. End Proc[BT]
  2526. Procedure DEFTEX[BT,X1,Y1,X2,Y2,T$,FL]
  2527.   TEXBOX[X1,Y1,X2,Y2, Extension_8_093A(FL and 4,2),T$]
  2528.   DEFGAD[BT,X1,Y1,X2,Y2,FL]
  2529.   FB$(BT)=T$
  2530. End Proc
  2531. Procedure DEFBOX[BT,X1,Y1,X2,Y2,FL]
  2532.   FILBOX[X1,Y1,X2,Y2, Extension_8_093A(FL and 4,2)]
  2533.   DEFGAD[BT,X1,Y1,X2,Y2,FL]
  2534. End Proc
  2535. Procedure DEFGAD[BT,X1,Y1,X2,Y2,FL]
  2536.   FB(BT,0)=X1 : FB(BT,1)=Y1
  2537.   FB(BT,2)=X2 : FB(BT,3)=Y2
  2538.   FB(BT,4)=FL
  2539.   FB$(BT)=""
  2540. End Proc
  2541. Procedure DEAGAD[BT]
  2542.   If(FB(BT,4) and 1)=0 Then Pop Proc
  2543.   FB(BT,4)=FB(BT,4) and $FE
  2544.   Set Pattern 2
  2545.   Ink 3 : Bar FB(BT,0),FB(BT,1) To FB(BT,2),FB(BT,3)
  2546.   Set Pattern 0
  2547. End Proc
  2548. Procedure ACTGAD[BT]
  2549.   If FB(BT,4) and 1 Then Pop Proc
  2550.   CLRGAD[BT]
  2551.   FB(BT,4)=FB(BT,4) or 1
  2552.   If FB$(BT)<>""
  2553.     TEXBOX[FB(BT,0),FB(BT,1),FB(BT,2),FB(BT,3), Extension_8_093A(FB(BT,4) and 4,2),FB$(BT)]
  2554.   Else 
  2555.     DRABOX[FB(BT,0),FB(BT,1),FB(BT,2),FB(BT,3), Extension_8_093A(FB(BT,4) and 4,2)]
  2556.   End If 
  2557. End Proc
  2558. Procedure DISGAD[BT]
  2559.   FB(BT,4)=FB(BT,4) and $FE
  2560. End Proc
  2561. Procedure ENAGAD[BT]
  2562.   FB(BT,4)=FB(BT,4) or 1
  2563. End Proc
  2564. Procedure CLRGAD[BT]
  2565.   FB(BT,4)=FB(BT,4) and $FE
  2566.   Ink 2 : Bar FB(BT,0),FB(BT,1) To FB(BT,2),FB(BT,3)
  2567. End Proc
  2568. Procedure PUSHGAD[BT]
  2569.   DRABOX[FB(BT,0),FB(BT,1),FB(BT,2),FB(BT,3),1]
  2570. End Proc
  2571. Procedure RELEGAD[BT]
  2572.   DRABOX[FB(BT,0),FB(BT,1),FB(BT,2),FB(BT,3),0]
  2573. End Proc
  2574. Procedure FILBOX[X1,Y1,X2,Y2,SE]
  2575.   Ink 2 : Bar X1+2,Y1+1 To X2-2,Y2-1
  2576.    Extension_8_0388 X1,Y2,2
  2577.    Extension_8_0388 X2,Y1,2
  2578.   Ink 1+SE*2 : Draw X1,Y2-1 To X1,Y1 : Draw To X2-1,Y1 : Draw X1+1,Y2-1 To X1+1,Y1
  2579.   Ink 3-SE*2 : Draw X1+1,Y2 To X2,Y2 : Draw To X2,Y1+1 : Draw X2-1,Y2 To X2-1,Y1+1
  2580. End Proc
  2581. Procedure NEWTEX[BT,T$]
  2582.   FB$(BT)=T$
  2583.   TEX[FB(BT,0)+1,FB(BT,1),FB(BT,2)-1,FB(BT,3),T$]
  2584. End Proc
  2585. Procedure TEXBOX[X1,Y1,X2,Y2,SE,T$]
  2586.   TEX[X1+1,Y1,X2-1,Y2,T$]
  2587.    Extension_8_0388 X1,Y2,2 : Extension_8_0388 X2,Y1,2
  2588.   Ink 1+SE*2 : Draw X1,Y2-1 To X1,Y1 : Draw To X2-1,Y1 : Draw X1+1,Y2-1 To X1+1,Y1
  2589.   Ink 3-SE*2 : Draw X1+1,Y2 To X2,Y2 : Draw To X2,Y1+1 : Draw X2-1,Y2 To X2-1,Y1+1
  2590. End Proc
  2591. Procedure TEX[X1,Y1,X2,Y2,T$]
  2592.   If Asc(T$)=123
  2593.     M=1 : T$=Mid$(T$,2)
  2594.   Else 
  2595.     If Asc(T$)=125
  2596.       M=2 : T$=Mid$(T$,2)
  2597.     Else 
  2598.       M=0
  2599.     End If 
  2600.   End If 
  2601.   TL=Text Length(T$)
  2602.   While TL>(X2-X1)-4
  2603.     T$=Left$(T$,Len(T$)-1)
  2604.     TL=Text Length(T$)
  2605.   Wend 
  2606.   If M=1
  2607.     X=X1+4 : Y=Y1+1
  2608.   Else 
  2609.     If M=2
  2610.       X=X2-Text Length(T$)-2 : Y=Y1+1
  2611.     Else 
  2612.       X=(X1+X2-TL)/2 : Y=(Y1+Y2-TH+2)/2
  2613.     End If 
  2614.   End If 
  2615.   If Y2>0 Then Ink 2 : Bar X1+1,Y1+1 To X2-1,Y2-1
  2616.   Ink 0 : Text X,Y+Text Base,T$
  2617. End Proc
  2618. Procedure TEX2[X1,Y1,X2,Y2,T$]
  2619.   If Asc(T$)=123
  2620.     M=1 : T$=Mid$(T$,2)
  2621.   Else 
  2622.     If Asc(T$)=125
  2623.       M=2 : T$=Mid$(T$,2)
  2624.     Else 
  2625.       M=0
  2626.     End If 
  2627.   End If 
  2628.   TL=Text Length(T$)
  2629.   While TL>(X2-X1)-4
  2630.     T$=Left$(T$,Len(T$)-1)
  2631.     TL=Text Length(T$)
  2632.   Wend 
  2633.   If M=1
  2634.     X=X1+4 : Y=Y1+1
  2635.   Else 
  2636.     If M=2
  2637.       X=X2-Text Length(T$)-2 : Y=Y1+1
  2638.     Else 
  2639.       X=(X1+X2-TL)/2 : Y=(Y1+Y2-TH+1)/2
  2640.     End If 
  2641.   End If 
  2642.   If Y2>0 Then Ink 2 : Bar X1+1,Y1+1 To X2-1,Y2-1
  2643.   Ink 1 : Text X,Y+Text Base,T$
  2644. End Proc
  2645. Procedure DRABOX[X1,Y1,X2,Y2,SE]
  2646.   Ink 1+SE*2 : Draw X1,Y2-1 To X1,Y1 : Draw To X2-1,Y1 : Draw X1+1,Y2-1 To X1+1,Y1
  2647.   Ink 3-SE*2 : Draw X1+1,Y2 To X2,Y2 : Draw To X2,Y1+1 : Draw X2-1,Y2 To X2-1,Y1+1
  2648. End Proc
  2649. Procedure STRGAD[BT,I$]
  2650.   Shared POS
  2651.   A$=FB$(BT)
  2652.   If I$=""
  2653.     POS=Len(A$)-1
  2654.   End If 
  2655.   If I$>Chr$(31) Then A$=Left$(A$,POS+1)+I$+Mid$(A$,POS+2) : Inc POS
  2656.   If I$=Chr$(8) and POS>0 Then A$=Left$(A$,POS)+Mid$(A$,POS+2) : Dec POS
  2657.   If I$=Cleft$ and POS>0 Then Dec POS
  2658.   If I$=Cright$ and POS<Len(A$)-1 Then Inc POS
  2659.   If I$=Chr$(13)
  2660.     NEWTEX[BT,A$]
  2661.     Pop Proc[-1]
  2662.   End If 
  2663.   NEWTEX[BT,A$]
  2664.   X1=FB(BT,0)+5+Text Length(Mid$(A$,2,POS)) : Y1=FB(BT,1)+1
  2665.   X2=X1+Max(Text Length(Mid$(A$,POS+2,1)),4)
  2666.   If X2<FB(BT,2)-4
  2667.     Gr Writing 2
  2668.     Ink 3 : Bar X1,Y1 To X2-1,Y1+TH-1
  2669.     Gr Writing 0
  2670.   End If 
  2671. End Proc[0]
  2672. Procedure DEFCLOWIN[BT,X,Y]
  2673.   DRACLOWIN[X,Y]
  2674.   DEFGAD[BT,X,Y,X+18,Y+TH+2,1]
  2675. End Proc
  2676. Procedure DRACLOWIN[X,Y]
  2677.   FILBOX[X,Y,X+18,Y+TH+2,0]
  2678.   Ink 0 : Box 7+X,3+Y To 11+X,Y+TH-1
  2679. End Proc
  2680. Procedure DEFSCRTBK[BT,X,Y]
  2681.   DRASCRTBK[X,Y]
  2682.   DEFGAD[BT,X,Y,X+22,Y+TH+2,1]
  2683. End Proc
  2684. Procedure DRASCRTBK[X,Y]
  2685.   FILBOX[X,Y,X+22,Y+TH+2,0]
  2686.   Ink 0 : Box 4+X,2+Y To 14+X,Y+TH/2+2
  2687.   Ink 2 : Bar 8+X,Y+TH/2 To 18+X,Y+TH
  2688.   Ink 0 : Box 8+X,Y+TH/2 To 18+X,Y+TH
  2689. End Proc
  2690. Procedure DEFARROWU[BT,X,Y]
  2691.   DRAARROWU[X,Y]
  2692.   DEFGAD[BT,X,Y,X+17,Y+8,3]
  2693. End Proc
  2694. Procedure DRAARROWU[X,Y]
  2695.   DRABOX[X,Y,X+17,Y+8,0]
  2696.    Extension_8_1016 X+4,Y+6 To X+8,Y+2,0
  2697.    Extension_8_1016 X+5,Y+6 To X+8,Y+3,0
  2698.    Extension_8_1016 X+9,Y+2 To X+13,Y+6,0
  2699.    Extension_8_1016 X+9,Y+3 To X+12,Y+6,0
  2700. End Proc
  2701. Procedure DEFARROWD[BT,X,Y]
  2702.   DRAARROWD[X,Y]
  2703.   DEFGAD[BT,X,Y,X+17,Y+8,3]
  2704. End Proc
  2705. Procedure DRAARROWD[X,Y]
  2706.   DRABOX[X,Y,X+17,Y+8,0]
  2707.    Extension_8_1016 X+4,Y+2 To X+8,Y+6,0
  2708.    Extension_8_1016 X+5,Y+2 To X+8,Y+5,0
  2709.    Extension_8_1016 X+9,Y+6 To X+13,Y+2,0
  2710.    Extension_8_1016 X+9,Y+5 To X+12,Y+2,0
  2711. End Proc
  2712. Procedure DRAPROCBAR[BT,POS,MX]
  2713.   X1=FB(BT,0)+2 : X2=FB(BT,2)-2 : Y1=FB(BT,1)+1 : Y2=FB(BT,3)-1
  2714.   DX=X2-X1
  2715.   PX=X1+(POS*DX)/MX
  2716.   If PX>X1 and PX<X2
  2717.     Ink 0 : Bar X1,Y1 To PX,Y2
  2718.     Ink 2 : Bar PX,Y1 To X2,Y2
  2719.   End If 
  2720.   If PX=X1 Then Ink 2 : Bar X1,Y1 To X2,Y2
  2721.   If PX=X2 Then Ink 0 : Bar X1,Y1 To X2,Y2
  2722. End Proc
  2723. Procedure DRASLIDER[BT,LINOFF,PAG,NUMLIN,NB]
  2724.   D=(FB(BT,3)-FB(BT,1))-4
  2725.   Y1=(LINOFF*D)/Max(NUMLIN,PAG)+FB(BT,1)+2
  2726.   Y2=((LINOFF+PAG)*D)/Max(NUMLIN,PAG)+FB(BT,1)+2
  2727.   DEFGAD[NB,FB(BT,0)+4,Y1,FB(BT,2)-4,Y2,3]
  2728.   Ink 2
  2729.   If Y1>FB(BT,1)+2 Then Bar FB(BT,0)+4,FB(BT,1)+1 To FB(BT,2)-4,Y1-1
  2730.   If Y2<FB(BT,3)-2 Then Bar FB(BT,0)+4,Y2+1 To FB(BT,2)-4,FB(BT,3)-1
  2731.   If Y2-Y1>0
  2732.     Ink 0 : Bar FB(BT,0)+4,Y1 To FB(BT,2)-4,Y2
  2733.   Else 
  2734.      Extension_8_1016 FB(BT,0)+4,Y1 To FB(BT,2)-4,Y2,0
  2735.   End If 
  2736. End Proc
  2737. Procedure DRAGSLIDER[BT,Y,PAG,NUMLIN,NB]
  2738.   Y1=FB(NB,1) : Y2=FB(NB,3) : D=Y2-Y1
  2739.   Y1=Min(Max(FB(BT,1)+2,Y),FB(BT,3)-2-D)
  2740.   Y2=Y1+D : FB(NB,1)=Y1 : FB(NB,3)=Y2
  2741.   Ink 2
  2742.   If Y1>FB(BT,1)+2 Then Bar FB(BT,0)+4,FB(BT,1)+1 To FB(BT,2)-4,Y1-1
  2743.   If Y2<FB(BT,3)-2 Then Bar FB(BT,0)+4,Y2+1 To FB(BT,2)-4,FB(BT,3)-1
  2744.   If Y2-Y1>0
  2745.     Ink 1 : Bar FB(BT,0)+4,Y1 To FB(BT,2)-4,Y2
  2746.   Else 
  2747.      Extension_8_1016 FB(BT,0)+4,Y1 To FB(BT,2)-4,Y2,1
  2748.   End If 
  2749.   D=FB(BT,3)-FB(BT,1)-4
  2750.   L=Min(((Y1-FB(BT,1)-2)*Max(NUMLIN,PAG)+D/2)/D,NUMLIN-PAG)
  2751. End Proc[L]