home *** CD-ROM | disk | FTP | other *** search
/ The Amiga Game Guide / AmigaGameGuide_CD.iso / Amiga / Tools / GRAC / source / GRACplayer2.amos / GRACplayer2.amosSourceCode < prev   
AMOS Source Code  |  1977-12-31  |  101KB  |  3,365 lines

  1. Set Buffer 100 : Request Off : Auto View Off : Bob Update Off : Synchro Off 
  2. 'NAME$=Command Line$ : Amos To Front : Amos Lock : Close Workbench 
  3. NAME$="work:bud/bud2.grac2"
  4. 'NAME$="work:GRAC2.0/gracdemo2/lethal_formula" 
  5. 'NAME$="work:cdstuff/experiment.grac2" 
  6. 'NAME$="work:cdstuff/tutorial/tutorial.grac2"
  7. 'main  
  8. Dim TXT$(1999) : Dim CH(99,1) : Dim CH$(99) : Dim DEV$(99)
  9. Dim B0B(99,5) : Dim ROOM(99,3) : Dim CHACT(10,99) : Dim CONT(3)
  10. Dim PIC(99) : Dim AN1M(99) : Dim SAM(99) : Dim CL0SE(99,3) : Dim ST(225)
  11. Global B0B(),ROOM(),PIC(),AN1M(),ST(),CONT(),CHACT(),SAM(),TXT$(),CH$(),DEV$(),CH(),CL0SE()
  12. 'controls
  13. Dim CSTUFF(15) : Dim VB(11,9) : Dim VB$(1,9) : Dim CZONE(8,15)
  14. Global CSTUFF(),VB(),VB$(),CZONE()
  15. 'inventory 
  16. Dim INV(11,99) : Dim INV$(99)
  17. Global INV(),INV$()
  18. 'room
  19. Dim WK(12,31) : Dim BK(23,31) : Dim FR(21,15) : Dim PNT(3,15) : Dim BK$(31) : Dim FR$(15)
  20. Global WK(),BK(),FR(),PNT(),FR$(),BK$()
  21. 'general 
  22. Dim CL(4,1) : Dim OL(2,2) : Dim VO(9) : Dim LODST(255,2) : Dim PRT$(5,10) : Dim FLAG(999) : Dim M1NV(4,10)
  23. Dim ER$(11) : Dim PAL(31) : Dim A(15,2) : Dim F0NT(1) : Dim FH(1) : Dim CHO1CE(10) : Dim P(4)
  24. Global CL(),OL(),VO(),LODST(),PAL(),PRT$(),ER$(),A(),FH(),F0NT(),CHO1CE(),FLAG(),P(),M1NV()
  25. 'character control 
  26. Dim IZ(4) : Dim PX(4) : Dim PY(4) : Dim I(4) : Dim OFF(4) : Dim CRD(32,2,5)
  27. Dim CPT(4) : Dim TURN(4) : Dim FRAME(4) : Dim ANG(4) : Dim SANG(4)
  28. Dim D(4) : Dim IPX(4) : Dim IPY(4) : Dim FPX(4) : Dim FPY(4) : Dim ACTIVE(4)
  29. Dim W(4) : Dim E(4) : Dim S(4) : Dim ST0P(4) : Dim FIRST(4) : Dim H(4)
  30. Dim IZM(4) : Dim IZL(4) : Dim Z(4) : Dim ZL(4) : Dim IL(4) : Dim HL(4)
  31. Dim CC(4) : Dim BFRAME(4)
  32. Global IZ(),PX(),PY(),I(),OFF(),CRD(),CPT(),TURN(),FRAME(),ANG(),SANG()
  33. Global D(),IPX(),IPY(),FPX(),FPY(),ACTIVE(),E(),W(),S(),ST0P(),FIRST(),H()
  34. Global IZM(),IZL(),Z(),ZL(),IL(),HL(),CC(),BFRAME()
  35. 'variables 
  36. Global LODST,INVL,UTIME,HY,HXREV,VB,SCONT,SCU,VBL,ROOMSEL,ITEM,SONG,MUS,SCR0LL,MMCH,LI1,LS1,V
  37. Global LTXT,OBJ,TYPE,OBJ2,TYPE2,XPM,YPM,FIRST,LAST,FRZE,ENTRY,STIME,P0P,CU,S4VE,NOW4LK,UPD4TE,PRT
  38. Global INV,XOFF,YOFF,MGE,PASTEX,PASTEY,PASTE,CLICK,SOBJ,FRAMECOUNT,R,R$,CPALETTE,FLOOR,HORIZON,SCALE
  39. Global AD,ST,B0BS,UCU,SPIC,INVD,MLINE,IN,ILEN,C0LUMN,ST4RTROOM,ST4RTCH,ST4RTPOINT,FIRSTLINE,MUS
  40. Global GTIME,RTIME,NP,MCH,VO1CEC,VO1CEH,VO1CEX,VO1CEY,T0TAL,T1MER,TST,T0TAL2,PAUSE,T1MER2,PST,PQ
  41. Global NAME$,MGE$,VER$
  42. Global QG,WG,LINEG,GCH
  43. DEF
  44. L0ADA
  45. MAIN
  46. Procedure DEF
  47.      VER$="2.0"
  48.      FLAG(0)=-1 : MUS=-1 : SCR0LL=-1 : CPALETTE=-1
  49.      For E=0 To 10 : CHO1CE(E)=-1 : Next 
  50.      For E=0 To 2 : OL(E,0)=-1 : Next 
  51.      For E=0 To 4 : CL(E,0)=-1 : Next 
  52.      ER$(0)="room"
  53.      ER$(1)="controls"
  54.      ER$(2)="inventory"
  55.      ER$(3)="close-up"
  56.      ER$(4)="picture"
  57.      ER$(5)="character"
  58.      ER$(6)="objects"
  59.      ER$(7)="sample"
  60.      ER$(8)="point"
  61.      ER$(9)="window"
  62.      ER$(10)="verb"
  63.      ER$(11)="message bar"
  64.      Erase 1 : Erase 2
  65.      Reserve As Work 98,5600 : Fill Start(98) To Start(98)+Length(98),-1
  66. End Proc
  67. Procedure MAIN
  68.      Do 
  69.           I$=Inkey$ : I1=Scancode : S1=Scanshift : If LI1>0 : I1=LI1 : S1=LS1 : End If 
  70.           If I1>79 and I1<90
  71.                If S1>0
  72.                     If Not S4VE
  73.                          CHECK["save game"+Str$(I1-79)]
  74.                          If Param : SAVGAME[I1-80] : End If 
  75.                     End If 
  76.                Else 
  77.                     If LI1>0
  78.                          LI1=0 : P=-1
  79.                     Else 
  80.                          CHECK["load game"+Str$(I1-79)] : P=Param
  81.                     End If 
  82.                     If P : LODGAME[I1-80] : End If 
  83.                End If 
  84.           Else If I$<>""
  85.                If I$="c" : MGE["Chip free "+Str$(Chip Free)] : End If 
  86.                If I$="m" : MGE["Memory free "+Str$(Chip Free+Fast Free)] : End If 
  87.                If I$="v" : MGE["Version "+VER$] : End If 
  88.                If I$="q"
  89.                     CHECK["quit?"]
  90.                     If Param : End : End If 
  91.                End If 
  92.           End If 
  93.           Screen 0
  94.           If Scin(X Mouse,Y Mouse)=0
  95.                If ACTIVE(MCH)<0
  96.                     If Mouse Key=1 or NP=-1
  97.                          NP=0 : While Mouse Key<>0 : Wend 
  98.                          X=X Screen(X Mouse) : Y=Y Screen(Y Mouse)
  99.                          PREMOVE[X,Y]
  100.                          MOVE[XPM,YPM,MCH,-1,-1]
  101.                          WA1TSTOP[MCH,0]
  102.                     Else If Mouse Key=2 or NP=-2
  103.                          NP=0 : While Mouse Key<>0 : Wend 
  104.                          ACTION
  105.                          I=-1 : B=-1 : C=16 : P=5 : ITEM=0 : OBJ2=-1
  106.                     End If 
  107.                Else 
  108.                     If Mouse Key<>0 : NP=-1*Mouse Key : End If 
  109.                End If 
  110.                If INVD=1
  111.                     PR1NT[""] : INVD=0
  112.                End If 
  113.           Else If Scin(X Mouse,Y Mouse)=7
  114.                If Mouse Key<>0 or NP<>0
  115.                     NP=0 : FINDBUTTON
  116.                     While Mouse Key<>0 : Wend 
  117.                     If VB(10,VB)>3 and ITEM=0 and OBJ2<>-1
  118.                          ITEM=-1 : I=-1 : B=-1 : C=16 : P=5
  119.                     Else If(ITEM=-1 or VB(10,VB)<4) and OBJ<>-1
  120.                          ACTION
  121.                          I=-1 : B=-1 : C=16 : P=5 : ITEM=0 : OBJ2=-1
  122.                     End If 
  123.                End If 
  124.                If INVD=0 and(VB(10,VB)<>3 and(VB(10,VB)<>6 or ITEM=0))
  125.                     INVENTORY : INVD=1
  126.                Else If INVD=1 and Not(VB(10,VB)<>3 and(VB(10,VB)<>6 or ITEM=0))
  127.                     PR1NT[""] : INVD=0
  128.                End If 
  129.           End If 
  130.           I=-1 : C=16 : B=-1 : P=5 : OBJ=-1 : Screen 0 : XM=X Mouse : YM=Y Mouse
  131.           If Scin(XM,YM)=0
  132.                For C=1 To 15
  133.                     C0L[C,XM,YM] : If Param and FR$(C)<>"" : Exit : End If 
  134.                Next 
  135.                FINDBACK[XM,YM] : B=Param : If B<>-1 : C=16 : End If 
  136.                For P=0 To 4
  137.                     If P<>MCH
  138.                          C0L[20+P,XM,YM] : If Param : C=16 : B=-1 : Exit : End If 
  139.                     End If 
  140.                Next 
  141.           Else 
  142.                FINDINV[X Mouse,Y Mouse] : I=Param
  143.           End If 
  144.           If VB(10,VB)<4
  145.                INV=2 : RM=3
  146.                MGE1$=VB$(0,VB)+" "
  147.                Gosub GTMGE
  148.           Else 
  149.                If ITEM=0
  150.                     OBJ2=-1 : MGE1$=VB$(0,VB)+" "
  151.                     If I>-1
  152.                          OBJ2=I
  153.                          MGE1$=MGE1$+INV$(I)
  154.                     End If 
  155.                Else 
  156.                     INV=5 : RM=6
  157.                     MGE1$=VB$(0,VB)+" "+INV$(OBJ2)+" "+VB$(1,VB)+" "
  158.                     Gosub GTMGE
  159.                End If 
  160.           End If 
  161.           If Timer-UTIME>5
  162.                If MGE2$<>MGE1$ : MGE[MGE1$] : MGE2$=MGE1$ : MGE1$="" : End If 
  163.                IZL(MCH)=IZM(MCH)
  164.                UPD4TE[0] : IZM(MCH)=IZ(MCH)
  165.                If IZM(MCH)<>IZL(MCH)
  166.                     If WK(11,IZM(MCH))<>-1
  167.                          ST[WK(11,IZM(MCH))]
  168.                     End If 
  169.                End If 
  170.                If T0TAL2>0 and T1MER>=T0TAL2
  171.                     T0TAL2=0 : ST[TST]
  172.                End If 
  173.                If PAUSE>0 and T1MER2>=PAUSE
  174.                     PAUSE=-1 : ST[PST]
  175.                End If 
  176.           End If 
  177.      Loop 
  178.      
  179.      GTMGE:
  180.      If VB(10,VB)=INV
  181.           C=16 : B=-1 : P=5
  182.      Else If VB(10,VB)=RM
  183.           I=-1
  184.      End If 
  185.      If C<>16
  186.           OBJ=C : MGE1$=MGE1$+FR$(C) : TYPE=0
  187.      Else If B<>-1
  188.           OBJ=B : MGE1$=MGE1$+BK$(B) : TYPE=1
  189.      Else If I>-1
  190.           OBJ=I : MGE1$=MGE1$+INV$(I) : TYPE=2
  191.      Else If P<>5
  192.           OBJ=P : MGE1$=MGE1$+CH$(B0B(ROOM(ROOMSEL,2),P+1)) : TYPE=3
  193.      End If 
  194.      Return 
  195.      
  196. End Proc
  197. Procedure MOVE[MX,MY,CH,FZ0NE,TURN]
  198.      If ACTIVE(CH)=0 : Pop Proc : End If 
  199.      If NOW4LK : Pop Proc : End If 
  200.      Change Mouse 1+SCONT+4
  201.      ST0P(CH)=-1
  202.      While ACTIVE(CH)<>-1 : Gosub CHECK : Wend 
  203.      ST0P(CH)=0
  204.      TURN(CH)=TURN
  205.      TIME=Timer
  206.      Dim ROUTE(99,1)
  207.      Dim PTS(99)
  208.      For Q=0 To 99
  209.           PTS(Q)=-1
  210.      Next 
  211.      
  212.      '  make list of zones to go through
  213.      PTS(0)=IZ(CH)
  214.      PNTER2=1
  215.      CHANGE=1
  216.      Do 
  217.           Gosub CHECK
  218.           If PTS(PNTER1)=-1 : CHANGE=0 : Exit : End If 
  219.           Z0NE=PTS(PNTER1) : Inc PNTER1
  220.           If(MX>=WK(0,Z0NE))<>(MX>WK(2,Z0NE)) and(MY>=WK(1,Z0NE))<>(MY>WK(3,Z0NE))
  221.                If FZ0NE=-1 or Z0NE=FZ0NE
  222.                     FZ=Z0NE
  223.                     Exit 
  224.                End If 
  225.           End If 
  226.           For W=4 To 7
  227.                If WK(W,Z0NE)<>-1
  228.                     If ROUTE(WK(W,Z0NE),1)=0 and WK(12,WK(W,Z0NE))
  229.                          ROUTE(WK(W,Z0NE),1)=1
  230.                          ROUTE(WK(W,Z0NE),0)=Z0NE
  231.                          PTS(PNTER2)=WK(W,Z0NE) : Inc PNTER2
  232.                     End If 
  233.                End If 
  234.           Next 
  235.      Loop 
  236.      If CHANGE=0 : Change Mouse 1+SCONT+3 : Pop Proc : End If 
  237.      
  238.      '  make list of points 
  239.      Z0NE=FZ
  240.      Q=0
  241.      While Z0NE<>IZ(CH)
  242.           PTS(Q)=Z0NE : Inc Q
  243.           Z0NE=ROUTE(Z0NE,0)
  244.      Wend 
  245.      PTS(Q)=IZ(CH)
  246.      
  247.      'list of coordinates 
  248.      CRD(0,0,CH)=PX(CH)
  249.      CRD(0,1,CH)=PY(CH)
  250.      CRD(0,2,CH)=PTS(Q)
  251.      CRD(Q+1,0,CH)=MX
  252.      CRD(Q+1,1,CH)=MY
  253.      CRD(Q+1,2,CH)=PTS(0)
  254.      CPT=1
  255.      If Q>0
  256.           For Z0NE=Q To 1 Step -1
  257.                Gosub CHECK
  258.                N=-1 : Gosub CORNERS
  259.                PX=CRD(CPT-1,0,CH)
  260.                PY=CRD(CPT-1,1,CH)
  261.                CRD(CPT,2,CH)=PTS(Q-CPT)
  262.                TX=0 : TY=0 : T=0
  263.                If BX and AY : TY=TY+SY1 : TX=TX+LX2 : Inc T : End If 
  264.                If AY and Not AX : TY=TY+SY1 : TX=TX+SX2 : Inc T : End If 
  265.                If BX and Not BY : TY=TY+LY1 : TX=TX+LX2 : Inc T : End If 
  266.                If Not(AX or BY) : TY=TY+LY1 : TX=TX+SX2 : Inc T : End If 
  267.                If Not(BX or AY) : TY=TY+SY2 : TX=TX+LX1 : Inc T : End If 
  268.                If BY and Not BX : TY=TY+LY2 : TX=TX+LX1 : Inc T : End If 
  269.                If AX and Not AY : TY=TY+SY2 : TX=TX+SX1 : Inc T : End If 
  270.                If AX and BY : TY=TY+LY2 : TX=TX+SX1 : Inc T : End If 
  271.                CRD(CPT,0,CH)=TX/T
  272.                CRD(CPT,1,CH)=TY/T
  273.                Inc CPT
  274.           Next 
  275.           For Z0NE=0 To Q-1
  276.                Gosub CHECK
  277.                N=1 : Gosub CORNERS
  278.                Dec CPT
  279.                D=1000
  280.                PX=CRD(CPT+1,0,CH)
  281.                PY=CRD(CPT+1,1,CH)
  282.                NX=CRD(CPT-1,0,CH)
  283.                NY=CRD(CPT-1,1,CH)
  284.                If BX and AY : D1=Sqr((PY-SY1)*(PY-SY1)+(PX-LX2)*(PX-LX2))+Sqr((NY-SY1)*(NY-SY1)+(NX-LX2)*(NX-LX2))
  285.                If D1<D : D=D1 : CRD(CPT,0,CH)=LX2 : CRD(CPT,1,CH)=SY1 : End If : End If 
  286.                If AY and Not AX : D1=Sqr((PY-SY1)*(PY-SY1)+(PX-SX2)*(PX-SX2))+Sqr((NY-SY1)*(NY-SY1)+(NX-SX2)*(NX-SX2))
  287.                If D1<D : D=D1 : CRD(CPT,0,CH)=SX2 : CRD(CPT,1,CH)=SY1 : End If : End If 
  288.                If BX and Not BY : D1=Sqr((PY-LY1)*(PY-LY1)+(PX-LX2)*(PX-LX2))+Sqr((NY-LY1)*(NY-LY1)+(NX-LX2)*(NX-LX2))
  289.                If D1<D : D=D1 : CRD(CPT,0,CH)=LX2 : CRD(CPT,1,CH)=LY1 : End If : End If 
  290.                If Not(AX or BY) : D1=Sqr((PY-LY1)*(PY-LY1)+(PX-SX2)*(PX-SX2))+Sqr((NY-LY1)*(NY-LY1)+(NX-SX2)*(NX-SX2))
  291.                If D1<D : D=D1 : CRD(CPT,0,CH)=SX2 : CRD(CPT,1,CH)=LY1 : End If : End If 
  292.                If Not(BX or AY) : D1=Sqr((PY-SY2)*(PY-SY2)+(PX-LX1)*(PX-LX1))+Sqr((NY-SY2)*(NY-SY2)+(NX-LX1)*(NX-LX1))
  293.                If D1<D : D=D1 : CRD(CPT,0,CH)=LX1 : CRD(CPT,1,CH)=SY2 : End If : End If 
  294.                If BY and Not BX : D1=Sqr((PY-LY2)*(PY-LY2)+(PX-LX1)*(PX-LX1))+Sqr((NY-LY2)*(NY-LY2)+(NX-LX1)*(NX-LX1))
  295.                If D1<D : D=D1 : CRD(CPT,0,CH)=LX1 : CRD(CPT,1,CH)=LY2 : End If : End If 
  296.                If AX and Not AY : D1=Sqr((PY-SY2)*(PY-SY2)+(PX-SX1)*(PX-SX1))+Sqr((NY-SY2)*(NY-SY2)+(NX-SX1)*(NX-SX1))
  297.                If D1<D : D=D1 : CRD(CPT,0,CH)=SX1 : CRD(CPT,1,CH)=SY2 : End If : End If 
  298.                If AX and BY : D1=Sqr((PY-LY2)*(PY-LY2)+(PX-SX1)*(PX-SX1))+Sqr((NY-LY2)*(NY-LY2)+(NX-SX1)*(NX-SX1))
  299.                If D1<D : D=D1 : CRD(CPT,0,CH)=SX1 : CRD(CPT,1,CH)=LY2 : End If : End If 
  300.           Next 
  301.           CPT=Q+1 : NREP=0
  302.           Repeat 
  303.                REP=0 : Inc NREP
  304.                F1RST=0 : L4ST=F1RST+2
  305.                While L4ST<=CPT
  306.                     While L4ST<=CPT
  307.                          Gosub CHECK
  308.                          IPX=CRD(F1RST,0,CH) : IPY=CRD(F1RST,1,CH)
  309.                          FPX=CRD(L4ST,0,CH) : FPY=CRD(L4ST,1,CH)
  310.                          D=Sqr((IPX-FPX)*(IPX-FPX)+(IPY-FPY)*(IPY-FPY))/2
  311.                          D=Max(D,1)
  312.                          R=F1RST+1
  313.                          For W=1 To D
  314.                               PX=IPX+(W*(FPX-IPX))/D
  315.                               PY=IPY+(W*(FPY-IPY))/D
  316.                               If(PX>=WK(0,CRD(R,2,CH)))<>(PX>WK(2,CRD(R,2,CH))) and(PY>=WK(1,CRD(R,2,CH)))<>(PY>WK(3,CRD(R,2,CH)))
  317.                                    If Abs(CRD(R,0,CH)-PX)>3 or Abs(CRD(R,1,CH)-PY)>3 : REP=-1 : End If 
  318.                                    CRD(R,0,CH)=PX : CRD(R,1,CH)=PY
  319.                                    Inc R : If R=L4ST : Exit : End If 
  320.                               Else If(PX>=WK(0,CRD(R-1,2,CH)))=(PX>WK(2,CRD(R-1,2,CH))) or(PY>=WK(1,CRD(R-1,2,CH)))=(PY>WK(3,CRD(R-1,2,CH)))
  321.                                    Exit 2
  322.                               End If 
  323.                          Next 
  324.                          Inc L4ST
  325.                     Wend 
  326.                     Inc F1RST : L4ST=F1RST+2
  327.                Wend 
  328.           Until REP=0 or NREP>1
  329.      End If 
  330.      CPT(CH)=CPT
  331.      ACTIVE(CH)=-2
  332.      FRAME(CH)=0
  333.      FIRST(CH)=0
  334.      Change Mouse 1+SCONT+3
  335.      Pop Proc
  336.      
  337.      CHECK:
  338.      If Timer-UTIME>6
  339.           UPD4TE[0]
  340.      End If 
  341.      Return 
  342.      
  343.      CORNERS:
  344.      SX1=WK(0,PTS(Z0NE))
  345.      LX1=WK(2,PTS(Z0NE))
  346.      SX2=WK(0,PTS(Z0NE+N))
  347.      LX2=WK(2,PTS(Z0NE+N))
  348.      SY1=WK(1,PTS(Z0NE))
  349.      LY1=WK(3,PTS(Z0NE))
  350.      SY2=WK(1,PTS(Z0NE+N))
  351.      LY2=WK(3,PTS(Z0NE+N))
  352.      If SX1<SX2
  353.           AX=0
  354.           If LX1<LX2
  355.                BX=0
  356.           Else 
  357.                BX=-1
  358.           End If 
  359.      Else 
  360.           AX=-1
  361.           If LX1<LX2
  362.                BX=0
  363.           Else 
  364.                BX=-1
  365.           End If 
  366.      End If 
  367.      If SY1<SY2
  368.           AY=0
  369.           If LY1<LY2
  370.                BY=0
  371.           Else 
  372.                BY=-1
  373.           End If 
  374.      Else 
  375.           AY=-1
  376.           If LY1<LY2
  377.                BY=0
  378.           Else 
  379.                BY=-1
  380.           End If 
  381.      End If 
  382.      Return 
  383.      
  384. End Proc
  385. Procedure WALK[E,W,CH]
  386.      DX=(E*(FPX(CH)-IPX(CH))*Z(CH))/(D(CH)*64)
  387.      DY=(E*(FPY(CH)-IPY(CH))*Z(CH))/(D(CH)*64)
  388.      PX(CH)=IPX(CH)+DX
  389.      PY(CH)=IPY(CH)+DY
  390.      Y1=WK(1,CRD(W-1,2,CH))
  391.      Y2=WK(3,CRD(W-1,2,CH))
  392.      Y3=WK(8,CRD(W-1,2,CH))
  393.      Y4=WK(9,CRD(W-1,2,CH))
  394.      If Y1<>Y2
  395.           OFF(CH)=(PY(CH)*(Y4-Y3)-Y1*Y4+Y2*Y3)/(Y2-Y1)
  396.      Else 
  397.           OFF(CH)=(Y3+Y4)/2
  398.      End If 
  399.      DX=4 : DY=2
  400.      EOL=Abs(PX(CH)-FPX(CH))<=DX and Abs(PY(CH)-FPY(CH))<=DY
  401.      If(W=CPT(CH) and EOL) or ST0P(CH)
  402.           If Not ST0P(CH)
  403.                If TURN(CH)=1
  404.                     SANG(CH)=0
  405.                Else If TURN(CH)=2
  406.                     SANG(CH)=$8000
  407.                Else If TURN(CH)=3
  408.                     SANG(CH)=2
  409.                Else If TURN(CH)=4
  410.                     SANG(CH)=1
  411.                End If 
  412.                TURN[SANG(CH),CH]
  413.           End If 
  414.           I(CH)=1+SANG(CH)
  415.           If SANG(CH)<100
  416.                H(CH)=37+4*SANG(CH)
  417.           Else H(CH)=37+SANG(CH)
  418.           End If 
  419.           ACTIVE(CH)=-1 : IZ(CH)=CRD(W,2,CH)
  420.           If ST0P(CH) : IZ(CH)=CRD(W-1,2,CH) : End If 
  421.      Else 
  422.           Add FRAME(CH),1,0 To 7
  423.           I(CH)=4+FRAME(CH)+ANG(CH)
  424.           If EOL : ACTIVE(CH)=-2 : IZ(CH)=CRD(W,2,CH) : End If 
  425.      End If 
  426. End Proc
  427. Procedure SWALK[W,CH]
  428.      AL=ANG(CH)
  429.      IPX(CH)=CRD(W-1,0,CH) : IPY(CH)=CRD(W-1,1,CH)
  430.      FPX(CH)=CRD(W,0,CH) : FPY(CH)=CRD(W,1,CH)
  431.      PX(CH)=IPX(CH) : PY(CH)=IPY(CH)
  432.      Trap ANG#=Abs((IPX(CH)-FPX(CH))*(IPY(CH)-FPY(CH))^(-1))
  433.      If Errtrap>0
  434.           ANG#=2
  435.      End If 
  436.      If ANG#>1
  437.           If FPX(CH)>IPX(CH)
  438.                ANG(CH)=0
  439.           Else 
  440.                ANG(CH)=$8000
  441.           End If 
  442.      Else 
  443.           If Abs(FPY(CH)-IPY(CH))>3
  444.                If(FPY(CH)>IPY(CH))=WK(9,CRD(W-1,2,CH))>(WK(8,CRD(W-1,2,CH)))
  445.                     ANG(CH)=8
  446.                Else 
  447.                     ANG(CH)=16
  448.                End If 
  449.           End If 
  450.      End If 
  451.      SANG1=ANG(CH)
  452.      If ANG(CH)=8 : SANG1=1 : End If 
  453.      If ANG(CH)=16 : SANG1=2 : End If 
  454.      If ANG(CH)<>AL and W<>1
  455.           FRAME(CH)=FRAME(CH)+4
  456.      End If 
  457.      If ANG(CH)<>0 and ANG(CH)<>$8000
  458.           D(CH)=Abs((IPY(CH)-FPY(CH)))/3
  459.      Else 
  460.           D(CH)=Abs((IPX(CH)-FPX(CH)))/5
  461.      End If 
  462.      If D(CH)=1 : D(CH)=2 : End If 
  463.      If W=CPT(CH) : If D(CH)=0 : D(CH)=1 : End If : End If 
  464.      If D(CH)>0
  465.           If W(CH)=1
  466.                TURN[SANG1,CH]
  467.           End If 
  468.           SANG(CH)=SANG1
  469.      End If 
  470.      If D(CH)=0
  471.           IZ(CH)=CRD(W,2,CH)
  472.      Else 
  473.           ACTIVE(CH)=-3
  474.      End If 
  475. End Proc
  476. Procedure PLACE[CH,PNT]
  477.      PNT=16-PNT
  478.      PX(CH)=PNT(0,PNT)
  479.      PY(CH)=PNT(1,PNT)
  480.      TURN(CH)=PNT(2,PNT)
  481.      Y1=WK(1,PNT(3,PNT))
  482.      Y2=WK(3,PNT(3,PNT))
  483.      Y3=WK(8,PNT(3,PNT))
  484.      Y4=WK(9,PNT(3,PNT))
  485.      Trap OFF(CH)=(PY(CH)*(Y4-Y3)-Y1*Y4+Y2*Y3)/(Y2-Y1)
  486.      If Errtrap<>0 : ERR0R[8,15-PNT,3] : End If 
  487.      If TURN(CH)=1
  488.           SANG(CH)=0
  489.      Else If TURN(CH)=2
  490.           SANG(CH)=$8000
  491.      Else If TURN(CH)=3
  492.           SANG(CH)=2
  493.      Else If TURN(CH)=4
  494.           SANG(CH)=1
  495.      End If 
  496.      TURN[SANG(CH),CH]
  497.      I(CH)=1+SANG(CH)
  498.      If SANG(CH)<100
  499.           H(CH)=37+4*SANG(CH)
  500.      Else H(CH)=37+SANG(CH)
  501.      End If 
  502.      ACTIVE(CH)=-1
  503.      IZ(CH)=PNT(3,PNT)
  504.      IZM(CH)=-1
  505. End Proc
  506. Procedure L0ADR[ROOMSEL]
  507.      OPENFILE[ROOM(ROOMSEL,0),Str$(ROOMSEL)+".room",ROOM(ROOMSEL,3),0,ROOMSEL]
  508.      Sam Stop : For Q=100 To 199 : If Length(Q)>0 : Erase Q : End If : Next : Extension_19_0062 15
  509.      For Q=30 To 45 : If Length(Q)>0 : Erase Q : End If : Next 
  510.      For Q=0 To 15 : A(Q,0)=0 : FR(21,Q)=0 : Next 
  511.      RTIME=0 : PAUSE=0 : HORIZON=0 : FLOOR=0 : SCALE=100
  512.      For Q=0 To 15
  513.           For W=0 To 11
  514.                RD : WK(W,Q)=R
  515.           Next 
  516.           For W=0 To 11
  517.                RD : WK(W,Q+16)=R
  518.           Next 
  519.           For W=0 To 22
  520.                RD : BK(W,Q)=R
  521.           Next 
  522.           For W=0 To 22
  523.                RD : BK(W,Q+16)=R
  524.           Next 
  525.           For W=0 To 20
  526.                RD : FR(W,Q)=R
  527.           Next 
  528.           For W=0 To 3
  529.                RD : PNT(W,Q)=R
  530.           Next 
  531.      Next 
  532.      For Q=0 To 49
  533.           RD : ST(Q)=R
  534.      Next 
  535.      Reserve As Work 20,Leek(AD)+4
  536.      Copy AD,AD+Leek(AD) To Start(20)
  537.      AD=AD+Leek(AD)
  538.      For Q=0 To 100
  539.           RT : T$=R$
  540.      Next 
  541.      For Q=1000 To 1999
  542.           RT : TXT$(Q)=R$
  543.      Next 
  544.      For Q=0 To 15
  545.           RT : BK$(Q)=R$
  546.           RT : BK$(Q+16)=R$
  547.           RT : FR$(Q)=R$
  548.      Next 
  549.      Erase 17
  550.      OK=0
  551.      If ROOM(ROOMSEL,2)=-1 : ERR0R[6,-1,4] : End If 
  552.      For Q=0 To 2
  553.           If OL(Q,0)>-1
  554.                If ROOM(ROOMSEL,2)=OL(Q,0) : OK=-1 : SOBJ=OL(Q,1) : End If 
  555.                If OL(Q,0)<>CONT(2) and OL(Q,0)<>ROOM(ROOMSEL,2)
  556.                     For W=1 To 100 : Del Bob OL(Q,1)+1 : Next : OL(Q,0)=-1 : OL(Q,2)=0
  557.                     O=OL(Q,1) : Gosub CORRECTOBJ
  558.                End If 
  559.           End If 
  560.      Next 
  561.      If Not OK
  562.           For Q=0 To 4
  563.                CC(Q)=Q
  564.                If CL(Q,0)>-1
  565.                     OK=0
  566.                     For W=0 To 4
  567.                          If B0B(ROOM(ROOMSEL,2),W+1)=CL(Q,0) : OK=-1 : End If 
  568.                     Next 
  569.                     If Not OK
  570.                          For W=1 To 100 : Del Bob CL(Q,1)+1 : Next : CL(Q,0)=-1
  571.                          O=CL(Q,1) : Gosub CORRECTOBJ
  572.                     End If 
  573.                End If 
  574.           Next 
  575.           REQUEST[B0B(ROOM(ROOMSEL,2),0),0]
  576.           Trap Load DEV$(B0B(ROOM(ROOMSEL,2),0))+"GRAC"+Str$(ROOM(ROOMSEL,2))+".object",1
  577.           If Errtrap<>0 : ERR0R[6,ROOM(ROOMSEL,2),1] : End If 
  578.           SOBJ=Length(1)-100 : Amreg(25)=SOBJ
  579.           For Q=0 To 2 : If OL(Q,0)=-1 : OL(Q,0)=ROOM(ROOMSEL,2) : OL(Q,1)=SOBJ : Exit : End If : Next 
  580.      End If 
  581.      For Q=0 To 2 : If OL(Q,0)=ROOM(ROOMSEL,2) : Exit : End If : Next 
  582.      If Not OL(Q,2)
  583.           OL(Q,2)=-1
  584.           For Q=0 To 4
  585.                If B0B(ROOM(ROOMSEL,2),Q+1)>-1
  586.                     OK=0
  587.                     For W=0 To 4 : If CL(W,0)=B0B(ROOM(ROOMSEL,2),Q+1) : OK=-1 : Exit : End If : Next 
  588.                     If Not OK
  589.                          REQUEST[CH(B0B(ROOM(ROOMSEL,2),Q+1),0),0]
  590.                          Trap Load DEV$(CH(B0B(ROOM(ROOMSEL,2),Q+1),0))+"GRAC"+Str$(B0B(ROOM(ROOMSEL,2),Q+1))+".character",1
  591.                          If Errtrap<>0 : ERR0R[5,B0B(ROOM(ROOMSEL,2),Q+1),1] : End If 
  592.                          S(Q)=Length(1)-100
  593.                          For W=0 To 4 : If CL(W,0)=-1 : CL(W,0)=B0B(ROOM(ROOMSEL,2),Q+1) : CL(W,1)=S(Q) : Exit : End If : Next 
  594.                     Else 
  595.                          S(Q)=CL(W,1)
  596.                     End If 
  597.                End If 
  598.           Next 
  599.      End If 
  600.      PICSEL=ROOM(ROOMSEL,1)
  601.      REQUEST[PIC(PICSEL),0]
  602.      Trap Load DEV$(PIC(PICSEL))+"GRAC"+Str$(PICSEL)+".picture",6
  603.      If Errtrap<>0 : ERR0R[4,PICSEL,1] : End If 
  604.      Trap Screen 6
  605.      If Errtrap>0
  606.           Screen Open 6,64,100,32,Lowres : Screen Hide 6
  607.           For Q=0 To 4
  608.                P(Q)=Phybase(Q)
  609.           Next 
  610.      End If 
  611.      Pop Proc
  612.      
  613.      CORRECTOBJ:
  614.      For E=0 To 2 : If OL(E,1)>O : OL(E,1)=OL(E,1)-100 : End If : Next 
  615.      For E=0 To 4 : If CL(E,1)>O : CL(E,1)=CL(E,1)-100 : End If : Next 
  616.      For E=0 To 4 : If S(E)>O : S(E)=S(E)-100 : End If : Next 
  617.      Return 
  618.      
  619. End Proc
  620. Procedure L0ADCU[CL0SESEL]
  621.      OPENFILE[CL0SE(CL0SESEL,0),Str$(CL0SESEL)+".closeup",CL0SE(CL0SESEL,3),3,CL0SESEL]
  622.      For Q=0 To 15
  623.           For W=0 To 8
  624.                RD : CZONE(W,Q)=R
  625.           Next 
  626.      Next 
  627.      For Q=201 To 225
  628.           RD : ST(Q)=R
  629.      Next 
  630.      Reserve As Work 24,Leek(AD)+4
  631.      Copy AD,AD+Leek(AD) To Start(24)
  632.      AD=AD+Leek(AD)
  633.      For Q=0 To 100
  634.           RT : T$=R$
  635.      Next 
  636.      Erase 17
  637.      OK=0
  638.      For Q=0 To 2
  639.           If OL(Q,0)>-1
  640.                If CL0SE(CL0SESEL,2)=OL(Q,0) : SCU=OL(Q,1) : OK=-1 : End If 
  641.           End If 
  642.      Next 
  643.      If Not OK
  644.           REQUEST[B0B(CL0SE(CL0SESEL,2),0),0]
  645.           Trap Load DEV$(B0B(CL0SE(CL0SESEL,2),0))+"GRAC"+Str$(CL0SE(CL0SESEL,2))+".object",1
  646.           If Errtrap<>0 : ERR0R[6,CL0SE(CL0SESEL,2),1] : End If 
  647.           SCU=Length(1)-100
  648.           For Q=0 To 2 : If OL(Q,0)=-1 : OL(Q,0)=CL0SE(CL0SESEL,2) : OL(Q,1)=SCU : OL(Q,2)=0 : Exit : End If : Next 
  649.      End If 
  650.      PICSEL=CL0SE(CL0SESEL,1)
  651.      REQUEST[PIC(PICSEL),0]
  652.      Trap Load DEV$(PIC(PICSEL))+"GRAC"+Str$(PICSEL)+".picture",6
  653.      If Errtrap<>0 : ERR0R[4,PICSEL,1] : End If 
  654. End Proc
  655. Procedure L0ADA
  656.      Open In 1,NAME$
  657.      L=Lof(1) : Close 1
  658.      Reserve As Work 17,L
  659.      Bload NAME$,17
  660.      L2=Leek(Start(17)+4)
  661.      Erase 17 : Reserve As Work 17,L2
  662.      Bload NAME$,Start(17)
  663.      L3= Extension_5_00E4(Start(17)+8,L-8)
  664.      AD=Start(17)+8
  665.      CONT(3)=Leek(AD) : AD=AD+4
  666.      INVL=Leek(AD) : AD=AD+4
  667.      For Q=0 To 99
  668.           ROOM(Q,3)=Leek(AD) : AD=AD+4
  669.      Next 
  670.      For Q=0 To 99
  671.           CL0SE(Q,3)=Leek(AD) : AD=AD+4
  672.      Next 
  673.      RP : INV=R
  674.      RP : CONT(0)=R
  675.      RP : CONT(1)=R
  676.      RP : CONT(2)=R
  677.      RP : SONG=R
  678.      RP : ST4RTROOM=R
  679.      RP : ST4RTCH=R
  680.      RP : ST4RTPOINT=R
  681.      RP : SIZE1=R
  682.      RP : SIZE2=R
  683.      For Q=0 To 99
  684.           RP : CH(Q,0)=R
  685.           RP : CH(Q,1)=R
  686.           For W=0 To 5
  687.                RP : B0B(Q,W)=R
  688.           Next W
  689.           RP : ROOM(Q,0)=R
  690.           RP : ROOM(Q,1)=R
  691.           RP : ROOM(Q,2)=R
  692.           RP : CL0SE(Q,0)=R
  693.           RP : CL0SE(Q,1)=R
  694.           RP : CL0SE(Q,2)=R
  695.           RP : PIC(Q)=R
  696.           RP : AN1M(Q)=R
  697.           RP : SAM(Q)=R
  698.      Next 
  699.      For Q=0 To 99
  700.           For W=0 To 10
  701.                RD : CHACT(W,Q)=R
  702.           Next 
  703.      Next 
  704.      For Q=150 To 200
  705.           RD : ST(Q)=R
  706.      Next 
  707.      Reserve As Work 23,Leek(AD)+4
  708.      Copy AD,AD+Leek(AD) To Start(23)
  709.      AD=AD+Leek(AD)
  710.      For Q=0 To 100
  711.           RT : T$=R$
  712.      Next 
  713.      For Q=0 To 999
  714.           RT : TXT$(Q)=R$
  715.      Next 
  716.      For Q=0 To 99
  717.           RT : DEV$(Q)=R$
  718.           RT : CH$(Q)=R$
  719.      Next 
  720.      F0NT1$=Peek$(AD,1000,"�") : AD=AD+Len(F0NT1$)+1
  721.      F0NT2$=Peek$(AD,1000,"�") : AD=AD+Len(F0NT2$)+1
  722.      MCH=ST4RTCH : MMCH=B0B(ROOM(ST4RTROOM,2),MCH+1)+1
  723.      Erase 17
  724.      Get Fonts 
  725.      F0NT[F0NT1$,SIZE1,0]
  726.      F0NT[F0NT2$,SIZE2,1]
  727.      Reserve As Work 47,100
  728.      L0ADC
  729.      L0ADI
  730.      L0ADR[ST4RTROOM]
  731.      If SONG>-1
  732.           REQUEST[SONG,0]
  733.           Trap Open In 1,DEV$(SONG)+"GRAC.song"
  734.           If Errtrap=0
  735.                L=Lof(1) : Close 1
  736.                If Chip Free>L+175000
  737.                      Extension_19_0006 DEV$(SONG)+"GRAC.song",2
  738.                End If 
  739.           End If 
  740.      End If 
  741.      DR4WROOM[Max(ST4RTPOINT,1),-1]
  742.      Limit Mouse 0,0 To 1000,1000
  743. End Proc
  744. Procedure L0ADI
  745.      OPENFILE[INV,".inv",INVL,2,-1]
  746.      For Q=0 To 99
  747.           For W=0 To 10
  748.                RD : INV(W,Q)=R
  749.           Next 
  750.      Next 
  751.      For Q=60 To 149
  752.           RD : ST(Q)=R
  753.      Next 
  754.      Reserve As Work 22,Leek(AD)+4
  755.      Copy AD,AD+Leek(AD) To Start(22)
  756.      AD=AD+Leek(AD)
  757.      For Q=0 To 100
  758.           RT : T$=R$
  759.      Next 
  760.      For Q=0 To 99
  761.           RT : INV$(Q)=R$
  762.      Next 
  763.      Erase 17
  764.      IN=0
  765.      For Q=0 To 99
  766.           L=Text Length(INV$(Q)+" ")
  767.           If L>ILEN : ILEN=L : End If 
  768.      Next 
  769.      IN=(CSTUFF(8)-CSTUFF(6))/ILEN
  770.      If IN>5 : IN=5 : End If 
  771. End Proc
  772. Procedure L0ADC
  773.      OPENFILE[CONT(0),".cont",CONT(3),1,-1]
  774.      For Q=0 To 15
  775.           RD : CSTUFF(Q)=R
  776.      Next 
  777.      For Q=0 To 9
  778.           For W=0 To 11
  779.                RD : VB(W,Q)=R
  780.           Next 
  781.      Next 
  782.      For Q=0 To 9
  783.           RD : ST(Q+50)=R
  784.      Next 
  785.      Reserve As Work 21,2000
  786.      Copy AD,AD+Leek(AD) To Start(21)
  787.      AD=AD+Leek(AD)
  788.      For Q=0 To 100
  789.           RT : T$=R$
  790.      Next 
  791.      For Q=0 To 9
  792.           RT : VB$(0,Q)=R$
  793.           RT : VB$(1,Q)=R$
  794.      Next 
  795.      Erase 17
  796.      If CONT(1)=-1 : ERR0R[4,-1,2] : End If 
  797.      If CSTUFF(6)=CSTUFF(8) or CSTUFF(7)=CSTUFF(9) : ERR0R[9,-1,2] : End If 
  798.      If CSTUFF(11)=0 : ERR0R[11,-1,2] : End If 
  799.      REQUEST[PIC(CONT(1)),0]
  800.      Trap Load DEV$(PIC(CONT(1)))+"GRAC"+Str$(CONT(1))+".picture",7
  801.      If Errtrap<>0 : ERR0R[4,CONT(1),1] : End If 
  802.      Unpack 7 To 7 : Screen Hide 7 : Erase 7 : Set Font F0NT(0)
  803.      If CSTUFF(14)=CSTUFF(15)
  804.           LITE=1 : For C=1 To 31 : If Colour(C)>Colour(LITE) : LITE=C : End If : Next 
  805.           CSTUFF(14)=LITE : CSTUFF(15)=0
  806.      End If 
  807.      Screen Display 7,CSTUFF(0),CSTUFF(1),,
  808.      Double Buffer : Autoback 0 : Bob Update Off 
  809.      If CONT(2)=-1 : ERR0R[6,-1,2] : End If 
  810.      REQUEST[B0B(CONT(2),0),0]
  811.      Screen Open 5,CSTUFF(2),FH(1)*2+8,32,Lowres : Screen Hide 5 : Set Font F0NT(1)
  812.      Get Bob 1,0,0 To CSTUFF(2),FH(1)+4
  813.      Get Bob 5,12,0,0 To 1,1 : Del Bob 12
  814.      Trap Load DEV$(B0B(CONT(2),0))+"GRAC"+Str$(CONT(2))+".object",1
  815.      If Errtrap<>0 : ERR0R[6,CONT(2),1] : End If 
  816.      SCONT=Length(1)-100 : Make Mask SCONT+1 : OL(0,0)=CONT(2) : OL(0,1)=SCONT
  817.      For VB=9 To 0 Step -1
  818.           If VB(0,VB)<>0 : Exit : End If 
  819.      Next 
  820.      If VB=-1 : ERR0R[10,-1,2] : End If 
  821.      VBL=-1
  822.      Screen 7
  823.      MLINE=(CSTUFF(9)-CSTUFF(7))/FH(0)-1
  824.      If MLINE>10 : MLINE=10 : End If 
  825.      Change Mouse 1+SCONT+3
  826. End Proc
  827. Procedure TURN[SANG1,CH]
  828.      If(SANG(CH)=$8000 and SANG1=0) or(SANG(CH)=0 and SANG1=$8000)
  829.           I(CH)=2 : H(CH)=37+4
  830.      Else If(SANG(CH)=1 and SANG1=2) or(SANG(CH)=2 and SANG1=1)
  831.           I(CH)=1 : H(CH)=37
  832.      End If 
  833. End Proc
  834. Procedure DR4WROOM[PNT,NEW]
  835.      Unpack 6 To 0 : Erase 6 : Double Buffer : Autoback 0 : Screen Hide 0
  836.      Screen To Front 7
  837.      Screen Display 0,CSTUFF(4),CSTUFF(5),CSTUFF(2),CSTUFF(3)
  838.      Screen 0
  839.      Limit Mouse 0,0 To 1000,1000
  840.      Priority On 
  841.      For Q=0 To 31
  842.           DR4W=-1
  843.           If BK(0,Q)<>-1
  844.                If BK(10,Q)>0
  845.                     If FLAG(BK(10,Q))=0 : DR4W=0 : End If 
  846.                Else If BK(10,Q)<0
  847.                     If FLAG(-1*BK(10,Q))<>0 : DR4W=0 : End If 
  848.                End If 
  849.           If DR4W : BK(23,Q)=-1 : Else BK(23,Q)=0 : End If 
  850.           End If 
  851.           DR4W=-1
  852.           If WK(0,Q)<>-1
  853.                If WK(10,Q)>0
  854.                     If FLAG(WK(10,Q))=0 : DR4W=0 : End If 
  855.                Else If WK(10,Q)<0
  856.                     If FLAG(-1*WK(10,Q))<>0 : DR4W=0 : End If 
  857.                End If 
  858.           If DR4W : WK(12,Q)=-1 : Else WK(12,Q)=0 : End If 
  859.           End If 
  860.      Next 
  861.      If NEW
  862.           For E=0 To 4
  863.                If MMCH=B0B(ROOM(ROOMSEL,2),E+1)+1 : MCH=E : Exit : End If 
  864.           Next 
  865.           If E=5 or MMCH=0 : ERR0R[5,-1,4] : End If 
  866.           For Q=0 To 4 : ACTIVE(Q)=0 : Next 
  867.           GTCH
  868.           ENTRY=PNT
  869.           PLACE[MCH,PNT]
  870.           UPD4TE=0 : B0BS=0 : LODST=0
  871.           ST[0]
  872.           If UPD4TE=0
  873.                UPD4TE=-1
  874.                If B0BS=0 : B0BS : End If 
  875.                UPD4TE[0]
  876.                PR1NT[""] : INVD=0
  877.                If LI1=0
  878.                     UPD4TE[0] : NICEIFF[0]
  879.                End If 
  880.           End If 
  881.           Screen Show 7 : Show On 
  882.      End If 
  883. End Proc
  884. Procedure H0TSP0T[N]
  885.      N1=N : If N>32000 : N1=N-$8000 : End If 
  886.      AD=Start(1)+2+(N1-1)*8
  887.      ADI=Leek(AD)
  888.      HX=Deek(ADI+6)
  889.      HY=Deek(ADI+8)
  890.      FLIP=Btst(15,HX)
  891.      If(N>32000)<>FLIP
  892.           Paste Bob 500,500,N : HX=Deek(ADI+6)
  893.      End If 
  894.      If HY>16384 : HY=65536-HY : End If 
  895.      HXREV=HX : Bclr 14,HXREV : Bclr 15,HXREV
  896.      If HXREV>16000 : HXREV=HXREV-$4000 : End If 
  897. End Proc
  898. Procedure UPD4TE[UPD4TEM]
  899. '     On Error Goto ERR
  900.      If Not UPD4TEM
  901.           UTIME=Timer : FRAMECOUNT=Max(FRAMECOUNT-1,0) : Inc T1MER : Inc T1MER2 : Inc GTIME : Inc RTIME
  902.           If STIME>0 : If Timer>STIME : Extension_19_0062 15 : End If : End If 
  903.           If Not FRZE
  904.                If MGE=-1
  905.                     Screen 7 : S$="" : While Text Length(S$)<LTXT : S$=S$+" " : Wend : LTXT=Text Length(MGE$)
  906.                End If 
  907.                For CH=0 To 4
  908.                     If ACTIVE(CH)<0
  909.                          If ACTIVE(CH)=-2
  910.                               While ACTIVE(CH)=-2 : Inc W(CH) : E(CH)=0 : SWALK[W(CH),CH] : Wend 
  911.                          End If 
  912.                          If ACTIVE(CH)=-3 and FIRST(CH)
  913.                               Inc E(CH) : WALK[E(CH),W(CH),CH]
  914.                          Else 
  915.                               FIRST(CH)=-1
  916.                          End If 
  917.                          If ACTIVE(CH)=-1 : W(CH)=0 : E(CH)=0 : End If 
  918.                          If S(CH)<>-1
  919.                               If OFF(CH)<=HORIZON
  920.                                    Z(CH)=(16*SCALE)/100
  921.                               Else If OFF(CH)=>FLOOR
  922.                                    Z(CH)=(64*SCALE)/100
  923.                               Else 
  924.                                    Z(CH)=((OFF(CH)-HORIZON)*64*SCALE)/((FLOOR-HORIZON)*100)
  925.                               End If 
  926.                               Z(CH)=Max(Z(CH),16)
  927.                               If I(CH)>32768
  928.                                    IR=I(CH)-32768+S(CH)
  929.                               Else IR=I(CH)+S(CH)
  930.                               End If 
  931.                               If Z(CH)<>ZL(CH) or I(CH)<>IL(CH) or H(CH)<>HL(CH)
  932.                                    Screen 6
  933.                                    If I(CH)<4 or I(CH)=32769 or I(CH)=BFRAME(CH)
  934.                                         AD2=Start(1)+2+(IR-1)*8
  935.                                         ADI=Leek(AD2)
  936.                                         SX1=Deek(ADI)*16
  937.                                         SY1=Deek(ADI+2)
  938.                                         H0TSP0T[I(CH)+S(CH)] : HY1=HY : HX1=HXREV
  939.                                         If H(CH)>32768
  940.                                              HR=H(CH)-32768+S(CH)
  941.                                         Else HR=H(CH)+S(CH)
  942.                                         End If 
  943.                                         AD2=Start(1)+2+(HR-1)*8
  944.                                         ADI=Leek(AD2)
  945.                                         SX2=Deek(ADI)*16
  946.                                         SY2=Deek(ADI+2)
  947.                                         H0TSP0T[H(CH)+S(CH)] : HY2=HY : HX2=HXREV
  948.                                         XP=Max(HX1,HX2) : YP=Max(HY1,HY2)
  949.                                         Cls 0
  950.                                         Paste Bob XP-HX1,YP-HY1,I(CH)+S(CH)
  951.                                         Paste Bob XP-HX2,YP-HY2,H(CH)+S(CH)
  952.                                         SX=XP+Max(SX1-HX1,SX2-HX2)
  953.                                         SY=YP+Max(SY1-HY1,SY2-HY2)
  954.                                    Else 
  955.                                         No Mask IR : Paste Bob 0,0,I(CH)+S(CH)
  956.                                         AD2=Start(1)+2+(IR-1)*8
  957.                                         ADI=Leek(AD2)
  958.                                         SX=Deek(ADI)*16
  959.                                         SY=Deek(ADI+2)
  960.                                         H0TSP0T[I(CH)+S(CH)] : YP=HY : XP=HXREV
  961.                                    End If 
  962.                                    DX=Max((SX*Z(CH))/64,1)
  963.                                    DY=Max((SY*Z(CH))/64,1)
  964.                                    If Z(CH)<>64 : Z00M[SX,SY,DX,DY] : End If 
  965.                                    Get Bob 6,2+CH,0,0 To Min(DX,64),Min(DY,100)
  966.                                    DY=(YP*Z(CH))/64+OFF(CH)-PY(CH)
  967.                                    DX=(XP*Z(CH))/64
  968.                                    Hot Spot 2+CH,DX,DY
  969.                               End If 
  970.                               Screen 0 : Bob 20+CH,PX(CH),OFF(CH),2+CH
  971.                               IL(CH)=I(CH) : ZL(CH)=Z(CH) : HL(CH)=H(CH)
  972.                          End If 
  973.                     Else 
  974.                          Bob Off 20+CH
  975.                     End If 
  976.                Next 
  977.                For B0B=0 To 15
  978.                     If A(B0B,0)<>0
  979.                          AD2=Start(30+B0B)+A(B0B,2)*6
  980.                          XA=Deek(AD2) : If XA>32768 : XA=XA-65536 : End If 
  981.                          YA=Deek(AD2+2) : If YA>32768 : YA=YA-65536 : End If 
  982.                          FA=Deek(AD2+4) : If FA>32768 : FA=FA-65536 : End If 
  983.                          Bob B0B,XA,YA,FA+SOBJ
  984.                          Inc A(B0B,2)
  985.                          If A(B0B,2)=A(B0B,1)
  986.                               If A(B0B,0)=1
  987.                                    A(B0B,0)=0
  988.                               Else 
  989.                                    A(B0B,2)=0
  990.                               End If 
  991.                          End If 
  992.                     End If 
  993.                Next 
  994.                Synchro 
  995.                Screen 0
  996.                If SCR0LL
  997.                     XOFF=Min(Max(PX(MCH)-CSTUFF(2)/2,0),Max(Screen Width(0)-CSTUFF(2),0))
  998.                     YOFF=Min(Max(PY(MCH)-CSTUFF(3)/2,0),Max(Screen Height(0)-CSTUFF(3),0))
  999.                End If 
  1000.                Screen Offset 0,XOFF,YOFF
  1001.                Screen Swap : Wait Vbl 
  1002.                Gosub UPD4TESTUFF
  1003.                Screen Swap : View : Wait Vbl 
  1004.                Gosub UPD4TESTUFF
  1005.                VBL=VB : MGE=0 : PRT=0 : PASTE=0
  1006.           End If 
  1007.      Else 
  1008.           If MGE=-1
  1009.                Screen 7 : S$="" : While Text Length(S$)<LTXT : S$=S$+" " : Wend : LTXT=Text Length(MGE$)
  1010.           End If 
  1011.           Screen Show 7 : Screen To Front 7
  1012.           Screen Swap : Wait Vbl 
  1013.           Gosub UPD4TESTUFF2
  1014.           Screen Swap : View : Wait Vbl 
  1015.           Gosub UPD4TESTUFF2
  1016.           VBL=VB : MGE=0 : PRT=0 : PASTE=0
  1017.      End If 
  1018.      If Timer-UTIME>4 : UTIME=Timer-4 : End If : Pop Proc
  1019.      
  1020.      UPD4TESTUFF:
  1021.      Bob Clear 
  1022.      If PASTE>0
  1023.           H0TSP0T[PASTE]
  1024.           Screen 0 : Paste Bob PASTEX-HXREV,PASTEY-HY,PASTE
  1025.      End If 
  1026.      Bob Draw 
  1027.      UPD4TESTUFF2:
  1028.      If VB<>VBL
  1029.           Screen 7
  1030.           If VBL<>-1
  1031.                H0TSP0T[VB(7,VBL)+SCONT]
  1032.                Paste Bob VB(5,VBL)-HXREV,VB(6,VBL)-HY,VB(7,VBL)+SCONT
  1033.           End If 
  1034.           H0TSP0T[VB(0,VB)+SCONT]
  1035.           Paste Bob VB(5,VB)-HXREV,VB(6,VB)-HY,VB(0,VB)+SCONT
  1036.      End If 
  1037.      If MGE=-1
  1038.           Screen 7
  1039.           Ink CSTUFF(14),CSTUFF(15)
  1040.           Text CSTUFF(10),CSTUFF(11),S$ : Text CSTUFF(10),CSTUFF(11),MGE$
  1041.      End If 
  1042.      If PRT<>0
  1043.           Screen 7
  1044.           Ink CSTUFF(15) : Bar CSTUFF(6),CSTUFF(7) To CSTUFF(8),CSTUFF(9)
  1045.           Ink CSTUFF(14),CSTUFF(15)
  1046.           For W=1 To PRT
  1047.                For E=0 To C0LUMN
  1048.                     Text CSTUFF(6)+E*ILEN,CSTUFF(7)+(PRT-W)*FH(0)+Text Base,PRT$(E,PRT-W)
  1049.                Next 
  1050.           Next 
  1051.      End If 
  1052.      Return 
  1053.  
  1054.      ERR: ERR0R[-1,-1,-1]
  1055.  
  1056. End Proc
  1057. Procedure F0NT[F0NT$,SIZE,N]
  1058.      F0NT(N)=1 : FH(N)=8 : F0NT=1
  1059.      If F0NT$="" : Pop Proc : End If 
  1060.      While Left$(Font$(F0NT),1)-" "<>""
  1061.           For W=Len(F0NT$)+1 To Len(Font$(F0NT))
  1062.                If Val(Right$(Font$(F0NT),Len(Font$(F0NT))-W))<>0 : FSIZE=Val(Right$(Font$(F0NT),Len(Font$(F0NT))-W)) : Exit : End If 
  1063.           Next 
  1064.           If Lower$(Left$(Font$(F0NT),Len(F0NT$)))=Lower$(F0NT$)
  1065.                If FSIZE=SIZE or SIZE=-1
  1066.                     F0NT(N)=F0NT : FH(N)=FSIZE : Exit 
  1067.                End If 
  1068.           End If 
  1069.           Inc F0NT
  1070.      Wend 
  1071. End Proc[F0NT]
  1072. Procedure MGE[TXT$]
  1073.      MGE$=TXT$
  1074.      MGE=-1
  1075. End Proc
  1076. Procedure PR1NT[TXT$]
  1077.      CLICK=(TXT$<>"")
  1078.      While TXT$<>""
  1079.           If Left$(TXT$,1)=" " : TXT$=Right$(TXT$,Len(TXT$)-1) : End If 
  1080.           For Q=1 To Len(TXT$)
  1081.                If Mid$(TXT$,Q,1)=" " or Q=Len(TXT$) or Mid$(TXT$,Q,1)="@"
  1082.                     If Text Length(Left$(TXT$,Q))>CSTUFF(8)-CSTUFF(6) or Q=Len(TXT$) or Mid$(TXT$,Q,1)="@"
  1083.                          Q1=Q
  1084.                          While Text Length(Left$(TXT$,Q1))>CSTUFF(8)-CSTUFF(6)
  1085.                               Repeat 
  1086.                                    Q1=Q1-1
  1087.                               Until Mid$(TXT$,Q1,1)=" "
  1088.                          Wend 
  1089.                          PRT$(0,W)=Left$(TXT$,Q1)-"@" : Inc W
  1090.                          TXT$=Right$(TXT$,Len(TXT$)-Q1)
  1091.                          If W=MLINE : Exit 2 : End If 
  1092.                          Exit 
  1093.                     End If 
  1094.                End If 
  1095.           Next 
  1096.      Wend 
  1097.      If CLICK
  1098.           PRT$(0,W)="<click to continue>" : Inc W
  1099.           PRT=W
  1100.      Else 
  1101.           PRT=1 : PRT$(0,0)=""
  1102.      End If 
  1103.      INVD=0 : C0LUMN=0
  1104. End Proc[TXT$]
  1105. Procedure CHOOSE
  1106.      Dim CHOOSE(10) : FIRSTC=0
  1107.      CL1NE: PR1NT[""] : MGE[""] : UPD4TE[0]
  1108.      For Q=0 To 10
  1109.           CHOOSE(Q)=-1
  1110.      Next 
  1111.      C=FIRSTC : W=0
  1112.      Repeat 
  1113.           If CHO1CE(C)<>-1
  1114.                If TXT$(CHO1CE(C))-" "<>""
  1115.                     PRT$(0,W)="* "+TXT$(CHO1CE(C)) : CHOOSE(W)=C : Inc W : Inc C
  1116.                Else 
  1117.                     Inc C
  1118.                End If 
  1119.           Else 
  1120.                Inc C
  1121.           End If 
  1122.      Until W=MLINE+1 or C=10
  1123.      MORE=0 : LASTC=C : If LASTC=10 : LASTC=0 : End If 
  1124.      If C<>10
  1125.           For E=C To 10 : If CHO1CE(E)<>-1 : MORE=-1 : End If : Next 
  1126.      Else If FIRSTC<>0
  1127.           For E=0 To FIRSTC : If CHO1CE(E)<>-1 : MORE=-1 : End If : Next 
  1128.      End If 
  1129.      If MORE
  1130.           If W=MLINE+1 : Dec W : Dec LASTC : End If 
  1131.           PRT$(0,W)="more..." : CHOOSE(W)=-2 : Inc W
  1132.      End If 
  1133.      PRT=W
  1134.      C=-1 : CL=-1
  1135.      While Mouse Key<>0 : Wend 
  1136.      Do 
  1137.           If Timer-UTIME>5
  1138.                UPD4TE[0]
  1139.           End If 
  1140.           Screen 7 : X=X Screen(X Mouse) : Y=Y Screen(Y Mouse)
  1141.           If X>CSTUFF(6) and Y>CSTUFF(7) and X<CSTUFF(8) and Y<CSTUFF(9)
  1142.                E=(Y-CSTUFF(7))/FH(0)
  1143.                If E>-1 and E<W
  1144.                     C=CHOOSE(E)
  1145.                End If 
  1146.                If Mouse Key>0 and C<>-1
  1147.                     Exit 
  1148.                End If 
  1149.           Else 
  1150.                C=-1
  1151.           End If 
  1152.           If CL<>C and C>-1
  1153.                MGE[TXT$(CHO1CE(C))]
  1154.           Else If CL<>C
  1155.                MGE[""]
  1156.           End If 
  1157.           CL=C
  1158.      Loop 
  1159.      If C=-2 : FIRSTC=LASTC : Goto CL1NE : End If 
  1160.      While Mouse Key>0 : Wend 
  1161. End Proc[C]
  1162. Procedure INVENTORY
  1163.      For Q=0 To 4
  1164.           For E=0 To 10
  1165.                M1NV(Q,E)=-1 : PRT$(Q,E)=""
  1166.           Next 
  1167.      Next 
  1168.      E=0 : W=0
  1169.      For Q=FIRST To 99
  1170.           If INV(11,Q)=B0B(ROOM(ROOMSEL,2),MCH+1)+1
  1171.                PRT$(E,W)=INV$(Q) : M1NV(E,W)=Q
  1172.                Inc W : If W=MLINE : Inc E : W=0 : If E=IN : Exit : End If : End If 
  1173.           End If 
  1174.      Next 
  1175.      If E>0 : W=MLINE : E=0 : End If 
  1176.      If Q<99
  1177.           For E=Q+1 To 99
  1178.                If INV(11,E)=B0B(ROOM(ROOMSEL,2),MCH+1)+1 : GE=E : PRT$(0,W)="more..." : M1NV(0,W)=-2 : Inc W : Exit : End If 
  1179.           Next 
  1180.           LAST=E
  1181.           If E=100 : E=0 : End If 
  1182.      End If 
  1183.      If(Q>98 or E=0) and FIRST>0
  1184.           For E=0 To FIRST-1
  1185.                If INV(11,E)=B0B(ROOM(ROOMSEL,2),MCH+1)+1 : PRT$(0,W)="more..." : M1NV(0,W)=-2 : Inc W : Exit : End If 
  1186.           Next 
  1187.           LAST=E
  1188.           If E=100 : E=0 : End If 
  1189.      End If 
  1190.      PRT=W : C0LUMN=IN
  1191.      If W=0 : PR1NT[""] : End If 
  1192. End Proc
  1193. Procedure SPEAK[X,Y,TXT$,PAL]
  1194.      Dim SPEECH$(1) : T0TAL=0 : Erase 46
  1195.      Screen 5 : Paper 0 : Curs Off : Cls 0 : Gr Writing 0
  1196.      For E=0 To 1
  1197.           If TXT$<>""
  1198.                If Left$(TXT$,1)="�"
  1199.                     W=1
  1200.                     Repeat 
  1201.                          Inc W
  1202.                     Until Mid$(TXT$,W,1)="�"
  1203.                     A$=Left$(TXT$,W)-"�"
  1204.                     TXT$=Right$(TXT$,Len(TXT$)-W)
  1205.                     Reserve As Work 46,600
  1206.                     AD=Start(46)
  1207.                     C=1
  1208.                     While Mid$(A$,C,1)="(" and AD<594+Start(46)
  1209.                          For A=0 To 1
  1210.                               R=C : Repeat : Inc C : Until Mid$(A$,C,1)="," or Mid$(A$,C,1)=")"
  1211.                               Doke AD,Val(Mid$(A$,R+1,C-R-1)) : AD=AD+2
  1212.                          Next 
  1213.                          Inc C
  1214.                     Wend 
  1215.                End If 
  1216.                For Q=1 To Len(TXT$)
  1217.                     Gosub GTT
  1218.                     If Mid$(TXT$,Q,1)=" " or Q=Len(TXT$) or(T and E=1) or Mid$(TXT$,Q,1)="@"
  1219.                          T=Text Length(Left$(TXT$,Q)) : T1=Text Length(SPEECH$(0)) : LONG=(T>CSTUFF(2)-25) or(T>T1 and E=1)
  1220.                          Gosub GTT
  1221.                          If LONG or Q=Len(TXT$) or(T and E=1) or Mid$(TXT$,Q,1)="@"
  1222.                               Q1=Q
  1223.                               While Text Length(Left$(TXT$,Q1))>CSTUFF(2)-25 or(Text Length(Left$(TXT$,Q1))>T1 and E=1)
  1224.                                    Repeat 
  1225.                                         Q1=Q1-1
  1226.                                    Until Mid$(TXT$,Q1,1)=" "
  1227.                               Wend 
  1228.                               SPEECH$(E)=Left$(TXT$,Q1)-"@"
  1229.                               If Left$(SPEECH$(E),1)=" " : SPEECH$(E)=Right$(SPEECH$(E),Len(SPEECH$(E))-1) : End If 
  1230.                               If Left$(TXT$,Q1)-"@"<>Left$(TXT$,Q1) : EN=-1 : End If 
  1231.                               TXT$=Right$(TXT$,Len(TXT$)-Q1)
  1232.                               If EN : Exit 2 : End If : Exit 
  1233.                          End If 
  1234.                     End If 
  1235.                Next 
  1236.           End If 
  1237.      Next 
  1238.      For E=0 To 1
  1239.           If CU=0 and SPIC=0
  1240.                TX=Min(Max(0,X-XOFF-Text Length(SPEECH$(E))/2),CSTUFF(2)-Text Length(SPEECH$(E)))
  1241.                Screen 0
  1242.           Else 
  1243.                TX=Min(Max(0,X-Text Length(SPEECH$(E))/2),CSTUFF(2)-Text Length(SPEECH$(E)))
  1244.                Screen 2
  1245.           End If 
  1246.           DARK=1 : For C=1 To 31 : If Colour(C)<Colour(DARK) : DARK=C : End If : Next 
  1247.           Screen 5 : Ink DARK
  1248.           Text TX-1,Text Base+1+(FH(1)+1)*E,SPEECH$(E)
  1249.           Text TX+1,Text Base+1+(FH(1)+1)*E,SPEECH$(E)
  1250.           Text TX,Text Base+2+(FH(1)+1)*E,SPEECH$(E)
  1251.           Text TX,Text Base+(FH(1)+1)*E,SPEECH$(E)
  1252.           If PAL=0 : PAL=1 : For C=1 To 31 : If Colour(C)>Colour(PAL) : PAL=C : End If : Next : End If 
  1253.           Ink PAL
  1254.           Text TX,Text Base+1+(FH(1)+1)*E,SPEECH$(E)
  1255.           T0TAL=T0TAL+Len(SPEECH$(E))+5
  1256.      Next 
  1257.      Get Bob 1,0,0 To CSTUFF(2),FH(1)*2+4
  1258.      Hot Spot 1,0,1000-Max(YOFF,Y)
  1259.      If CU=0 and SPIC=0
  1260.           Screen 0 : Bob 17,XOFF,1000,1
  1261.      Else 
  1262.           Screen 2 : Trap Double Buffer : Bob 17,0,1000,1
  1263.      End If 
  1264.      Goto FINISH
  1265.      
  1266.      GTT:
  1267.      T=0 : Restore PUNC
  1268.      Do 
  1269.           Read T$ : If T$="END" : Exit : End If 
  1270.           If Mid$(TXT$,Q,2)=T$ : T=-1 : End If 
  1271.      Loop 
  1272.      Return 
  1273.      
  1274.      PUNC:
  1275.      Data ". ","? ","! ","END"
  1276.      
  1277.      FINISH:
  1278.      
  1279. End Proc[TXT$]
  1280. Procedure FINDBUTTON
  1281.      Screen 7
  1282.      XB=X Screen(X Mouse) : YB=Y Screen(Y Mouse)
  1283.      For Z0NE=0 To 9
  1284.           If(XB>=VB(1,Z0NE))<>(XB>VB(3,Z0NE)) and(YB>=VB(2,Z0NE))<>(YB>VB(4,Z0NE)) and VO(Z0NE)=0
  1285.                V1=VB : VB=Z0NE : ITEM=0 : OBJ2=-1 : OBJ=-1
  1286.                If VB(10,VB)<7
  1287.                     MGE[VB$(0,VB)+Str$(VB)]
  1288.                Else 
  1289.                     V=50+VB
  1290.                     ST[V]
  1291.                     VB=V1
  1292.                End If 
  1293.                Pop Proc
  1294.           End If 
  1295.      Next 
  1296.      FINDINV[X Mouse,Y Mouse] : I=Param
  1297.      If I=-2 : FIRST=LAST : INVD=0 : End If 
  1298. End Proc
  1299. Procedure C0L[B0B,MX,MY]
  1300.      C0L=0
  1301.      Trap I=I Bob(B0B)
  1302.      If Errtrap=0
  1303.           H0TSP0T[I]
  1304.           X1=X Hard(X Bob(B0B)-HXREV)-XOFF
  1305.           Y1=Y Hard(Y Bob(B0B)-HY)-YOFF
  1306.           AD=Start(1)+2+(I-1)*8
  1307.           ADI=Leek(AD)
  1308.           SX=Deek(ADI)
  1309.           SY=Deek(ADI+2)
  1310.           X2=X1+SX*16
  1311.           Y2=Y1+SY
  1312.           If(MY>=Y1)<>(MY>Y2) and(MX>=X1)<>(MX>X2) : C0L=-1 : End If 
  1313.      End If 
  1314. End Proc[C0L]
  1315. Procedure ACTION
  1316.      If ACTIVE(MCH)=0 : Pop Proc : End If 
  1317.      ST0P(MCH)=-1
  1318.      While ACTIVE(MCH)<>-1 : Gosub CHECK : Wend 
  1319.      PR1NT[""]
  1320.      If OBJ=-1 : Pop Proc : End If 
  1321.      If TYPE=0
  1322.           ST=FR(VB+11,OBJ)
  1323.           If FR$(OBJ)-" "="" : Pop Proc : End If 
  1324.      Else If TYPE=1
  1325.           ST=BK(VB+11,OBJ)
  1326.           'If Fire(1) : MGE[Str$(VB)+Str$(OBJ)+Str$(ST)] : Wait Key : End If 
  1327.           If BK$(OBJ)-" "="" : Pop Proc : End If 
  1328.      Else If TYPE=2
  1329.           ST=INV(VB+1,OBJ)
  1330.           If INV$(OBJ)-" "="" : Pop Proc : End If 
  1331.      Else If TYPE=3
  1332.           ST=CHACT(VB+1,B0B(ROOM(ROOMSEL,2),OBJ+1))
  1333.           If CH$(B0B(ROOM(ROOMSEL,2),OBJ+1))-" "="" : Pop Proc : End If 
  1334.      End If 
  1335.      If ST>-1
  1336.           FIRSTLINE=-1 : ST[ST]
  1337.           If FIRSTLINE=-2
  1338.                V=50+VB
  1339.                ST[V]
  1340.           End If 
  1341.      Else 
  1342.           V=50+VB
  1343.           ST[V]
  1344.      End If 
  1345.      Pop Proc
  1346.      
  1347.      CHECK:
  1348.      If Timer-UTIME>5
  1349.           UPD4TE[0]
  1350.      End If 
  1351.      Return 
  1352. End Proc
  1353. Procedure ST[W]
  1354.      On Error Goto ERR
  1355.      Dim LINE(4) : Dim TEST(10) : Dim F0R(10,2) : Dim C1(10) : Dim C2(10) : P0P=0
  1356.      If W>200
  1357.           FIRST1=201 : BANK=24
  1358.      Else If W>149
  1359.           FIRST1=150 : BANK=23
  1360.      Else If W>59
  1361.           FIRST1=60 : BANK=22
  1362.      Else If W>49
  1363.           FIRST1=50 : BANK=21
  1364.      Else 
  1365.           FIRST1=0 : BANK=20
  1366.      End If 
  1367.      ADS=Start(BANK)+6
  1368.      If W>FIRST1
  1369.           For Q=FIRST1 To W-1
  1370.                Do 
  1371.                     ADS=ADS+8 : If Peek$(ADS,1)="�" : ADS=ADS+2 : Exit : End If 
  1372.                Loop 
  1373.           Next 
  1374.      End If 
  1375.      LINE=0
  1376.      If PAUSE=-1
  1377.           LINE=PQ : ADS=ADS+LINE*8 : PAUSE=0
  1378.      End If 
  1379.      Do 
  1380.           Gosub GTLINE
  1381.           If FIRSTLINE=-1
  1382.                If LINE(0)<>45
  1383.                     FIRSTLINE=-2 : Pop Proc
  1384.                Else FIRSTLINE=0
  1385.                End If 
  1386.           End If 
  1387.           Gosub CHECKKEY
  1388.           If LINE(0)>0 and Not D0NT
  1389.                'If Fire(1) : MGE[Str$(QG)+Str$(WG)+Str$(LINE(0))] : Wait Key : End If 
  1390.                Gosub LINE(0)
  1391.           Else If(LINE(0)>=16 and LINE(0)<=20) or LINE(0)=27 or LINE(0)=28 or LINE(0)=24 or LINE(0)=100
  1392.                Gosub LINE(0)
  1393.           End If 
  1394.           If Peek$(ADS,1)="�" : Pop Proc : End If 
  1395.      Loop 
  1396.      
  1397.      'bell
  1398.      1 Bell : Return 
  1399.      
  1400.      'execute 
  1401.      2 If ST>-1
  1402.           ST[ST]
  1403.           If P0P : Pop Proc : End If 
  1404.      Else If VB(11,VB)=0
  1405.           TXT$=TXT$(VB(9,VB))
  1406.           While TXT$<>""
  1407.                PR1NT[TXT$]
  1408.                TXT$=Param$
  1409.                If CLICK
  1410.                     While Mouse Key=0 : Gosub CHECKKEY : Wend 
  1411.                     While Mouse Key<>0 : Gosub CHECKKEY : Wend 
  1412.                End If 
  1413.                PR1NT[""]
  1414.           Wend 
  1415.      Else If VB(11,VB)=1
  1416.           CHS=MCH
  1417.           TXT$=TXT$(VB(9,VB))
  1418.           Gosub S4YIT
  1419.      End If 
  1420.      Return 
  1421.      
  1422.      'go
  1423.      3 If TYPE=0
  1424.           If FR(1,OBJ)>-1
  1425.                MOVE[FR(0,OBJ),FR(1,OBJ),MCH,FR(9,OBJ),FR(8,OBJ)]
  1426.                If ACTIVE(MCH)=-1 : P0P=-1 : Pop Proc : End If 
  1427.           Else 
  1428.                P0P=-1 : Pop Proc
  1429.           End If 
  1430.      Else If TYPE=1
  1431.           If BK(21,OBJ)>-1
  1432.                MOVE[BK(21,OBJ),BK(22,OBJ),MCH,BK(9,OBJ),BK(8,OBJ)]
  1433.                If ACTIVE(MCH)=-1 : P0P=-1 : Pop Proc : End If 
  1434.           Else 
  1435.                P0P=-1 : Pop Proc
  1436.           End If 
  1437.      Else If TYPE=3
  1438.           X=PX(OBJ) : Y=PY(OBJ)
  1439.           If SANG(OBJ)=0
  1440.                X=X+25 : D=2
  1441.           Else If SANG(OBJ)=1
  1442.                Y=Y+15 : D=3
  1443.           Else If SANG(OBJ)=$8000
  1444.                X=X-25 : D=1
  1445.           Else If SANG(OBJ)=2
  1446.                Y=Y-15 : D=4
  1447.           End If 
  1448.           PREMOVE[X,Y]
  1449.           MOVE[XPM,YPM,MCH,-1,D]
  1450.           If ACTIVE(MCH)=-1 : P0P=-1 : Pop Proc : End If 
  1451.      End If 
  1452.      Return 
  1453.      
  1454.      'wait stop 
  1455.      4 Gosub GTCH1
  1456.      WA1TSTOP[CH1,LINE(1)]
  1457.      If P0P : Pop Proc : End If 
  1458.      Return 
  1459.      
  1460.      'print 
  1461.      5 If LINE(1)=-1
  1462.           If TYPE=0
  1463.                TXT$=TXT$(FR(6,OBJ))
  1464.           Else If TYPE=1
  1465.                TXT$=TXT$(BK(6,OBJ))
  1466.           Else If TYPE=2
  1467.                TXT$=TXT$(INV(0,OBJ))
  1468.           Else If TYPE=3
  1469.                TXT$=TXT$(CHACT(0,B0B(ROOM(ROOMSEL,2),OBJ+1)))
  1470.           End If 
  1471.      Else 
  1472.           TXT$=TXT$(LINE(1)-1)
  1473.      End If 
  1474.      While TXT$<>""
  1475.           PR1NT[TXT$]
  1476.           TXT$=Param$
  1477.           If CLICK
  1478.                While Mouse Key=0 : Gosub CHECKKEY : Wend 
  1479.                While Mouse Key<>0 : Gosub CHECKKEY : Wend 
  1480.           End If 
  1481.           PR1NT[""]
  1482.      Wend 
  1483.      Return 
  1484.      
  1485.      'reach 
  1486.      6 Gosub GTCH1
  1487.      If LINE(2)=-1
  1488.           If TYPE=0
  1489.                HEIGHT=FR(7,OBJ)
  1490.           Else If TYPE=1
  1491.                HEIGHT=BK(7,OBJ)
  1492.           End If 
  1493.      Else 
  1494.           HEIGHT=LINE(2)
  1495.      End If 
  1496.      I0=I(CH1)
  1497.      If HEIGHT=2
  1498.           I(CH1)=I0+30
  1499.      Else If HEIGHT=1
  1500.           I(CH1)=I0+33
  1501.      Else If HEIGHT=3
  1502.           I(CH1)=I0+27
  1503.      End If 
  1504.      FRAMECOUNT=3
  1505.      Repeat 
  1506.           Gosub CHECKKEY
  1507.      Until FRAMECOUNT=0
  1508.      I(CH1)=I0
  1509.      Return 
  1510.      
  1511.      'take
  1512.      7 Gosub GTCH1
  1513.      If LINE(2)=-1
  1514.           OBJ1=OBJ
  1515.      Else 
  1516.           OBJ1=16-LINE(2)
  1517.      End If 
  1518.      If TYPE=0 and FR(3,OBJ1)>-1 and FR(10,OBJ1)<>0
  1519.           'reach 
  1520.           I0=I(CH1)
  1521.           If FR(7,OBJ1)=2
  1522.                I(CH1)=I0+30
  1523.           Else If FR(7,OBJ1)=1
  1524.                I(CH1)=I0+33
  1525.           End If 
  1526.           FRAMECOUNT=2
  1527.           Repeat 
  1528.                Gosub CHECKKEY
  1529.           Until FRAMECOUNT=0
  1530.           INV(11,FR(3,OBJ1))=B0B(ROOM(ROOMSEL,2),CH1+1)+1 : INVD=0
  1531.           I(CH1)=I0
  1532.           If FR(10,OBJ)>0
  1533.                FLAG[FR(10,OBJ),0]
  1534.           Else If FR(10,OBJ)<0
  1535.                FLAG[FR(10,OBJ),1]
  1536.           Else 
  1537.                Bob Off OBJ1
  1538.           End If 
  1539.      Else If VB(11,VB)=0
  1540.           TXT$=TXT$(VB(9,VB))
  1541.           While TXT$<>""
  1542.                PR1NT[TXT$]
  1543.                TXT$=Param$
  1544.                If CLICK
  1545.                     While Mouse Key=0 : Gosub CHECKKEY : Wend 
  1546.                     While Mouse Key<>0 : Gosub CHECKKEY : Wend 
  1547.                End If 
  1548.                PR1NT[""]
  1549.           Wend 
  1550.      Else If VB(11,VB)=1
  1551.           CHS=MCH
  1552.           TXT$=TXT$(VB(9,VB))
  1553.           Gosub S4YIT
  1554.      End If 
  1555.      Return 
  1556.      
  1557.      'paste 
  1558.      8 If CU=0
  1559.           If PASTE<>0
  1560.                If UPD4TE=-1
  1561.                     FRAMECOUNT=1
  1562.                     Repeat 
  1563.                          Gosub CHECKKEY
  1564.                     Until FRAMECOUNT=0
  1565.                End If 
  1566.           End If 
  1567.           PASTEX=BK(4,LINE(1)-1)
  1568.           PASTEY=BK(5,LINE(1)-1)
  1569.           IMAGE=LINE(2) : If IMAGE<0 : IMAGE=Abs(IMAGE)+$8000 : End If 
  1570.           PASTE=IMAGE+SOBJ
  1571.           If UPD4TE=0 or FRZE=-1
  1572.                Screen 0
  1573.                H0TSP0T[PASTE]
  1574.                Bob Clear : Paste Bob PASTEX-HXREV,PASTEY-HY,PASTE : Bob Draw 
  1575.                Screen Swap : Wait Vbl 
  1576.                Bob Clear : Paste Bob PASTEX-HXREV,PASTEY-HY,PASTE : Bob Draw 
  1577.                Screen Swap : Wait Vbl 
  1578.                PASTE=0
  1579.           End If 
  1580.           Gosub PTLOD
  1581.      Else 
  1582.           IMAGE=LINE(2) : If IMAGE<0 : IMAGE=Abs(IMAGE)+$8000 : End If 
  1583.           C=16-LINE(1)
  1584.           H0TSP0T[IMAGE+SCU]
  1585.           Screen 2
  1586.           Paste Bob CZONE(5,C)-HXREV,CZONE(6,C)-HY,IMAGE+SCU : Screen Swap : Wait Vbl 
  1587.           Paste Bob CZONE(5,C)-HXREV,CZONE(6,C)-HY,IMAGE+SCU : Screen Swap : Wait Vbl 
  1588.      End If 
  1589.      Return 
  1590.      
  1591.      'stop
  1592.      9 Gosub GTCH1
  1593.      ST0P(CH1)=-1
  1594.      While ACTIVE(CH1)<>-1
  1595.           Gosub CHECKKEY
  1596.      Wend 
  1597.      ST0P(CH1)=0
  1598.      Return 
  1599.      
  1600.      'say 
  1601.      10 Gosub GTCH1
  1602.      If LINE(2)=-1
  1603.           If TYPE=0
  1604.                TXT$=TXT$(FR(6,OBJ))
  1605.           Else If TYPE=1
  1606.                TXT$=TXT$(BK(6,OBJ))
  1607.           Else If TYPE=2
  1608.                TXT$=TXT$(INV(0,OBJ))
  1609.           Else If TYPE=3
  1610.                TXT$=TXT$(CHACT(0,B0B(ROOM(ROOMSEL,2),OBJ+1)))
  1611.           End If 
  1612.      Else 
  1613.           TXT$=TXT$(LINE(2)-1)
  1614.      End If 
  1615.      CHS=CH1 : Gosub S4YIT
  1616.      Return 
  1617.      
  1618.      'loadroom
  1619.      11 UPD4TE[0] : STORECH
  1620.      PNT=LINE(2)
  1621.      ROOMSEL=LINE(1)-1
  1622.      Trap Screen 0 : If Errtrap=0 : Flash Off : Fade 1 : Wait 15 : Screen Close 0 : End If 
  1623.      L0ADR[ROOMSEL]
  1624.      FRZE=0
  1625.      DR4WROOM[PNT,-1]
  1626.      FRZE=0
  1627.      P0P=-1 : Pop Proc
  1628.      Return 
  1629.      
  1630.      'charframe 
  1631.      12 Gosub GTCH1
  1632.      IMAGE=LINE(2) : If IMAGE<0 : IMAGE=Abs(IMAGE)+$8000 : End If 
  1633.      I(CH1)=IMAGE
  1634.      Return 
  1635.      
  1636.      'objectframe 
  1637.      13 If LINE(1)<>-1
  1638.           B0B=16-LINE(1)
  1639.      Else 
  1640.           B0B=OBJ
  1641.      End If 
  1642.      IMAGE=LINE(2) : If IMAGE<0 : IMAGE=Abs(IMAGE)+$8000 : End If 
  1643.      If B0BS=0 : B0BS : End If 
  1644.      Bob B0B,,,IMAGE+SOBJ
  1645.      Return 
  1646.      
  1647.      'wait
  1648.      14 If UPD4TE=-1
  1649.           FRAMECOUNT=LINE(1)
  1650.           Repeat 
  1651.                Gosub CHECKKEY
  1652.           Until FRAMECOUNT=0
  1653.      Else 
  1654.           WT=Timer
  1655.           While Timer-WT<LINE(1)*5
  1656.                Gosub CHECKKEY
  1657.           Wend 
  1658.      End If 
  1659.      Return 
  1660.      
  1661.      'face
  1662.      15 Gosub GTCH1
  1663.      If ACTIVE(CH1)=-1
  1664.           If LINE(2)>-1
  1665.                TURN(CH1)=LINE(2)
  1666.           End If 
  1667.           If TURN(CH1)=1
  1668.                SANG(CH1)=0
  1669.           Else If TURN(CH1)=2
  1670.                SANG(CH1)=$8000
  1671.           Else If TURN(CH1)=3
  1672.                SANG(CH1)=2
  1673.           Else If TURN(CH1)=4
  1674.                SANG(CH1)=1
  1675.           End If 
  1676.           TURN[SANG(CH1),CH1]
  1677.           FRAMECOUNT=2
  1678.           Repeat 
  1679.                Gosub CHECKKEY
  1680.           Until FRAMECOUNT=0
  1681.           I(CH1)=1+SANG(CH1)
  1682.           If SANG(CH1)<100
  1683.                H(CH1)=37+4*SANG(CH1)
  1684.           Else H(CH1)=37+SANG(CH1)
  1685.           End If 
  1686.      End If 
  1687.      Return 
  1688.      
  1689.      'compare flag
  1690.      16 If D0NT=0
  1691.           C1(LEVEL+1)=FLAG(LINE(1)) : C2(LEVEL+1)=FLAG(LINE(2))
  1692.      Else 
  1693.           C1(LEVEL)=FLAG(LINE(1)) : C2(LEVEL)=FLAG(LINE(2))
  1694.      End If 
  1695.      Return 
  1696.      
  1697.      'compare value 
  1698.      17 If D0NT=0
  1699.           C2(LEVEL+1)=LINE(2) : C1(LEVEL+1)=FLAG(LINE(1))
  1700.      Else 
  1701.           C2(LEVEL)=LINE(2) : C1(LEVEL)=FLAG(LINE(1))
  1702.      End If 
  1703.      Return 
  1704.      
  1705.      'compare item  
  1706.      20 If D0NT=0
  1707.           C1(LEVEL+1)=OBJ2+1
  1708.           If LINE(1)<>-1
  1709.                C2(LEVEL+1)=FLAG(LINE(1))
  1710.           Else If LINE(2)<>-1
  1711.                C2(LEVEL+1)=LINE(2)
  1712.           End If 
  1713.      Else 
  1714.           C1(LEVEL)=OBJ2+1
  1715.           If LINE(1)<>-1
  1716.                C2(LEVEL)=FLAG(LINE(1))
  1717.           Else If LINE(2)<>-1
  1718.                C2(LEVEL)=LINE(2)
  1719.           End If 
  1720.      End If 
  1721.      Return 
  1722.      
  1723.      'compare entry 
  1724.      52 If D0NT=0
  1725.           C1(LEVEL+1)=ENTRY
  1726.           If LINE(1)<>-1
  1727.                C2(LEVEL+1)=FLAG(LINE(1))
  1728.           Else If LINE(2)<>-1
  1729.                C2(LEVEL+1)=LINE(2)
  1730.           End If 
  1731.      Else 
  1732.           C1(LEVEL)=ENTRY+1
  1733.           If LINE(1)<>-1
  1734.                C2(LEVEL)=FLAG(LINE(1))
  1735.           Else If LINE(2)<>-1
  1736.                C2(LEVEL)=LINE(2)
  1737.           End If 
  1738.      End If 
  1739.      Return 
  1740.      
  1741.      'if
  1742.      18 If D0NT=0
  1743.           Inc LEVEL
  1744.           C1=C1(LEVEL) : C2=C2(LEVEL)
  1745.           TEST(LEVEL)=1
  1746.           If LINE(1)=1
  1747.                If C1>C2 : TEST(LEVEL)=2 : End If 
  1748.           Else If LINE(1)=2
  1749.                If C1>=C2 : TEST(LEVEL)=2 : End If 
  1750.           Else If LINE(1)=3
  1751.                If C1=C2 : TEST(LEVEL)=2 : End If 
  1752.           Else If LINE(1)=4
  1753.                If C1<=C2 : TEST(LEVEL)=2 : End If 
  1754.           Else If LINE(1)=5
  1755.                If C1<C2 : TEST(LEVEL)=2 : End If 
  1756.           End If 
  1757.           If LINE(2)<>0
  1758.                TEST(LEVEL)=3-TEST(LEVEL)
  1759.           End If 
  1760.           If TEST(LEVEL)=1 : D0NT=-1 : End If 
  1761.      Else 
  1762.           Inc LEVEL
  1763.      End If 
  1764.      Return 
  1765.      
  1766.      'end if
  1767.      19 If TEST(LEVEL)<>0 : D0NT=0 : End If 
  1768.      TEST(LEVEL)=0
  1769.      LEVEL=LEVEL-1
  1770.      Return 
  1771.      
  1772.      'add item  
  1773.      21 Gosub GTCH2
  1774.      INV(11,LINE(1)-1)=B0B(ROOM(ROOMSEL,2),CH2+1)+1 : INVD=0
  1775.      Return 
  1776.      
  1777.      'drop item   
  1778.      22 Gosub GTCH2
  1779.      If INV(11,LINE(1)-1)=B0B(ROOM(ROOMSEL,2),CH2+1)+1 : INV(11,LINE(1)-1)=0 : End If 
  1780.      INVD=0
  1781.      Return 
  1782.      
  1783.      'set flag  
  1784.      23 FLAG[LINE(1),LINE(2)]
  1785.      Return 
  1786.      
  1787.      'link  
  1788.      24 W=LINE(1) : Q=LINE(2)-1
  1789.      ADS=Start(BANK)+6
  1790.      If W>FIRST1
  1791.           For E=FIRST1 To W-1
  1792.                Do 
  1793.                     ADS=ADS+8 : If Peek$(ADS,1)="�" : ADS=ADS+2 : Exit : End If 
  1794.                Loop 
  1795.           Next 
  1796.      End If 
  1797.      ADS=ADS+Q*8 : LINE=Q
  1798.      Return 
  1799.      
  1800.      'choice
  1801.      25 FLAG=LINE(2)
  1802.      If FLAG>0
  1803.           If FLAG(FLAG)<>0 : CHO1CE(CHO1CE)=LINE(1)-1 : End If 
  1804.      Else If FLAG<0
  1805.           If FLAG(Abs(FLAG))=0 : CHO1CE(CHO1CE)=LINE(1)-1 : End If 
  1806.      Else 
  1807.           CHO1CE(CHO1CE)=LINE(1)-1
  1808.      End If 
  1809.      CHO1CE=CHO1CE+1
  1810.      Return 
  1811.      
  1812.      'choose
  1813.      26 CHOOSE : C=Param+1
  1814.      FLAG[LINE(1),C]
  1815.      PR1NT[""]
  1816.      If LINE(2)<>0
  1817.           Gosub GTCH2
  1818.           TXT$=TXT$(CHO1CE(C-1))
  1819.           CHS=CH2 : Gosub S4YIT
  1820.      End If 
  1821.      CHO1CE=0
  1822.      For E=0 To 10 : CHO1CE(E)=-1 : Next 
  1823.      Return 
  1824.      
  1825.      'else
  1826.      27 If TEST(LEVEL)=1 : D0NT=0 : End If 
  1827.      If TEST(LEVEL)=2 : D0NT=-1 : End If 
  1828.      Return 
  1829.      
  1830.      'elseif
  1831.      28 If TEST(LEVEL)=1
  1832.           C1=C1(LEVEL) : C2=C2(LEVEL)
  1833.           TEST(LEVEL)=1
  1834.           If LINE(1)=1
  1835.                If C1>C2 : TEST(LEVEL)=2 : End If 
  1836.           Else If LINE(1)=2
  1837.                If C1>=C2 : TEST(LEVEL)=2 : End If 
  1838.           Else If LINE(1)=3
  1839.                If C1=C2 : TEST(LEVEL)=2 : End If 
  1840.           Else If LINE(1)=4
  1841.                If C1<=C2 : TEST(LEVEL)=2 : End If 
  1842.           Else If LINE(1)=5
  1843.                If C1<C2 : TEST(LEVEL)=2 : End If 
  1844.           End If 
  1845.           If LINE(2)<>0
  1846.                TEST(LEVEL)=3-TEST(LEVEL)
  1847.           End If 
  1848.           If TEST(LEVEL)=2 : D0NT=0 : End If 
  1849.      Else If TEST(LEVEL)=2
  1850.           D0NT=-1
  1851.      End If 
  1852.      Return 
  1853.      
  1854.      'script
  1855.      29 S=LINE(1)
  1856.      ST[S]
  1857.      If P0P : Pop Proc : End If 
  1858.      Return 
  1859.      
  1860.      'random
  1861.      32 FLAG[LINE(1),Rnd(LINE(2))]
  1862.      Return 
  1863.      
  1864.      'add 
  1865.      33 FLAG[LINE(1),FLAG(LINE(1))+LINE(2)]
  1866.      Return 
  1867.      
  1868.      'add flag
  1869.      34 FLAG[LINE(1),FLAG(LINE(1))+FLAG(LINE(2))]
  1870.      Return 
  1871.      
  1872.      'subtract flag 
  1873.      35 FLAG[LINE(1),FLAG(LINE(1))-FLAG(LINE(2))]
  1874.      Return 
  1875.      
  1876.      'set string
  1877.      36 TXT$(LINE(1)-1)=TXT$(LINE(2)-1)
  1878.      Return 
  1879.      
  1880.      'add string
  1881.      37 TXT$(LINE(1)-1)=TXT$(LINE(1)-1)+TXT$(LINE(2)-1)
  1882.      Return 
  1883.      
  1884.      'flag to string
  1885.      39 TXT$(LINE(1)-1)=Str$(FLAG(LINE(2)))-" "
  1886.      Return 
  1887.      
  1888.      'for 
  1889.      40 Inc FLEVEL : F0R(FLEVEL,0)=LINE : F0R(FLEVEL,1)=W : F0R(FLEVEL,2)=LINE(1)
  1890.      FLAG(F0R(FLEVEL,2))=LINE(2)
  1891.      Return 
  1892.      
  1893.      'next
  1894.      41 Inc FLAG(F0R(FLEVEL,2))
  1895.      If FLAG(F0R(FLEVEL,2))>LINE(1)
  1896.           F0R(FLEVEL,2)=0 : FLEVEL=FLEVEL-1
  1897.      Else 
  1898.           W=F0R(FLEVEL,1) : Q=F0R(FLEVEL,0)
  1899.           ADS=Start(BANK)+6
  1900.           If W>FIRST1
  1901.                For E=FIRST1 To W-1
  1902.                     Do 
  1903.                          ADS=ADS+8 : If Peek$(ADS,1)="�" : ADS=ADS+2 : Exit : End If 
  1904.                     Loop 
  1905.                Next 
  1906.           End If 
  1907.           ADS=ADS+Q*8 : LINE=Q
  1908.      End If 
  1909.      Return 
  1910.      
  1911.      'clearstring 
  1912.      42 TXT$(LINE(1)-1)=""
  1913.      Return 
  1914.      
  1915.      'copy flag   
  1916.      43 FLAG[LINE(1),FLAG(LINE(2))]
  1917.      Return 
  1918.      
  1919.      'amal
  1920.      44 If LINE(1)<>-1
  1921.           B0B=16-LINE(1)
  1922.      Else 
  1923.           B0B=OBJ
  1924.      End If 
  1925.      If B0BS=0 : B0BS : End If 
  1926.      Channel B0B-1 To Bob B0B
  1927.      Amal B0B-1,TXT$(LINE(2)-1)-"noloop"
  1928.      Amal On 
  1929.      LODST(LODST,0)=LINE(0) : LODST(LODST,1)=16-B0B
  1930.      If TXT$(LINE(2)-1)-"noloop"=TXT$(LINE(2)-1)
  1931.           LODST(LODST,2)=LINE(2)
  1932.      Else 
  1933.           LODST(LODST,2)=-1
  1934.      End If 
  1935.      Inc LODST
  1936.      Return 
  1937.      
  1938.      'no default
  1939.      45 Return 
  1940.      
  1941.      'freeze
  1942.      46 FRZE=-1
  1943.      Return 
  1944.      
  1945.      'unfreeze
  1946.      47 FRZE=0
  1947.      Return 
  1948.      
  1949.      'load palette
  1950.      48 PICSEL=LINE(1)-1
  1951.      REQUEST[PIC(PICSEL),0]
  1952.      Trap Load DEV$(PIC(PICSEL))+"GRAC"+Str$(PICSEL)+".picture",6
  1953.      If Errtrap<>0 : ERR0R[4,PICSEL,1] : End If 
  1954.      Unpack 6 To 1 : Erase 6
  1955.      Screen Hide 1
  1956.      Gosub PTLOD
  1957.      Return 
  1958.      
  1959.      'fade
  1960.      49 Screen 1 : Screen Clone 4 : Screen 1 : Get Palette 0
  1961.      If LINE(1)>0
  1962.           Screen 0 : Flash Off : Fade LINE(1) To 4
  1963.           FRAMECOUNT=LINE(1)*3
  1964.           Repeat 
  1965.                Gosub CHECKKEY
  1966.           Until FRAMECOUNT=0
  1967.      Else 
  1968.           Screen 0 : Get Palette 4
  1969.      End If 
  1970.      Screen Close 4
  1971.      Gosub PTLOD
  1972.      Return 
  1973.      
  1974.      'timer 
  1975.      50 T0TAL2=LINE(2)
  1976.      TST=LINE(1)
  1977.      T1MER=0
  1978.      Return 
  1979.      
  1980.      'fade in 
  1981.      51 If CU=0
  1982.           UPD4TE=-1
  1983.           If B0BS=0 : B0BS : End If 
  1984.           UPD4TE[0] : NICEIFF[0]
  1985.      Else 
  1986.           NICEIFF[2] : UCU=-1
  1987.      End If 
  1988.      Return 
  1989.      
  1990.      'place character 
  1991.      53 Gosub GTCH1
  1992.      PLACE[CH1,LINE(2)]
  1993.      Return 
  1994.      
  1995.      'walk
  1996.      54 Gosub GTCH1
  1997.      PNT=16-LINE(2)
  1998.      MOVE[PNT(0,PNT),PNT(1,PNT),CH1,PNT(3,PNT),PNT(2,PNT)]
  1999.      Return 
  2000.      
  2001.      'timer off 
  2002.      55 T0TAL2=0
  2003.      TST=0 : T1MER=0
  2004.      Return 
  2005.      
  2006.      'sound left
  2007.      56 SAM=LINE(1)-1
  2008.      FRQ=LINE(2) : If FRQ<1 : FRQ=10 : End If 
  2009.      LSAM[SAM]
  2010.      OK=Param
  2011.      If OK
  2012.           STSAM[%1,100+SAM,FRQ,0]
  2013.      End If 
  2014.      Return 
  2015.      
  2016.      'sound right 
  2017.      57 SAM=LINE(1)-1
  2018.      FRQ=LINE(2) : If FRQ<1 : FRQ=10 : End If 
  2019.      LSAM[SAM]
  2020.      OK=Param
  2021.      If OK
  2022.           STSAM[%10,100+SAM,FRQ,0]
  2023.      End If 
  2024.      Return 
  2025.      
  2026.      'sound centre  
  2027.      58 SAM=LINE(1)-1
  2028.      FRQ=LINE(2) : If FRQ<1 : FRQ=10 : End If 
  2029.      LSAM[SAM]
  2030.      OK=Param
  2031.      If OK
  2032.           STSAM[%11,100+SAM,FRQ,0]
  2033.      End If 
  2034.      Return 
  2035.      
  2036.      'sound back  
  2037.      59 SAM=LINE(1)-1
  2038.      FRQ=LINE(2) : If FRQ<1 : FRQ=10 : End If 
  2039.      LSAM[SAM]
  2040.      OK=Param
  2041.      If OK
  2042.           STSAM[%1100,100+SAM,FRQ,-1]
  2043.      End If 
  2044.      Gosub PTLOD
  2045.      Return 
  2046.      
  2047.      'st play   
  2048.      60 Trap Extension_19_0016 2,LINE(1)
  2049.      If LINE(2)=0 : MUS=LINE(1)
  2050.      Else MUS=-1
  2051.      End If 
  2052.      Return 
  2053.      
  2054.      'load sample 
  2055.      61 SAM=LINE(1)-1
  2056.      LSAM[SAM]
  2057.      Gosub PTLOD
  2058.      Return 
  2059.      
  2060.      'bodyframe 
  2061.      62 Gosub GTCH1
  2062.      IMAGE=LINE(2) : If IMAGE<0 : IMAGE=Abs(IMAGE)+$8000 : End If 
  2063.      BFRAME(CH1)=IMAGE
  2064.      I(CH1)=IMAGE
  2065.      Return 
  2066.      
  2067.      'erase sample
  2068.      64 Erase 100+LINE(1)-1
  2069.      Gosub PTLOD
  2070.      Return 
  2071.      
  2072.      'hide
  2073.      65 Screen Hide 7 : Hide On : View 
  2074.      Return 
  2075.      
  2076.      'show
  2077.      66 Screen Show 7 : Screen To Front 7 : Show On : View 
  2078.      Return 
  2079.      
  2080.      'hide character
  2081.      67 Gosub GTCH1
  2082.      ACTIVE(CH1)=0
  2083.      Return 
  2084.      
  2085.      'goto  
  2086.      68 W=LINE(1) : Q=LINE(2)-1
  2087.      ADS=Start(BANK)+6
  2088.      If W>FIRST1
  2089.           For E=FIRST1 To W-1
  2090.                Do 
  2091.                     ADS=ADS+8 : If Peek$(ADS,1)="�" : ADS=ADS+2 : Exit : End If 
  2092.                Loop 
  2093.           Next 
  2094.      End If 
  2095.      ADS=ADS+Q*8 : LINE=Q
  2096.      Return 
  2097.      
  2098.      'voice 
  2099.      69 If LINE(1)=-1
  2100.           If TYPE=0
  2101.                TXT$=TXT$(FR(6,OBJ))
  2102.           Else If TYPE=1
  2103.                TXT$=TXT$(BK(6,OBJ))
  2104.           Else If TYPE=2
  2105.                TXT$=TXT$(INV(0,OBJ))
  2106.           Else If TYPE=3
  2107.                TXT$=TXT$(CHACT(0,B0B(ROOM(ROOMSEL,2),OBJ+1)))
  2108.           End If 
  2109.      Else 
  2110.           TXT$=TXT$(LINE(1)-1)
  2111.      End If 
  2112.      If LINE(2)>0
  2113.           VX=PNT(0,16-LINE(2)) : VY=PNT(1,16-LINE(2))
  2114.      Else 
  2115.           VX=VO1CEX : VY=VO1CEY
  2116.      End If 
  2117.      While Mouse Key<>0 : Gosub CHECKKEY : Wend 
  2118.      While TXT$<>""
  2119.           SPEAK[VX,VY-VO1CEH,TXT$,VO1CEC] : TXT$=Param$
  2120.           TIME=Timer : T=0
  2121.           While Mouse Key=0 and T<T0TAL
  2122.                If Timer-UTIME>5 : UPD4TE[0] : Gosub CHECKKEY2 : Inc T : End If 
  2123.           Wend 
  2124.           Bob Off 17 : UPD4TE[0]
  2125.           While Mouse Key<>0 : Gosub CHECKKEY : Wend 
  2126.      Wend 
  2127.      Return 
  2128.      
  2129.      'set voice 
  2130.      70 VO1CEC=LINE(1) : VO1CEH=LINE(2)
  2131.      Return 
  2132.      
  2133.      'music stop
  2134.      71 Extension_19_0030 
  2135.      MUS=-1
  2136.      Return 
  2137.      
  2138.      'restart 
  2139.      72 PNT=ST4RTPOINT
  2140.      ROOMSEL=ST4RTROOM
  2141.      MCH=ST4RTCH
  2142.      MMCH=B0B(ROOM(ST4RTROOM,2),MCH+1)+1
  2143.      CLEARALL
  2144.      Erase 1
  2145.      Screen 0 : Flash Off : Fade 1 : Wait 15 : Screen Close 0
  2146.      L0ADC
  2147.      L0ADR[ROOMSEL]
  2148.      DR4WROOM[PNT,-1]
  2149.      P0P=-1 : Pop Proc
  2150.      Return 
  2151.      
  2152.      'character change
  2153.      73 Gosub GTCH1
  2154.      Gosub GTCH2
  2155.      For E=0 To 4 : If CL(E,0)=B0B(ROOM(ROOMSEL,2),CH2+1) : S(CH1)=CL(E,1) : CC(CH1)=CH2 : End If : Next 
  2156.      I(CH)=1+SANG(CH)
  2157.      If SANG(CH)<100
  2158.           H(CH)=37+4*SANG(CH)
  2159.      Else H(CH)=37+SANG(CH)
  2160.      End If 
  2161.      Return 
  2162.      
  2163.      'show picture
  2164.      74 PICSEL=LINE(1)-1
  2165.      REQUEST[PIC(PICSEL),0]
  2166.      Trap Load DEV$(PIC(PICSEL))+"GRAC"+Str$(PICSEL)+".picture",6
  2167.      If Errtrap<>0 : ERR0R[4,PICSEL,1] : End If 
  2168.      Unpack 6 To 2 : Screen Hide 2 : Erase 6
  2169.      Screen Display 2,CSTUFF(4),CSTUFF(5),,
  2170.      Screen To Front 2 : NICEIFF[2]
  2171.      SPIC=-1
  2172.      Return 
  2173.      
  2174.      'picture off 
  2175.      75 Screen 2 : Fade 1 : Wait 15 : Screen Close 2
  2176.      SPIC=0
  2177.      Return 
  2178.      
  2179.      'wait click
  2180.      76 While Mouse Key<>0 : Gosub CHECKKEY : Wend 
  2181.      If UPD4TE=-1
  2182.           FRAMECOUNT=LINE(1)
  2183.           Repeat 
  2184.                Gosub CHECKKEY
  2185.           Until(FRAMECOUNT=0 and LINE(1)<>0) or Mouse Key<>0
  2186.           FRAMECOUNT=0
  2187.      Else 
  2188.           WT=Timer
  2189.           While(Timer-WT<LINE(1)*5 or LINE(1)=0) and Mouse Key=0
  2190.                Gosub CHECKKEY
  2191.           Wend 
  2192.      End If 
  2193.      While Mouse Key<>0 : Gosub CHECKKEY : Wend 
  2194.      Return 
  2195.      
  2196.      'quit
  2197.      77 End 
  2198.      Return 
  2199.      
  2200.      'play anim 
  2201.      78 AN1MSEL=LINE(1)-1
  2202.      REQUEST[AN1M(AN1MSEL),0]
  2203.      AN1M[DEV$(AN1M(AN1MSEL))+"GRAC"+Str$(AN1MSEL)+".anim",LINE(2)]
  2204.      Return 
  2205.      
  2206.      'limbo 
  2207.      79 FRZE=-1
  2208.      Screen 0 : Flash Off : Fade 1 : Wait 15
  2209.      Screen Close 0 : Screen Close 6
  2210.      OBJECT1=-1
  2211.      While Length(1)>101 : Del Bob 102 : Wend 
  2212.      Sam Stop : For E=100 To 199 : If Length(E)>0 : Erase E : End If : Next : Extension_19_0062 15
  2213.      For E=1 To 2 : OL(E,0)=-1 : OL(E,2)=0 : Next 
  2214.      For E=0 To 4 : CL(E,0)=-1 : Next 
  2215.      Return 
  2216.      
  2217.      'flash   
  2218.      80 Screen 0
  2219.      Flash LINE(1),TXT$(LINE(2)-1)
  2220.      Gosub PTLOD
  2221.      Return 
  2222.      
  2223.      'fade picture
  2224.      81 If LINE(1)>0
  2225.           Screen 2 : Flash Off : Fade LINE(1) To 1 : Wait LINE(1)*15
  2226.      Else 
  2227.           Screen 2 : Get Palette 1
  2228.      End If 
  2229.      Return 
  2230.      
  2231.      'toggle flag   
  2232.      82 If FLAG(LINE(1))=0
  2233.           FLAG[LINE(1),1]
  2234.      Else 
  2235.           FLAG[LINE(1),0]
  2236.      End If 
  2237.      Return 
  2238.      
  2239.      'scroll off
  2240.      83 SCR0LL=0
  2241.      Return 
  2242.      
  2243.      'scroll on 
  2244.      84 SCR0LL=-1
  2245.      Return 
  2246.      
  2247.      'scroll
  2248.      85 For S=1 To Max(LINE(1),LINE(2)) Step 5
  2249.           If S<=LINE(1) : XOFF=XOFF+5*Sgn(LINE(1)) : End If 
  2250.           If S<=LINE(2) : YOFF=YOFF+5*Sgn(LINE(2)) : End If 
  2251.           XOFF=Min(Max(XOFF,0),Screen Width(0)-CSTUFF(2))
  2252.           YOFF=Min(Max(YOFF,0),Screen Height(0)-CSTUFF(3))
  2253.           FRAMECOUNT=1
  2254.           Repeat : Gosub CHECKKEY : Until FRAMECOUNT=0
  2255.      Next 
  2256.      Return 
  2257.      
  2258.      'switch
  2259.      86 ST0P(MCH)=-1 : INVD=0 : PR1NT[""]
  2260.      MMCH=LINE(1)
  2261.      For E=0 To 4
  2262.           If MMCH=B0B(ROOM(ROOMSEL,2),E+1)+1 : MCH=E : Exit : End If 
  2263.      Next 
  2264.      If ACTIVE(MCH)=0
  2265.           AD0=Start(98)
  2266.           AD=AD0+56*(MMCH-1)
  2267.           R : ROOM=R
  2268.           MCH=-1 : STORECH
  2269.           ROOMSEL=ROOM
  2270.           Trap Screen 0 : If Errtrap=0 : Flash Off : Fade 1 : Wait 15 : Screen Close 0 : End If 
  2271.           L0ADR[ROOMSEL]
  2272.           For Q=0 To 4 : ACTIVE(Q)=0 : Next : GTCH
  2273.           DR4WROOM[PNT,0]
  2274.           For E=0 To 4
  2275.                If MMCH=B0B(ROOM(ROOMSEL,2),E+1)+1 : MCH=E : Exit : End If 
  2276.           Next 
  2277.           UPD4TE=0 : B0BS=0 : LODST=0
  2278.           ST[0]
  2279.           If UPD4TE=0
  2280.                UPD4TE=-1
  2281.                If B0BS=0 : B0BS : End If 
  2282.                PR1NT[""] : INVD=0
  2283.                UPD4TE[0] : NICEIFF[0] : Screen Show 7 : Show On 
  2284.           End If 
  2285.           P0P=-1 : Pop Proc
  2286.      End If 
  2287.      IZL(MCH)=IZM(MCH)
  2288.      IZM(MCH)=IZ(MCH)
  2289.      Return 
  2290.      
  2291.      'control palette 
  2292.      87 PICSEL=LINE(1)-1
  2293.      REQUEST[PIC(PICSEL),0]
  2294.      Trap Load DEV$(PIC(PICSEL))+"GRAC"+Str$(PICSEL)+".picture",6
  2295.      If Errtrap<>0 : ERR0R[4,PICSEL,1] : End If 
  2296.      Unpack 6 To 3 : Erase 6
  2297.      Screen Hide 3
  2298.      CPALETTE=PICSEL
  2299.      
  2300.      Return 
  2301.      
  2302.      'fade control
  2303.      88 Screen 3 : Screen Clone 4 : Screen 3 : Get Palette 7
  2304.      If LINE(1)>0
  2305.           Screen 7 : Flash Off : Fade LINE(1) To 4 : Wait LINE(1)*15
  2306.      Else 
  2307.           Screen 7 : Get Palette 4
  2308.      End If 
  2309.      Screen Close 4
  2310.      Return 
  2311.      
  2312.      'exit close up 
  2313.      89 CU=0
  2314.      Return 
  2315.      
  2316.      'close up
  2317.      90 L0ADCU[LINE(1)-1]
  2318.      Screen Hide 7 : View 
  2319.      CU=-1 : DR4WCU
  2320.      If CU=-1
  2321.           While Mouse Key<>0 : Gosub CHECKKEY : Wend 
  2322.           Do 
  2323.                While Mouse Key=0 : Gosub CHECKKEY : Wend 
  2324.                Screen 2 : X=X Screen(X Mouse) : Y=Y Screen(Y Mouse)
  2325.                For R=0 To 15
  2326.                     If CZONE(0,R)>0
  2327.                          If X>CZONE(1,R) and X<CZONE(3,R) and Y>CZONE(2,R) and Y<CZONE(4,R)
  2328.                               H0TSP0T[CZONE(7,R)+SCU]
  2329.                               Screen 2 : For E=0 To 1 : Paste Bob CZONE(5,R)-HXREV,CZONE(6,R)-HY,CZONE(0,R)+SCU : Screen Swap : Wait Vbl : Next 
  2330.                               While Mouse Key<>0 : Gosub CHECKKEY : Wend 
  2331.                               H0TSP0T[CZONE(7,R)+SCU]
  2332.                               Screen 2 : For E=0 To 1 : Paste Bob CZONE(5,R)-HXREV,CZONE(6,R)-HY,CZONE(7,R)+SCU : Screen Swap : Wait Vbl : Next 
  2333.                               If CZONE(8,R)>200
  2334.                                    ST[CZONE(8,R)] : If P0P : Pop Proc : End If 
  2335.                                    If Not CU : Exit 2 : End If 
  2336.                               End If 
  2337.                          End If 
  2338.                     End If 
  2339.                Next 
  2340.           Loop 
  2341.      End If 
  2342.      Screen 2 : Fade 1 : Wait 15 : Screen Close 2
  2343.      Screen Show 7 : View 
  2344.      Return 
  2345.      
  2346.      'clear flags 
  2347.      91 For E=LINE(1) To LINE(2)
  2348.           FLAG[E,0]
  2349.      Next 
  2350.      Return 
  2351.      
  2352.      'cycle 
  2353.      92 Screen 0 : Shift Up 5,LINE(1),LINE(2),1
  2354.      For E=0 To 31
  2355.           PAL(E)=Colour(E)
  2356.      Next 
  2357.      Gosub PTLOD
  2358.      Return 
  2359.      
  2360.      'cycle off 
  2361.      93 Shift Off 
  2362.      For E=0 To 31
  2363.           Colour E,PAL(E)
  2364.      Next 
  2365.      Gosub PTLOD
  2366.      Return 
  2367.      
  2368.      'save off
  2369.      94 S4VE=-1
  2370.      Return 
  2371.      
  2372.      'verb off
  2373.      95 VO(9-LINE(1)+1)=-1
  2374.      Return 
  2375.      
  2376.      'save on 
  2377.      96 S4VE=0
  2378.      Return 
  2379.      
  2380.      'verb on 
  2381.      97 VO(9-LINE(1)+1)=0
  2382.      Return 
  2383.      
  2384.      'walk off  
  2385.      98 NOW4LK=-1
  2386.      Return 
  2387.      
  2388.      'walk on 
  2389.      99 NOW4LK=0
  2390.      Return 
  2391.      
  2392.      'compare 
  2393.      100 If D0NT=0
  2394.           C2(LEVEL+1)=LINE(2) : C1(LEVEL+1)=LINE(1)
  2395.      Else 
  2396.           C2(LEVEL)=LINE(2) : C1(LEVEL)=LINE(1)
  2397.      End If 
  2398.      Return 
  2399.      
  2400.      'comment 
  2401.      101 Return 
  2402.      
  2403.      'pause 
  2404.      102 PAUSE=LINE(1)
  2405.      PQ=LINE : PST=W
  2406.      T1MER2=0
  2407.      P0P=-1 : Pop Proc
  2408.      Return 
  2409.      
  2410.      'anim
  2411.      103 If LINE(1)<>-1
  2412.           B0B=16-LINE(1)
  2413.      Else 
  2414.           B0B=OBJ
  2415.      End If 
  2416.      A$=TXT$(LINE(2)-1)
  2417.      Reserve As Work 30+B0B,600
  2418.      AD1=Start(30+B0B)
  2419.      A(B0B,1)=0 : A(B0B,2)=0
  2420.      E=0 : Repeat : Inc E : Until Mid$(A$,E,1)="("
  2421.      While Mid$(A$,E,1)="("
  2422.           For A=0 To 2
  2423.                R=E : Repeat : Inc E : Until Mid$(A$,E,1)="," or Mid$(A$,E,1)=")"
  2424.                Doke AD1,Val(Mid$(A$,R+1,E-R-1)) : AD1=AD1+2
  2425.           Next 
  2426.           Inc E : Inc A(B0B,1)
  2427.      Wend 
  2428.      If Mid$(A$,5,1)="L"
  2429.           A(B0B,0)=-1
  2430.      Else 
  2431.           A(B0B,0)=1
  2432.      End If 
  2433.      Gosub PTLOD
  2434.      Return 
  2435.      
  2436.      'pause off 
  2437.      104 PAUSE=0
  2438.      Return 
  2439.      
  2440.      'subtract  
  2441.      105 FLAG[LINE(1),FLAG(LINE(1))-LINE(2)]
  2442.      Return 
  2443.      
  2444.      'set mark
  2445.      106 Return 
  2446.      
  2447.      'goto mark 
  2448.      107 MARK=LINE(1) : LINE=0
  2449.      ADS=Start(BANK)+6
  2450.      If W>FIRST1
  2451.           For E=FIRST1 To W-1
  2452.                Do 
  2453.                     ADS=ADS+8 : If Peek$(ADS,1)="�" : ADS=ADS+2 : Exit : End If 
  2454.                Loop 
  2455.           Next 
  2456.      End If 
  2457.      Do 
  2458.           Gosub GTLINE
  2459.           If LINE(0)=106 and LINE(1)=MARK : LEVEL=0 : Exit : End If 
  2460.      Loop 
  2461.      Return 
  2462.      
  2463.      'end 
  2464.      108 Pop Proc
  2465.      Return 
  2466.      
  2467.      'perspective 
  2468.      109 FLOOR=LINE(1)
  2469.      HORIZON=LINE(2)
  2470.      Return 
  2471.      
  2472.      'static
  2473.      110 If LINE(1)<>-1
  2474.           B0B=16-LINE(1)
  2475.      Else 
  2476.           B0B=OBJ
  2477.      End If 
  2478.      FR(21,B0B)=-1
  2479.      Return 
  2480.      
  2481.      'scale 
  2482.      111 SCALE=Min(Max(0,LINE(1)),100)
  2483.      Return 
  2484.      
  2485.      'position voice
  2486.      112 VO1CEX=LINE(1) : VO1CEY=LINE(2)
  2487.      Return 
  2488.      
  2489.      S4YIT:
  2490.      While TXT$<>""
  2491.           While Mouse Key<>0 : Gosub CHECKKEY : Wend 
  2492.           If OFF(CHS)<=HORIZON
  2493.                Z(CHS)=(16*SCALE)/100
  2494.           Else If OFF(CHS)=>FLOOR
  2495.                Z(CHS)=(64*SCALE)/100
  2496.           Else 
  2497.                Z(CHS)=((OFF(CHS)-HORIZON)*64*SCALE)/((FLOOR-HORIZON)*100)
  2498.           End If 
  2499.           Z(CHS)=Max(16,Z(CHS))
  2500.           SPEAK[PX(CHS),PY(CHS)-((80*Z(CHS))/64),TXT$,CH(B0B(ROOM(ROOMSEL,2),CHS+1),1)]
  2501.           TXT$=Param$
  2502.           TIME=Timer : H=H(CHS) : T=0 : FRAME=0 : BFRAME=BFRAME(CHS) : I=I(CHS)
  2503.           While Mouse Key=0 and T<T0TAL
  2504.                Gosub CHECKKEY2
  2505.                If Timer-UTIME>5
  2506.                     UPD4TE[0]
  2507.                     Inc T : H(CHS)=H+Rnd(3)
  2508.                     If Length(46)>0 and T>=DELAY
  2509.                          AD1=Start(46)+FRAME*4 : Inc FRAME
  2510.                          IMAGE=Deek(AD1) : If IMAGE>32768 : IMAGE=IMAGE-65536 : End If 
  2511.                          DELAY=T+Deek(AD1+2)
  2512.                          If IMAGE<0 : IMAGE=Abs(IMAGE)+$8000 : End If 
  2513.                          If IMAGE=0 : IMAGE=I : Erase 46 : End If 
  2514.                          BFRAME(CHS)=IMAGE
  2515.                          I(CHS)=IMAGE
  2516.                     End If 
  2517.                End If 
  2518.           Wend 
  2519.           BFRAME(CHS)=BFRAME
  2520.           I(CHS)=I
  2521.           Erase 46
  2522.           Bob Off 17 : H(CHS)=H : UPD4TE[0]
  2523.           While Mouse Key<>0 : Gosub CHECKKEY : Wend 
  2524.      Wend 
  2525.      Return 
  2526.      
  2527.      CHECKKEY:
  2528.      If Timer-UTIME>5
  2529.           UPD4TE[0]
  2530.      End If 
  2531.      CHECKKEY2:
  2532.      I$=Inkey$ : I1=Scancode : S1=Scanshift
  2533.      If I1>79 and I1<90 and S1=0
  2534.           LI1=I1 : LS1=S1
  2535.           CHECK["load game"+Str$(I1-79)] : P=Param
  2536.           If P
  2537.                REQUEST[CH(99,0),-1]
  2538.                If Exist(DEV$(CH(99,0))+"GRAC"+Str$(I1-80)+".save")
  2539.                     Trap Screen Close 2 : P0P=-1 : Pop Proc
  2540.                End If 
  2541.           Else LI1=0
  2542.           End If 
  2543.      Else If I$="q"
  2544.           CHECK["quit?"] : P=Param
  2545.           If P : End : End If 
  2546.      End If 
  2547.      Return 
  2548.      
  2549.      GTLINE:
  2550.      For Q=0 To 2
  2551.           LINE(Q)=Deek(ADS+Q*2) : If LINE(Q)>32768 : LINE(Q)=LINE(Q)-65536 : End If 
  2552.      Next 
  2553.      WG=W : QG=LINE : LINEG=LINE(0)
  2554.      LINE(3)=Peek(ADS+6)
  2555.      LINE(4)=Peek(ADS+7)
  2556.      For E=1 To 2
  2557.           If LINE(E+2)>0
  2558.                If LINE(E+2)=1
  2559.                     LINE(E)=FLAG(LINE(E))
  2560.                Else If LINE(E+2)=2
  2561.                     LINE(E)=ROOMSEL+1
  2562.                Else If LINE(E+2)=3
  2563.                     LINE(E)=OBJ2+1
  2564.                Else If LINE(E+2)=4
  2565.                     LINE(E)=MCH+1
  2566.                Else If LINE(E+2)=5
  2567.                     LINE(E)=ENTRY
  2568.                Else If LINE(E+2)=6
  2569.                     LINE(E)=GTIME
  2570.                Else If LINE(E+2)=7
  2571.                     LINE(E)=RTIME
  2572.                Else If LINE(E+2)=8
  2573.                     If TYPE=0
  2574.                          LINE(E)=16-OBJ
  2575.                     Else If TYPE=1
  2576.                          LINE(E)=OBJ+1
  2577.                     Else If TYPE=2
  2578.                          LINE(E)=OBJ+1
  2579.                     Else If TYPE=3
  2580.                          LINE(E)=OBJ+1
  2581.                     End If 
  2582.                Else If LINE(E+2)=9
  2583.                     If TYPE=0
  2584.                          LINE(E)=FR(6,OBJ)+1
  2585.                     Else If TYPE=1
  2586.                          LINE(E)=BK(6,OBJ)+1
  2587.                     Else If TYPE=2
  2588.                          LINE(E)=INV(0,OBJ)+1
  2589.                     Else If TYPE=3
  2590.                          LINE(E)=CHACT(0,B0B(ROOM(ROOMSEL,2),OBJ+1))+1
  2591.                     End If 
  2592.                Else If LINE(E+2)=10
  2593.                     If TYPE=0
  2594.                          LINE(E)=FR(7,OBJ)
  2595.                     Else If TYPE=1
  2596.                          LINE(E)=BK(7,OBJ)
  2597.                     End If 
  2598.                End If 
  2599.           End If 
  2600.      Next 
  2601.      Inc LINE : ADS=ADS+8
  2602.      Return 
  2603.      
  2604.      GTCH1:
  2605.      If LINE(1)=-1 or LINE(1)=0
  2606.           CH1=MCH
  2607.      Else 
  2608.           CH1=LINE(1)-1
  2609.      End If 
  2610.      Return 
  2611.      
  2612.      GTCH2:
  2613.      If LINE(2)=-1 or LINE(2)=0
  2614.           CH2=MCH
  2615.      Else 
  2616.           CH2=LINE(2)-1
  2617.      End If 
  2618.      Return 
  2619.      
  2620.      PTLOD:
  2621.      LODST(LODST,0)=LINE(0) : LODST(LODST,1)=LINE(1) : LODST(LODST,2)=LINE(2)
  2622.      Inc LODST
  2623.      Return 
  2624.      
  2625.      ERR: ERR0R[-1,-1,-1]
  2626.      
  2627. End Proc
  2628. Procedure FINDZONE[X,Y]
  2629.      For Q=31 To 0 Step -1
  2630.           If WK(0,Q)<>-1
  2631.                If X>=WK(0,Q) and X<=WK(2,Q) and Y>=WK(1,Q) and Y<=WK(3,Q) and WK(12,Q)
  2632.                     Exit 
  2633.                End If 
  2634.           End If 
  2635.      Next 
  2636. End Proc[Q]
  2637. Procedure FINDBACK[X,Y]
  2638.      X=X Screen(X) : Y=Y Screen(Y)
  2639.      For Q=31 To 0 Step -1
  2640.           If BK(0,Q)<>-1 and BK(23,Q)=-1
  2641.                If X>=BK(0,Q) and X<=BK(2,Q) and Y>=BK(1,Q) and Y<=BK(3,Q) and BK(23,Q)
  2642.                     Exit 
  2643.                End If 
  2644.           End If 
  2645.      Next 
  2646. End Proc[Q]
  2647. Procedure FINDINV[X,Y]
  2648.      If INVD=1
  2649.           Screen 7 : X=X Screen(X) : Y=Y Screen(Y)
  2650.           If X>CSTUFF(6) and Y>CSTUFF(7) and X<CSTUFF(8) and Y<CSTUFF(9)
  2651.                Q=(X-CSTUFF(6))/ILEN
  2652.                W=(Y-CSTUFF(7))/FH(0)
  2653.                If Q>-1 and Q<5 and W>-1 and W<11
  2654.                     I=M1NV(Q,W)
  2655.                Else 
  2656.                     I=-1
  2657.                End If 
  2658.           Else 
  2659.                I=-1
  2660.           End If 
  2661.      Else 
  2662.           I=-1
  2663.      End If 
  2664. End Proc[I]
  2665. Procedure PREMOVE[X0,Y0]
  2666.      FINDZONE[X0,Y0]
  2667.      If Param<>-1 : XPM=X0 : YPM=Y0 : Pop Proc : End If 
  2668.      DX=1000 : DY=1000
  2669.      For Q=0 To 31
  2670.           If WK(0,Q)<>-1 and WK(12,Q)
  2671.                If X0>=WK(0,Q) and X0<=WK(2,Q)
  2672.                     If Y0<WK(1,Q)
  2673.                          D=WK(1,Q)-Y0
  2674.                     Else 
  2675.                          D=WK(3,Q)-Y0
  2676.                     End If 
  2677.                     If Abs(D)<Abs(DY) : DY=D : End If 
  2678.                Else If Y0>=WK(1,Q) and Y0<=WK(3,Q)
  2679.                     If X0<WK(0,Q)
  2680.                          D=WK(0,Q)-X0
  2681.                     Else 
  2682.                          D=WK(2,Q)-X0
  2683.                     End If 
  2684.                     If Abs(D)<Abs(DX) : DX=D : End If 
  2685.                End If 
  2686.           End If 
  2687.      Next 
  2688.      If Abs(DX)>Abs(DY)
  2689.           XPM=X0 : YPM=Y0+DY
  2690.      Else 
  2691.           XPM=X0+DX : YPM=Y0
  2692.      End If 
  2693. End Proc
  2694. Procedure NICEIFF[SFADE]
  2695.      Screen SFADE : Screen Clone 4 : Screen To Back 4
  2696.      For W=0 To 31 : Colour W,0 : Next 
  2697.      View : Auto View On 
  2698.      Screen Show SFADE : Screen SFADE : Fade 1 To 4 : Screen Close 4 : Wait 15
  2699.      Auto View Off 
  2700. End Proc
  2701. Procedure FLAG[FLAG,V4LUE]
  2702.      If FLAG=0 : Pop Proc : End If 
  2703.      FLAG=Abs(FLAG)
  2704.      FLAG(FLAG)=V4LUE
  2705.      Screen 0
  2706.      For Q=0 To 15
  2707.           If FR(0,Q)<>-1
  2708.                If Abs(FR(10,Q))=FLAG
  2709.                     DR4W=-1
  2710.                     If FR(10,Q)>0
  2711.                          If FLAG(FR(10,Q))=0 : DR4W=0 : End If 
  2712.                     Else If FR(10,Q)<0
  2713.                          If FLAG(-1*FR(10,Q))<>0 : DR4W=0 : End If 
  2714.                     End If 
  2715.                If DR4W : Set Bob Q,FR(21,Q),, : Bob Q,FR(4,Q),FR(5,Q),FR(2,Q)+SOBJ : Else Bob Off Q : End If 
  2716.                End If 
  2717.           End If 
  2718.           If BK(0,Q)<>-1
  2719.                If Abs(BK(10,Q))=FLAG
  2720.                     DR4W=-1
  2721.                     If BK(10,Q)>0
  2722.                          If FLAG(BK(10,Q))=0 : DR4W=0 : End If 
  2723.                     Else If BK(10,Q)<0
  2724.                          If FLAG(-1*BK(10,Q))<>0 : DR4W=0 : End If 
  2725.                     End If 
  2726.                If DR4W : BK(23,Q)=-1 : Else BK(23,Q)=0 : End If 
  2727.                End If 
  2728.           End If 
  2729.      Next 
  2730.      For Q=0 To 31
  2731.           If WK(0,Q)<>-1
  2732.                If Abs(WK(10,Q))=FLAG
  2733.                     DR4W=-1
  2734.                     If WK(10,Q)>0
  2735.                          If FLAG(WK(10,Q))=0 : DR4W=0 : End If 
  2736.                     Else If WK(10,Q)<0
  2737.                          If FLAG(-1*WK(10,Q))<>0 : DR4W=0 : End If 
  2738.                     End If 
  2739.                If DR4W : WK(12,Q)=-1 : Else WK(12,Q)=0 : End If 
  2740.                End If 
  2741.           End If 
  2742.      Next 
  2743. End Proc
  2744. Procedure STSAM[VO1CE,BANK,FRQ,L00P]
  2745.      If FRQ<100 : FRQ=FRQ*1000 : End If 
  2746.      If L00P
  2747.           Sam Loop On 
  2748.      Else 
  2749.           Sam Loop Off 
  2750.      End If 
  2751.       Extension_19_0062 Not(VO1CE)
  2752.      Sam Raw VO1CE,Start(BANK),Length(BANK),FRQ
  2753.      If L00P
  2754.           STIME=0
  2755.      Else 
  2756.           STIME=Timer+(Length(BANK)*50)/FRQ
  2757.      End If 
  2758. End Proc
  2759. Procedure SAVGAME[N]
  2760.      Reserve As Work 99,16000
  2761.      AD=Start(99)
  2762.      For Q=0 To 999
  2763.           Loke AD,FLAG(Q) : AD=AD+4
  2764.      Next 
  2765.      For Q=0 To 32
  2766.           For W=0 To 2
  2767.                For E=0 To 5
  2768.                     Loke AD,CRD(Q,W,E) : AD=AD+4
  2769.                Next 
  2770.           Next 
  2771.      Next 
  2772.      For W=0 To 99
  2773.           Loke AD,INV(11,W) : AD=AD+4
  2774.      Next 
  2775.      For W=0 To 15
  2776.           Loke AD,A(W,2) : AD=AD+4
  2777.           Trap NL=I Bob(W)
  2778.           If Errtrap=0
  2779.                Loke AD,I Bob(W)-SOBJ : AD=AD+4
  2780.           Else 
  2781.                Loke AD,-1 : AD=AD+4
  2782.           End If 
  2783.           Loke AD,FR(21,W) : AD=AD+4
  2784.      Next 
  2785.      For Q=0 To 4
  2786.           For W=0 To 10
  2787.                Loke AD,M1NV(Q,W) : AD=AD+4
  2788.           Next 
  2789.      Next 
  2790.      For Q=0 To 10
  2791.           Loke AD,CHO1CE(Q) : AD=AD+4
  2792.      Next 
  2793.      For Q=0 To 9
  2794.           Loke AD,VO(Q) : AD=AD+4
  2795.      Next 
  2796.      For Q=0 To 255
  2797.           For W=0 To 2
  2798.                Loke AD,LODST(Q,W) : AD=AD+4
  2799.           Next 
  2800.      Next 
  2801.      Loke AD,CPALETTE : AD=AD+4
  2802.      For Q=0 To 31
  2803.           If CPALETTE>-1
  2804.                Screen 7 : Loke AD,Colour(Q) : AD=AD+4
  2805.                Screen 3 : Loke AD,Colour(Q) : AD=AD+4
  2806.           Else 
  2807.                AD=AD+4 : AD=AD+4
  2808.           End If 
  2809.      Next 
  2810.      Repeat 
  2811.           Read Q : Loke AD,Q : AD=AD+4
  2812.      Until Q=-2532
  2813.      For Q=0 To 4
  2814.           Loke AD,IZ(Q) : Loke AD+4,PX(Q) : Loke AD+8,PY(Q) : Loke AD+12,I(Q) : AD=AD+16
  2815.           Loke AD,NL : Loke AD+4,OFF(Q) : Loke AD+8,CPT(Q) : Loke AD+12,TURN(Q) : AD=AD+16
  2816.           Loke AD,BFRAME(Q) : Loke AD+4,FRAME(Q) : Loke AD+8,ANG(Q) : Loke AD+12,SANG(Q) : AD=AD+16
  2817.           Loke AD,D(Q) : Loke AD+4,IPX(Q) : Loke AD+8,IPY(Q) : Loke AD+12,FPX(Q) : AD=AD+16
  2818.           Loke AD,FPY(Q) : Loke AD+4,ACTIVE(Q) : Loke AD+8,W(Q) : Loke AD+12,E(Q) : AD=AD+16
  2819.           Loke AD,CC(Q) : Loke AD+4,ST0P(Q) : Loke AD+8,FIRST(Q) : Loke AD+12,H(Q) : AD=AD+16
  2820.           Loke AD,NL : Loke AD+4,IZM(Q) : Loke AD+8,IZL(Q) : Loke AD+12,0 : AD=AD+16
  2821.      Next 
  2822.      Data NP,MCH,INVD,T0TAL,T1MER,TST,T0TAL2,VB,ROOMSEL,ITEM
  2823.      Data OBJ,TYPE,OBJ2,TYPE2,FIRST,LAST,FRZE,ENTRY,VO1CEC,VO1CEH,VO1CEX,VO1CEY,FLOOR,HORIZON,SCALE
  2824.      Data PASTEX,PASTEY,PASTE
  2825.      Data XOFF,YOFF,SCR0LL,LODST,MUS,NOW4LK
  2826.      Data PAUSE,PST,PQ,T1MER2,GTIME,RTIME
  2827.      Data NL,NL,NL,NL,NL,NL,NL,NL
  2828.      Data -2532
  2829.      REQUEST[CH(99,0),-1]
  2830.      If Param
  2831.           Trap Save DEV$(CH(99,0))+"GRAC"+Str$(N)+".save",99
  2832.           Trap Save DEV$(CH(99,0))+"GRAC"+Str$(N)+".csave",98
  2833.      End If 
  2834.      Erase 99
  2835. End Proc
  2836. Procedure LODGAME[N]
  2837.      Dim CC2(4) : Dim B(1,15)
  2838.      REQUEST[CH(99,0),-1]
  2839.      If Param=0 : Pop Proc : End If 
  2840.      Trap Load DEV$(CH(99,0))+"GRAC"+Str$(N)+".save",99
  2841.      If Errtrap<>0
  2842.           Pop Proc
  2843.      End If 
  2844.      Load DEV$(CH(99,0))+"GRAC"+Str$(N)+".csave",98
  2845.       Extension_19_0030 
  2846.      Trap Screen Close 2
  2847.      Trap Screen 0 : If Errtrap=0 : Flash Off : Fade 1 : Wait 15 : Screen Close 0 : End If 
  2848.      AD=Start(99)
  2849.      For Q=0 To 999
  2850.           R : FLAG(Q)=R
  2851.      Next 
  2852.      For Q=0 To 32
  2853.           For W=0 To 2
  2854.                For E=0 To 5
  2855.                     R : CRD(Q,W,E)=R
  2856.                Next 
  2857.           Next 
  2858.      Next 
  2859.      For W=0 To 99
  2860.           R : INV(11,W)=R
  2861.      Next 
  2862.      For W=0 To 15
  2863.           R : A(W,2)=R
  2864.           R : B(1,W)=R
  2865.           R : B(0,W)=R
  2866.      Next 
  2867.      For Q=0 To 4
  2868.           For W=0 To 10
  2869.                R : M1NV(4,10)=R
  2870.           Next 
  2871.      Next 
  2872.      For Q=0 To 10
  2873.           R : CHO1CE(Q)=R
  2874.      Next 
  2875.      For Q=0 To 9
  2876.           R : VO(Q)=R
  2877.      Next 
  2878.      For Q=0 To 255
  2879.           For W=0 To 2
  2880.                R : LODST(Q,W)=R
  2881.           Next 
  2882.      Next 
  2883.      R : CPALETTE=R
  2884.      If CPALETTE>-1
  2885.           REQUEST[PIC(CPALETTE),0]
  2886.           Trap Load DEV$(PIC(CPALETTE))+"GRAC"+Str$(CPALETTE)+".picture",6
  2887.           If Errtrap<>0 : ERR0R[4,PICSEL,1] : End If 
  2888.           Unpack 6 To 3 : Erase 6
  2889.           Screen Hide 3
  2890.      End If 
  2891.      For Q=0 To 31
  2892.           If CPALETTE>-1
  2893.                Screen 7 : Colour Q,Leek(AD) : AD=AD+4
  2894.                Screen 3 : Colour Q,Leek(AD) : AD=AD+4
  2895.           Else 
  2896.                AD=AD+8
  2897.           End If 
  2898.      Next 
  2899.      R : NP=R : R : MCH=R : R : INVD=R : R : T0TAL=R : R : T1MER=R : R : TST=R
  2900.      R : T0TAL2=R : R : R : ROOMSEL2=R : R : ITEM=R
  2901.      R : OBJ=R : R : TYPE=R : R : OBJ2=R : R : TYPE2=R : R : FIRST=R : R : LAST=R : R : FRZE=R
  2902.      R : ENTRY=R : R : VO1CEC=R : R : VO1CEH=R : R : VO1CEX=R : R : VO1CEY=R : R : FLOOR2=R : R : HORIZON2=R : R : SCALE2=R
  2903.      R : PASTEX=R : R : PASTEY=R : R : PASTE=R
  2904.      R : XOFF=R : R : YOFF=R : R : SCR0LL=R : R : LODST=R : R : MUS=R : R : NOW4LK=R
  2905.      R : PAUSE2=R : R : PST=R : R : PQ=R : R : T1MER2=R : R : RTIME=R : R : GTIME=R
  2906.      R : NL=R : R : NL=R : R : NL=R : R : NL=R : R : NL=R : R : NL=R : R : NL=R : R : NL=R : R
  2907.      For Q=0 To 4
  2908.           R : IZ(Q)=R : R : PX(Q)=R : R : PY(Q)=R : R : I(Q)=R
  2909.           R : NL=R : R : OFF(Q)=R : R : CPT(Q)=R : R : TURN(Q)=R
  2910.           R : BFRAME(Q)=R : R : FRAME(Q)=R : R : ANG(Q)=R : R : SANG(Q)=R
  2911.           R : D(Q)=R : R : IPX(Q)=R : R : IPY(Q)=R : R : FPX(Q)=R
  2912.           R : FPY(Q)=R : R : ACTIVE(Q)=R : R : W(Q)=R : R : E(Q)=R
  2913.           R : CC2(Q)=R : R : ST0P(Q)=R : R : FIRST(Q)=R : R : H(Q)=R
  2914.           R : NL=R : R : IZM(Q)=R : R : IZL(Q)=R : R
  2915.      Next 
  2916.      Erase 99
  2917.      MMCH=B0B(ROOM(ROOMSEL2,2),MCH+1)+1
  2918.      L0ADR[ROOMSEL2]
  2919.      For Q=0 To 4
  2920.           ZL(Q)=0 : HL(Q)=0 : IL(Q)=0
  2921.           CC(Q)=CC2(Q)
  2922.           For W=0 To 4
  2923.                If CL(W,0)=B0B(ROOM(ROOMSEL2,2),CC(Q)+1) : S(Q)=CL(W,1) : Exit : End If 
  2924.           Next 
  2925.      Next 
  2926.      PAUSE=PAUSE2 : FLOOR=FLOOR2 : HORIZON=HORIZON2 : SCALE=SCALE2
  2927.      INVD=0 : UPD4TE=0 : S4VE=0 : SPIC=0 : CU=0
  2928.      DR4WROOM[PNT,0]
  2929.      For W=0 To 15
  2930.           FR(21,W)=B(0,W)
  2931.      Next 
  2932.      B0BS
  2933.      For W=0 To 15
  2934.           FR(21,W)=B(0,W)
  2935.           If B(1,W)<>-1 : Bob W,,,B(1,W)+SOBJ : End If 
  2936.      Next 
  2937.      LODST
  2938.      If MUS<>-1
  2939.           Trap Extension_19_0016 2,MUS
  2940.      End If 
  2941.      UPD4TE=-1
  2942.      UPD4TE[0] : NICEIFF[0] : Screen Show 7 : Show On 
  2943. End Proc
  2944. Procedure CLEARALL
  2945.       Extension_19_0030 
  2946.      For Q=1 To 999
  2947.           FLAG(Q)=0
  2948.      Next 
  2949.      For W=0 To 99
  2950.           INV(11,W)=0
  2951.      Next 
  2952.      For Q=0 To 10
  2953.           CHO1CE(Q)=-1
  2954.      Next 
  2955.      For Q=0 To 9
  2956.           VO(Q)=0
  2957.      Next 
  2958.      NP=0 : INVD=0 : T0TAL=0 : T1MER=0 : TST=0
  2959.      T0TAL2=0 : ROOMSEL2=0 : ITEM=0
  2960.      OBJ=0 : TYPE=0 : OBJ2=0 : TYPE2=0 : FIRST=0 : LAST=0 : FRZE=0
  2961.      ENTRY=0 : VO1CEC=0 : VO1CEH=0 : VO1CEX=0 : VO1CEY=0 : FLOOR=0 : HORIZON=0 : SCALE=0
  2962.      PASTEX=0 : PASTEY=0 : PASTE=0
  2963.      XOFF=0 : YOFF=0 : LODST=0 : MUS=0 : NOW4LK=0 : S4VE=0
  2964.      PAUSE=0 : PST=0 : PQ=0 : T1MER2=0 : GTIME=0 : RTIME=0
  2965.      For E=0 To 2 : OL(E,0)=-1 : OL(E,1)=0 : OL(E,2)=0 : Next 
  2966.      For E=0 To 4 : CL(E,0)=-1 : CL(E,1)=0 : Next 
  2967.      For Q=0 To 4
  2968.           IZ(Q)=0 : PX(Q)=0 : PY(Q)=0 : I(Q)=0
  2969.           OFF(Q)=0 : CPT(Q)=0 : TURN(Q)=0
  2970.           BFRAME(Q)=0 : FRAME(Q)=0 : ANG(Q)=0 : SANG(Q)=0
  2971.           D(Q)=0 : IPX(Q)=0 : IPY(Q)=0 : FPX(Q)=0
  2972.           FPY(Q)=0 : ACTIVE(Q)=0 : W(Q)=0 : E(Q)=0
  2973.           ST0P(Q)=0 : FIRST(Q)=0 : H(Q)=0
  2974.           IZM(Q)=0 : IZL(Q)=0
  2975.           ZL(Q)=0 : HL(Q)=0 : IL(Q)=0
  2976.      Next 
  2977.      Reserve As Work 98,5600
  2978. End Proc
  2979. Procedure R
  2980.      P=Varptr(R) : Loke P,Leek(AD) : AD=AD+4
  2981. End Proc
  2982. Procedure RD
  2983.      R=Deek(AD) : AD=AD+2
  2984.      If R>32768 : R=R-65536 : End If 
  2985. End Proc
  2986. Procedure RP
  2987.      R=Peek(AD) : AD=AD+1
  2988.      If R>128 : R=R-256 : End If 
  2989. End Proc
  2990. Procedure RT
  2991.      R$=Peek$(AD,1000,"�") : AD=AD+Len(R$)+1
  2992. End Proc
  2993. Procedure LODST
  2994.      Q=0
  2995.      Do 
  2996.           If Q=LODST : Pop Proc : End If 
  2997.           Gosub LODST(Q,0)*100
  2998.           Inc Q
  2999.      Loop 
  3000.      
  3001.      'paste 
  3002.      800 PASTEX=BK(4,LODST(Q,1)-1)
  3003.      PASTEY=BK(5,LODST(Q,1)-1)
  3004.      IMAGE=LODST(Q,2) : If IMAGE<0 : IMAGE=Abs(IMAGE)+$8000 : End If 
  3005.      PASTE=IMAGE+SOBJ
  3006.      Screen 0
  3007.      H0TSP0T[PASTE]
  3008.      For E=0 To 1
  3009.           Bob Clear : Paste Bob PASTEX-HXREV,PASTEY-HY,PASTE : Bob Draw : Screen Swap 
  3010.      Next 
  3011.      PASTE=0
  3012.      Return 
  3013.      
  3014.      'amal
  3015.      4400 B0B=16-LODST(Q,1)
  3016.      Channel B0B-1 To Bob B0B
  3017.      If LODST(Q,2)-1>-1
  3018.           Trap Amal B0B-1,TXT$(LODST(Q,2)-1)
  3019.      Else 
  3020.           Trap Amal B0B-1,""
  3021.      End If 
  3022.      Amal On 
  3023.      Return 
  3024.      
  3025.      'load palette
  3026.      4800 PICSEL=LODST(Q,1)-1
  3027.      REQUEST[PIC(PICSEL),0]
  3028.      Trap Load DEV$(PIC(PICSEL))+"GRAC"+Str$(PICSEL)+".picture",6
  3029.      If Errtrap<>0 : ERR0R[4,PICSEL,1] : End If 
  3030.      Unpack 6 To 1 : Erase 6
  3031.      Screen Hide 1
  3032.      Return 
  3033.      
  3034.      'fade
  3035.      4900 Screen 1 : Screen Clone 4 : Screen 1 : Get Palette 0
  3036.      Screen 0 : Get Palette 4
  3037.      Screen Close 4
  3038.      Return 
  3039.      
  3040.      'sound back  
  3041.      5900 SAM=LODST(Q,1)-1
  3042.      FRQ=LODST(Q,2) : If FRQ<1 : FRQ=10000 : End If 
  3043.      LSAM[SAM]
  3044.      OK=Param
  3045.      If OK
  3046.           STSAM[%1100,100+SAM,FRQ,-1]
  3047.      End If 
  3048.      Return 
  3049.      
  3050.      'load sample 
  3051.      6100 SAM=LODST(Q,1)-1
  3052.      LSAM[SAM]
  3053.      Return 
  3054.      
  3055.      'erase sample
  3056.      6400 Erase 100+LODST(Q,1)-1
  3057.      Return 
  3058.      
  3059.      'flash   
  3060.      8000 Screen 0
  3061.      Flash LODST(Q,1),TXT$(LODST(Q,2)-1)
  3062.      Return 
  3063.      
  3064.      'cycle 
  3065.      9200 Screen 0 : Shift Up 5,LODST(Q,1),LODST(Q,2),1
  3066.      For E=0 To 31
  3067.           PAL(E)=Colour(E)
  3068.      Next 
  3069.      Return 
  3070.      
  3071.      'cycle off 
  3072.      9300 Shift Off 
  3073.      For E=0 To 31
  3074.           Colour E,PAL(E)
  3075.      Next 
  3076.      Return 
  3077.      
  3078.      'anim
  3079.      10300 If LODST(Q,1)<>-1
  3080.           OBJ=16-LODST(Q,1)
  3081.      Else 
  3082.           OBJ=OBJ
  3083.      End If 
  3084.      A$=TXT$(LODST(Q,2)-1)
  3085.      Reserve As Work 30+OBJ,600
  3086.      AD=Start(30+OBJ)
  3087.      A(OBJ,1)=0
  3088.      E=0 : Repeat : Inc E : Until Mid$(A$,E,1)="("
  3089.      While Mid$(A$,E,1)="("
  3090.           For A=0 To 2
  3091.                R=E : Repeat : Inc E : Until Mid$(A$,E,1)="," or Mid$(A$,E,1)=")"
  3092.                Doke AD,Val(Mid$(A$,R+1,E-R-1)) : AD=AD+2
  3093.           Next 
  3094.           Inc E : Inc A(OBJ,1)
  3095.      Wend 
  3096.      If Mid$(A$,5,1)="L"
  3097.           A(OBJ,0)=-1
  3098.      Else 
  3099.           A(OBJ,0)=1
  3100.      End If 
  3101.      Return 
  3102.      
  3103. End Proc
  3104. Procedure REQUEST[D,C]
  3105.      E=-1 : M$=MGE$
  3106.      Trap Q$=DEV$(D)
  3107.      If Errtrap=0
  3108.           If Not Exist(Q$)
  3109.                For Q=1 To Len(Q$)
  3110.                     If Mid$(Q$,Q,1)=":"
  3111.                          If Scin(CSTUFF(0)+16,CSTUFF(1)+16)<0 : NO7=-1 : End If 
  3112.                          Q$=Left$(Q$,Q)
  3113.                          If C
  3114.                               MGE["Please insert volume "+Q$+" (r. mouse cancel)"] : UPD4TE[-1]
  3115.                          Else 
  3116.                               MGE["Please insert volume "+Q$] : UPD4TE[-1]
  3117.                          End If 
  3118.                          While Not Exist(Q$) : If C and Mouse Key=2 : E=0 : Exit : End If : Wend 
  3119.                          MGE[M$]
  3120.                          If NO7=-1 : Screen Hide 7 : End If 
  3121.                     End If 
  3122.                Next 
  3123.           End If 
  3124.      Else 
  3125.           E=0
  3126.      End If 
  3127. End Proc[E]
  3128. Procedure CHECK[Q$]
  3129.      E=0 : M=0 : M$=MGE$
  3130.      If Scin(CSTUFF(0)+16,CSTUFF(1)+16)<0 : NO7=-1 : End If 
  3131.      MGE[Q$+" (l.mouse okay, r.mouse cancel)"] : UPD4TE[-1]
  3132.      While Mouse Key<>0 : Wend 
  3133.      While M<>1 and M<>2
  3134.           M=Mouse Key
  3135.           If M=1 : E=-1 : Exit : End If 
  3136.      Wend 
  3137.      While Mouse Key<>0 : Wend 
  3138.      MGE[M$]
  3139.      If NO7=-1 : Screen Hide 7 : End If 
  3140. End Proc[E]
  3141. Procedure ERR0R[FILE,NO,TYPE]
  3142.      For Q=0 To 7
  3143.           Trap Screen Close Q
  3144.      Next 
  3145.      Screen Open 0,320,200,2,Hires
  3146.      Hide : Curs Off : Flash Off : Paper 0 : Pen 1 : Palette $0,$FFF : View 
  3147.      NO$="" : If NO>-1 : NO$=" "+Str$(NO+1) : End If 
  3148.      If TYPE=-1
  3149.           Print "unclassified error"
  3150.      Else If TYPE=0
  3151.           Print "compression error: "+ER$(FILE)+NO$
  3152.      Else If TYPE=1
  3153.           Print "loading error: "+ER$(FILE)+NO$
  3154.      Else If TYPE=2
  3155.           Print "control panel error: no "+ER$(FILE)
  3156.      Else If TYPE=3
  3157.           Print "point error: "+ER$(FILE)+NO$
  3158.      Else If TYPE=4
  3159.           Print "room error: no "+ER$(FILE)
  3160.      End If 
  3161.      Print 
  3162.      Print "room number "+Str$(ROOMSEL+1)
  3163.      Print "script number "+Str$(WG)
  3164.      Print "line number "+Str$(QG+1)
  3165.      Print 
  3166.      Print "click to exit"
  3167.      While Mouse Key=0 : Wend 
  3168.      While Mouse Key<>0 : Wend 
  3169.      End 
  3170. End Proc
  3171. Procedure AN1M[NAME$,DELAY]
  3172.      Trap Open In 1,NAME$
  3173.      Trap N=Frame Load(1 To 10,1000)
  3174.      If Errtrap=0
  3175.           Close 1
  3176.           P=Frame Play(10,1,2)
  3177.           Double Buffer 
  3178.           NICEIFF[2]
  3179.           For X=2 To N-2
  3180.                P=Frame Play(P,1) : Wait Vbl 
  3181.                Screen Swap 
  3182.                Wait Vbl 
  3183.                If DELAY>0 : Wait DELAY : End If 
  3184.           Next 
  3185.           Wait 25
  3186.           Fade 1 : Wait 15
  3187.           Erase 10 : Screen Close 2
  3188.      Else 
  3189.           Close 1 : Erase 10
  3190.      End If 
  3191. End Proc
  3192. Procedure STORECH
  3193.      AD0=Start(98)
  3194.      For Q=0 To 4
  3195.           If Q<>MCH and ACTIVE(Q)<0
  3196.                W=B0B(ROOM(ROOMSEL,2),Q+1)+1
  3197.                AD=AD0+56*(W-1) : If AD-Start(98)>5600-56 : End : End If 
  3198.                Loke AD,ROOMSEL : Loke AD+4,PX(Q) : Loke AD+8,PY(Q) : Loke AD+12,I(Q) : AD=AD+16
  3199.                Loke AD,NL : Loke AD+4,OFF(Q) : Loke AD+8,BFRAME(Q) : Loke AD+12,FRAME(Q) : AD=AD+16
  3200.                Loke AD,ANG(Q) : Loke AD+4,SANG(Q) : Loke AD+8,H(Q) : Loke AD+12,NL : AD=AD+16
  3201.                Loke AD,IZ(Q) : Loke AD+4,ACTIVE(Q)
  3202.           End If 
  3203.      Next 
  3204. End Proc
  3205. Procedure GTCH
  3206.      AD0=Start(98)
  3207.      For Q=0 To 4
  3208.           If Q<>MCH
  3209.                W=B0B(ROOM(ROOMSEL,2),Q+1)+1
  3210.                AD=AD0+56*(W-1)
  3211.                R : ROOM=R
  3212.                If ROOM=ROOMSEL
  3213.                     R : PX(Q)=R : R : PY(Q)=R : R : I(Q)=R
  3214.                     R : NL=R : R : OFF(Q)=R : R : BFRAME(Q)=R : R : FRAME(Q)=R
  3215.                     R : ANG(Q)=R : R : SANG(Q)=R : R : H(Q)=R : R : NL=R
  3216.                     R : IZ(Q)=R : R : ACTIVE(Q)=R
  3217.                End If 
  3218.           End If 
  3219.      Next 
  3220. End Proc
  3221. Procedure DR4WCU
  3222.      Unpack 6 To 2 : Screen Hide 2 : Erase 6
  3223.      Screen Display 2,CSTUFF(4),CSTUFF(5),,
  3224.      Double Buffer : Autoback 0
  3225.      For Q=0 To 15
  3226.           If CZONE(0,Q)>0
  3227.                H0TSP0T[CZONE(7,Q)+SCU]
  3228.                Paste Bob CZONE(5,Q)-HXREV,CZONE(6,Q)-HY,CZONE(7,Q)+SCU : Screen Swap : Wait Vbl 
  3229.                Paste Bob CZONE(5,Q)-HXREV,CZONE(6,Q)-HY,CZONE(7,Q)+SCU : Screen Swap : Wait Vbl 
  3230.           End If 
  3231.      Next 
  3232.      UCU=0
  3233.      ST[201]
  3234.      If UCU=0 : NICEIFF[2] : End If 
  3235. End Proc
  3236. Procedure LSAM[SAM]
  3237.      F$=DEV$(SAM(SAM))+"GRAC"+Str$(SAM)+".sample"
  3238.      If Length(SAM+100)=0
  3239.           REQUEST[SAM(SAM),0]
  3240.           Trap Open In 1,F$
  3241.           If Errtrap=0
  3242.                L=Lof(1) : Close 1
  3243.                Reserve As Chip Work 100+SAM,L
  3244.                Bload F$,100+SAM
  3245.                OK=-1
  3246.           Else 
  3247.                OK=0
  3248.           End If 
  3249.      Else 
  3250.           OK=-1
  3251.      End If 
  3252. End Proc[OK]
  3253. Procedure B0BS
  3254.      Screen 0 : B0BS=-1
  3255.      For Q=0 To 15
  3256.           DR4W=-1
  3257.           If FR(0,Q)<>-1
  3258.                If FR(10,Q)>0
  3259.                     If FLAG(FR(10,Q))=0 : DR4W=0 : End If 
  3260.                Else If FR(10,Q)<0
  3261.                     If FLAG(-1*FR(10,Q))<>0 : DR4W=0 : End If 
  3262.                End If 
  3263.                If DR4W : Set Bob Q,FR(21,Q),, : Bob Q,FR(4,Q),FR(5,Q),FR(2,Q)+SOBJ : End If 
  3264.           End If 
  3265.      Next 
  3266. End Proc
  3267. Procedure WA1TSTOP[C,L]
  3268.      P0P=0
  3269.      While ACTIVE(C)<-1
  3270.           Gosub CHECKKEY
  3271.           If L=0
  3272.                M=Mouse Key
  3273.                If M<>0 : NP=-1*M : ST0P(C)=-1 : P0P=-1 : End If 
  3274.           End If 
  3275.           If Timer-UTIME>5
  3276.                IZL(C)=IZM(C)
  3277.                UPD4TE[0] : IZM(C)=IZ(C)
  3278.                If L=0
  3279.                     If IZM(C)<>IZL(C)
  3280.                          If WK(11,IZM(C))<>-1
  3281.                               ST[WK(11,IZM(C))]
  3282.                          End If 
  3283.                     End If 
  3284.                End If 
  3285.                If T0TAL2>0 and T1MER>=T0TAL2
  3286.                     T0TAL2=0 : ST[TST]
  3287.                End If 
  3288.                If PAUSE>0 and T1MER2>=PAUSE
  3289.                     PAUSE=-1 : ST[PST]
  3290.                End If 
  3291.           End If 
  3292.           If P0P : Exit : End If 
  3293.      Wend 
  3294.      Pop Proc
  3295.      
  3296.      CHECKKEY:
  3297.      I$=Inkey$ : I1=Scancode : S1=Scanshift
  3298.      If I1>79 and I1<90 and S1=0
  3299.           LI1=I1 : LS1=S1
  3300.           CHECK["load game"+Str$(I1-79)] : P=Param
  3301.           If P
  3302.                REQUEST[CH(99,0),-1]
  3303.                If Exist(DEV$(CH(99,0))+"GRAC"+Str$(I1-80)+".save")
  3304.                     Trap Screen Close 2 : P0P=-1 : Pop Proc
  3305.                End If 
  3306.           Else LI1=0
  3307.           End If 
  3308.      Else If I$="q"
  3309.           CHECK["quit?"] : P=Param
  3310.           If P : End : End If 
  3311.      End If 
  3312.      Return 
  3313. End Proc
  3314. Procedure Z00M[SX,SY,DX,DY]
  3315.      If SY>99 : SY=99 : End If 
  3316.      If SX>32
  3317.           Dreg(0)=1
  3318.      Else Dreg(0)=0
  3319.      End If 
  3320.      Dreg(1)=SY
  3321.      Dreg(2)=DX
  3322.      Dreg(3)=DY
  3323.      Call 48,P(0),P(1),P(2),P(3),P(4)
  3324.      S=Start(47)
  3325.      Fill S To S+Length(47),0
  3326.      T=0 : N=SX-DX : AD=S+16 : A=0
  3327.      While T<N
  3328.           If AD<Start(47)+SX
  3329.                Poke AD,1 : Inc T : Add AD,16
  3330.           Else 
  3331.                If A<8
  3332.                     Add A,8
  3333.                Else If A<12
  3334.                     Add A,-4
  3335.                Else If A<14
  3336.                     Add A,-10
  3337.                Else If A<15
  3338.                     Add A,-13
  3339.                Else 
  3340.                     A=0
  3341.                End If 
  3342.                AD=S+A
  3343.           End If 
  3344.      Wend 
  3345.      L1=S : L=0 : Q=0
  3346.      While Q<=DX
  3347.           LL=L : QL=Q
  3348.           While Peek(L1)=0 : Inc L : Inc L1 : Inc Q : Wend 
  3349.           Screen Copy 6,LL,0,L,DY To 6,QL,0
  3350.           Repeat : Inc L : Inc L1 : Until Peek(L1)=0
  3351.      Wend 
  3352. End Proc
  3353. Procedure OPENFILE[DEV,Q$,L2,FILE,NO]
  3354.      REQUEST[DEV,0]
  3355.      Trap Q$=DEV$(DEV)+"GRAC"+Q$
  3356.      Trap Open In 1,Q$
  3357.      If Errtrap<>0 : ERR0R[FILE,NO,1] : End If 
  3358.      L=Lof(1) : Close 1
  3359.      Reserve As Work 17,L2
  3360.      Bload Q$,Start(17)
  3361.      L1=Leek(Start(17))
  3362.      If L1<>L2 : ERR0R[FILE,NO,0] : End If 
  3363.      L3= Extension_5_00E4(Start(17)+4,L-4)
  3364.      AD=Start(17)+4
  3365. End Proc