home *** CD-ROM | disk | FTP | other *** search
/ Amiga MA Magazine 1998 #6 / amigamamagazinepolishissue1998.iso / www / breed / files / leveled_ascii.lha / leved.txt
Text File  |  1996-11-01  |  184KB  |  7,693 lines

  1. Set Buffer 600
  2.  
  3. Dim CH$(255),OB$(10)
  4. CH$(Asc("-"))="-"
  5. Def Fn OTH$(PQ$)=CH$(Asc(Left$(PQ$,1)))+Right$(PQ$,Len(PQ$)-1)
  6. Def Fn MY$(PQ)=(Str$(PQ)-" ")
  7. MXP=600 : MZ=256
  8. Reserve As Work 10,32*33*2
  9.  
  10. Bload "ab3:includes/256pal",Start(10)
  11. Dim PALR(255),PALG(255),PALB(255)
  12. For A=0 To 255
  13.    PALR(A)=Deek(Start(10)+A*6)/(16)
  14.    PALG(A)=Deek(Start(10)+A*6+2)/(16)
  15.    PALB(A)=Deek(Start(10)+A*6+4)/(16)
  16. Next 
  17.  
  18. Dim LEVELTEXT$(15)
  19. For A=0 To 9
  20.    LEVELTEXT$(A)=Space$(160)
  21. Next 
  22.  
  23. TEAM=-1
  24.  
  25. Dim ECHO(MZ)
  26. Dim ALNAME$(19),OBNAME$(29)
  27. Dim ALHITPTS(19),OPS(20,6),LOPS(20,6)
  28. Dim OBTOROOF(30),LOCKTOWALL(30)
  29. Dim TELZO(MZ),TELX(MZ),TELZ(MZ),CPTUL(99)
  30. Dim USED(MZ),WB(MZ,10),UWB(MZ,10)
  31. Dim BUT$(59),PX(MXP),PY(MXP),ZO(MZ,10),ZP(MZ),WT(MZ,10),ZW(MZ,10,1)
  32. Dim ZH(MZ,3),ZC(MZ,10),ZB(MZ),UZB(MZ),OBX(200),OBZ(200),ZZ(MZ,10)
  33. Dim UZH(MZ,3),ZPBR(MZ,10,3)
  34. ',PBR(MXP),UPBR(MXP) 
  35. Dim ZRG(MZ,2),ZFG(MZ,2),ZWG(MZ,10,3),WD(MZ,10),ZD(MZ),DC(20)
  36. Dim UZRG(MZ,2),UZFG(MZ,2),UZWG(MZ,10,3)
  37. Dim VECT$(20),CPTX(99),CPTY(99),CPTZ(99),ZCPT(MZ),UZCPT(MZ),RB(MZ),FB(MZ)
  38. Dim VCPL(MZ),VCPR(MZ),LP(MZ,100),RP(MZ,100),ZU(MZ),PU(MXP)
  39. Dim PN(MXP),X(4),Y(4),D(MXP,3),SOW(20),PW(MXP),CORD(MZ),LIFTC(20)
  40. Dim PMCOM(30,2),PFCOM(30,2),WLI(MZ,10),ZLI(MZ)
  41. Dim DMX(30),DMZ(30),DMY(30),HILITE(10,1),PCW(MXP,1)
  42. Dim SWWL(7,1),SWP(7),KEYGRAPH(3),ZDPT(MZ),ZGPT(MZ),SGO(7)
  43. Dim DWPT(MZ,10),ZLIPT(20),ZDOPT(20)
  44. Dim DRT(20),DLT(20),LRT(20),LLT(20)
  45. Dim WATH(20),WABH(20),ZWA(MZ),WASP(20),WAPT(MZ)
  46. Dim FFT(16),SWITCHTYPE(20)
  47. Dim DR$(10),DL$(10)
  48. Dim LR$(10),LL$(10),BSFX(MZ)
  49. Dim LSP(20),WCHUNK$(20),WCY(20),WCSV(20)
  50. Dim BIGGUNGRAPH(9)
  51. Dim BIGGUNDIM(9,1)
  52. LWCHUNK=-200
  53. WGW=64
  54. ' plasmagun
  55. BIGGUNGRAPH(0)=1
  56. BIGGUNDIM(0,0)=32
  57. BIGGUNDIM(0,1)=16
  58. ' rocket launcher
  59. BIGGUNGRAPH(1)=20
  60. BIGGUNDIM(1,0)=16
  61. BIGGUNDIM(1,1)=32
  62. ' shotgun
  63. BIGGUNGRAPH(6)=25
  64. BIGGUNDIM(6,0)=32
  65. BIGGUNDIM(6,1)=16
  66. ' grenade launcher 
  67. BIGGUNGRAPH(3)=26
  68. BIGGUNDIM(3,0)=32
  69. BIGGUNDIM(3,1)=16
  70.  
  71. FFT(0)=0
  72. FFT(1)=2
  73. FFT(2)=2
  74. FFT(3)=1
  75. FFT(4)=1
  76. FFT(5)=2
  77. FFT(6)=1
  78. FFT(7)=2
  79. FFT(8)=1
  80. FFT(9)=1
  81. FFT(10)=2
  82. FFT(11)=2
  83. FFT(12)=0
  84. FFT(13)=0
  85. FFT(14)=2
  86. FFT(15)=1
  87.  
  88. For A=0 To MZ : TELZO(A)=-1 : Next 
  89.  
  90.  
  91. WCHUNK$(0)="GreenMechanic"
  92. WCY(0)=64 : WCSV(0)=6
  93. WCHUNK$(1)="BlueGreyMetal"
  94. WCY(1)=64 : WCSV(1)=6
  95. WCHUNK$(2)="TechnoDetail"
  96. WCY(2)=128 : WCSV(2)=7
  97. WCHUNK$(3)="BlueStone"
  98. WCY(3)=64 : WCSV(3)=6
  99. WCHUNK$(4)="RedAlert"
  100. WCY(4)=64 : WCSV(4)=6
  101. WCHUNK$(5)="Rock"
  102. WCY(5)=64 : WCSV(5)=6
  103. WCHUNK$(6)="scummy"
  104. WCY(6)=128 : WCSV(6)=7
  105. WCHUNK$(7)="stairfronts"
  106. WCY(7)=16 : WCSV(7)=4
  107. WCHUNK$(8)="bigdoor"
  108. WCY(8)=128 : WCSV(8)=7
  109. WCHUNK$(9)="redrock"
  110. WCY(9)=64 : WCSV(9)=6
  111. WCHUNK$(10)="dirt"
  112. WCY(10)=128 : WCSV(10)=7
  113. WCHUNK$(11)="SWITCHES"
  114. WCY(11)=64 : WCSV(11)=6
  115. WCHUNK$(12)="SHINYMETAL"
  116. WCY(12)=128 : WCSV(12)=7
  117. WCHUNK$(13)="bluemechanic"
  118. WCY(13)=64 : WCSV(13)=6
  119.  
  120. DR$(0)="Plr Touch+SPC"
  121. DR$(1)="Plr Touch    "
  122. DR$(2)="Bullet Touch "
  123. DR$(3)="Alien Touch  "
  124. DR$(4)="On Timeout   "
  125. DR$(5)="Never        "
  126. DL$(0)="On Timeout   "
  127. DL$(1)="Never        "
  128. LR$(0)="Plr Touch+SPC"
  129. LR$(1)="Plr Touch    "
  130. LR$(2)="On Timeout   "
  131. LR$(3)="Never        "
  132. LL$(0)="Plr Touch+SPC"
  133. LL$(1)="Plr Touch    "
  134. LL$(2)="On Timeout   "
  135. LL$(3)="Never        "
  136. TXT=-1
  137. For A=0 To 7 : SWWL(A,0)=-1 : SWWL(A,1)=-1 : Next 
  138. Dim SWT(10),BWT(10)
  139. SWT(0)=0 : BWT(0)=1
  140. SWT(1)=1 : BWT(1)=0
  141. SWT(2)=1 : BWT(2)=1
  142. SWT(3)=1 : BWT(3)=1
  143. SWT(4)=1 : BWT(4)=1
  144. SWT(5)=1 : BWT(5)=1
  145. For A=0 To 30 : PMCOM(A,0)=-1 : PFCOM(A,0)=-1 : Next 
  146. PCOM=0
  147. MP=Start(10)
  148. 'For A=0 To 12 
  149. '   F$= Fn MY$(A+1)
  150. '   Load Iff "ab3:graphics/walls/wall."+F$,0 
  151. '   Get Icon A+1,0,0 To 64,64
  152. '   For B=0 To 31 : Doke MP,Colour(B) : Add MP,2 : Next  
  153. 'Next  
  154. MP=Start(10)+64*16
  155. For A=0 To 15
  156.    F$= Fn MY$(A+1)
  157.    Load Iff "ab3:graphics/floors/floor."+F$,0
  158.    Get Icon A+17,0,0 To 64,64
  159.    For B=0 To 31 : Doke MP,Colour(B) : Add MP,2 : Next 
  160. Next 
  161. Bsave "ab3:includes/editorblocks.pal",Start(10) To Start(10)+Length(10)
  162. 'Else  
  163. '   Bload "ab3:includes/editorblocks.pal",Start(10)
  164. 'End If  
  165. For A=0 To MZ
  166.    For B=0 To 10
  167.       ZWG(A,B,3)=64
  168.    Next 
  169.    UZH(A,0)=5000 : UZH(A,1)=5000 : UZH(A,2)=5000
  170. ZH(A,2)=256 : ZH(A,1)=-128 : Next 
  171. EBX=0
  172. NCPT=-1
  173. Screen Open 3,320,16,2,Lowres
  174. Screen Hide 3
  175. Screen Open 4,320,64,4,Lowres
  176. Curs Off : Flash Off : Cls 0
  177. Screen Display 4,,40+200,,
  178. Screen Hide 4
  179. LG=-1
  180. Reserve As Work 12,200*64
  181. Reserve As Work 14,MZ*64*6
  182.  
  183. For A=Start(14) To Start(14)+Length(14)-4 Step 4
  184.    Loke A,-1
  185. Next 
  186. Reserve As Work 15,200000
  187.  
  188.  
  189. Bload "ab3:includes/test.lnk",Start(15)
  190. S=Start(15)+$34D8
  191. For A=0 To 19
  192.    For B=0 To 19
  193.       C=Peek(S)
  194.       If C<>0 Then ALNAME$(A)=ALNAME$(A)+Chr$(C)
  195.       Add S,1
  196.    Next 
  197. Next 
  198.  
  199. S=Start(15)+$57B0
  200. For A=0 To 29
  201.    For B=0 To 19
  202.       C=Peek(S)
  203.       If C<>0 Then OBNAME$(A)=OBNAME$(A)+Chr$(C)
  204.       Add S,1
  205.    Next 
  206. Next 
  207.  
  208. S=Start(15)+$5A08
  209. For A=0 To 29
  210.    OBTOROOF(A)=Deek(S+18)
  211.    LOCKTOWALL(A)=Deek(S+20)
  212.    S=S+40
  213. Next 
  214.  
  215. S=Start(15)+$3668
  216. For A=0 To 19
  217.    ALHITPTS(A)=Deek(S+32)
  218.    S=S+21*2
  219. Next 
  220.  
  221. S=Start(15)+$14760
  222. For A=0 To 15
  223.    WCHUNK$(A)=""
  224.    For B=0 To 63
  225.       If Peek(S)<>0
  226.          WCHUNK$(A)=WCHUNK$(A)+Chr$(Peek(S))
  227.       End If 
  228.       Add S,1
  229.    Next 
  230. Next 
  231.  
  232. For A=0 To 15
  233.    
  234.    WCY(A)=Deek(S) : Add S,2
  235.    
  236.    WCSV(A)=0
  237.    Repeat 
  238.       WCSV(A)=WCSV(A)+1
  239.    Until 2^WCSV(A)>=WCY(A)
  240.    
  241. Next 
  242.  
  243. Reserve As Work 11,100*100
  244. Reserve As Work 9,2000
  245. Pload "ab3:includes/BETPTS",9
  246. NP=-1 : CP=NP
  247. TXP=6*4+1
  248. '
  249. For A=0 To 10
  250.    OB$(A)="Undefined    "
  251. Next 
  252. OB$(0)="Alien "
  253. OB$(1)="Object"
  254. 'OB$(0)="Enemy        "
  255. 'OB$(1)="MediPac      "
  256. 'OB$(2)="Ammo Clip    "
  257. 'OB$(3)="Big Gun      "
  258. 'OB$(4)="Key          "
  259. 'OB$(5)="Vector Object"
  260. 'OB$(6)="Marine       "
  261. 'OB$(7)="Glass Ball   "
  262. 'OB$(8)="Barrel       "
  263. 'OB$(9)="Decoration   "
  264. '
  265. For A=0 To 20
  266.    VECT$(A)="Undefined           "
  267. Next 
  268. VECT$(0)="ROBOT               "
  269. VECT$(1)="reserved            "
  270. VECT$(2)="Lamp                "
  271. VECT$(3)="crate               "
  272. VECT$(4)="terminal            "
  273. VECT$(5)="Blue key Indicator  "
  274. VECT$(6)="Green key Indicator "
  275. VECT$(7)="Red key Indicator   "
  276. VECT$(8)="Yellow key Indicator"
  277. VECT$(9)="Gas Pipe            "
  278. VECT$(10)="Torch               "
  279. '
  280. BUT$(0)="Add Point                   "
  281. BUT$(3)="Delete Point                "
  282. BUT$(6)="Move Point                  "
  283.  
  284. BUT$(1)="Define New Zone             "
  285. BUT$(4)="Toggle Wall/Delete Zone     "
  286. BUT$(7)="Define Viewing Order        "
  287.  
  288. BUT$(9)="Upper Roof Height           "
  289. BUT$(12)="Upper Floor Height          "
  290. BUT$(15)="Define Roof Height          "
  291. BUT$(18)="Define Floor Height         "
  292.  
  293. BUT$(10)="Upper Roof Point Brightness "
  294. BUT$(13)="Upper Floor Point Brightness"
  295. BUT$(16)="Lower Roof Point Brightness "
  296. BUT$(19)="Lower Floor Point Brightness"
  297.  
  298. BUT$(21)="Define Roof Graphic         "
  299. BUT$(22)="Define Wall Graphic         "
  300. BUT$(23)="Define Floor Graphic        "
  301. BUT$(24)="UPPER Roof Graphic          "
  302. BUT$(25)="UPPER Wall Graphic          "
  303. BUT$(26)="UPPER Floor Graphic         "
  304.  
  305. BUT$(2)="Add Object                  "
  306. BUT$(5)="Move Object                 "
  307. BUT$(8)="Delete Object               "
  308.  
  309. BUT$(11)="Set Player Start / End Zone "
  310. BUT$(14)="Define Door Zone            "
  311. BUT$(17)="Define Lift Zone            "
  312. BUT$(20)="Define Teleporter           "
  313.  
  314. BUT$(27)="Water Height                "
  315. BUT$(30)="Water Height Anim           "
  316.  
  317. BUT$(33)="Upper Wall Bright           "
  318. BUT$(34)="Lower Wall Bright           "
  319.  
  320. BUT$(28)="Add Control Point           "
  321. BUT$(31)="Link Control Points         "
  322. BUT$(29)="Link Zone to Cpt            "
  323. BUT$(32)="Link Upper Zone to Cpt      "
  324. BUT$(35)="Move Control Point          "
  325. BUT$(36)="Set Background SFX for zone:"
  326. BUT$(37)="Set Echo Level of zone      "
  327.  
  328. Screen Open 0,640,256,16,Hires
  329. Load Iff "ab3:graphics/editorbuttons"
  330. Pen 1 : Paper 0
  331. Screen Display 0,,42+200,,
  332. Screen Open 2,320,200,4,Lowres
  333. Curs Off : Cls 0
  334. Ink 2
  335. Draw 0,0 To 10,10
  336. Draw 1,0 To 11,10
  337. Draw 0,1 To 10,11
  338. Draw 0,0 To 5,0
  339. Draw 0,0 To 0,5
  340. Draw 0,1 To 5,1
  341. Draw 1,0 To 1,5
  342. Get Sprite 1,0,0 To 16,16
  343. Cls 0
  344. Draw 0,0 To 2,0
  345. Draw 0,0 To 0,2
  346. Draw 2,0 To 2,2
  347. Draw 2,2 To 0,2
  348. Get Bob 2,0,0 To 16,3
  349. Cls 0
  350. Ink 2
  351. Draw 0,0 To 4,0
  352. Draw 0,0 To 0,4
  353. Draw 0,4 To 4,4
  354. Draw 4,0 To 4,4
  355. Plot 2,2,1
  356. Get Sprite 3,0,0 To 16,5
  357. Cls 0
  358. Draw 0,0 To 6,0
  359. Draw 0,0 To 0,6
  360. Draw 0,6 To 6,6
  361. Draw 6,0 To 6,6
  362. Plot 3,3,1
  363. Get Sprite 4,0,0 To 16,7
  364. Cls 0
  365. Locate 0,0 : Print "B"
  366. Get Sprite 20,0,0 To 16,16
  367. Cls 0
  368. Locate 0,0 : Print "L+"
  369. Get Sprite 30,0,0 To 16,16
  370. Cls 0
  371. Locate 0,0 : Print "L-"
  372. Get Sprite 31,0,0 To 16,16
  373. Cls 0
  374. Draw 0,0 To 2,2
  375. Draw 6,0 To 4,2
  376. Draw 0,6 To 2,4
  377. Draw 6,6 To 4,4
  378. Get Sprite 21,0,0 To 16,16
  379. Screen Open 2,320,256,2,Lowres
  380. Curs Off : Flash Off : Cls 0
  381. For A=0 To 100 : Plot Rnd(15),Rnd(15),1 : Next 
  382. Get Sprite 5,0,0 To 16,16
  383. Screen Open 2,320,200,16,Lowres
  384. Curs Off : Cls 0
  385. Screen Display 2,,41,,
  386.  
  387. 'Menu$(1)="File "
  388. 'Menu$(1,1)="Load Game Link File"
  389. 'Menu$(1,2)=" "
  390. 'Menu$(1,3)="Load Level       ->"
  391. 'For A=1 To 16 
  392. '   Menu$(1,3,A)="  "+(Str$(A)-" ")+"  " 
  393. 'Next  
  394.  
  395.  
  396. Menu$(2)="Edit "
  397. Menu$(2,1)="Text Strings"
  398. Menu$(2,2)="Show  ->"
  399. Menu$(2,2,1)="No Control Point Links "
  400. Menu$(2,2,2)="Physical Links Only    "
  401. Menu$(2,2,3)="Visual Links Only      "
  402. Menu$(2,2,4)="All Control Point Links"
  403.  
  404. HILITE(0,0)=-1 : HILITE(0,1)=-1
  405. HILITE(1,0)=2 : HILITE(1,1)=-1
  406. HILITE(2,0)=5 : HILITE(2,1)=-1
  407. HILITE(3,0)=3 : HILITE(3,1)=4
  408. Screen Open 1,320,200,2,Lowres
  409. Screen Display 1,,41,,
  410. Curs Off : Cls 0
  411. Wait Vbl 
  412. Screen To Front 2
  413. Screen 2
  414. Colour 1,$333
  415. Colour 2,$FFF
  416. Colour 4,$888
  417. Colour 5,$FFF
  418. Colour 6,$CF
  419. Colour 7,$F00
  420. Colour 8,$F8F
  421. Flash 10,"(888,1)(000,1)"
  422. Flash 11,"(fff,1)(444,1)"
  423. Flash 12,"(0cf,1)(048,1)"
  424. Flash 13,"(f88,1)(600,1)"
  425. Flash 14,"(ff0,1)(440,1)"
  426. Flash 15,"(f0f,1)(404,1)"
  427. Colour 14,$F0F
  428. 'Dual Playfield 2,1
  429. Wait Vbl 
  430. SC=$FFFFFFF8
  431. Limit Mouse X Hard(2,0),Y Hard(2,0) To X Hard(2,320),Y Hard(2,256)
  432. XO=-(128*10) : YO=-(128*6)
  433. MU=4 : NZ=0 : CZ=0 : ZE=0 : PZ=-1
  434. OP=6 : SHINEBOX[OP,3]
  435. Hide On 
  436. '
  437. REDCPT=3
  438.  
  439. Global XO,YO,PX(),PY(),ZO(),ZP(),WT(),WLI(),ZLI(),LIFTC(),ZC(),NP,CP,NZ,CZ,ZE,MU,EBX,NCPT
  440. Global NO,OT,OB$(),OBX(),OBZ(),TXP,LG,ZFG(),ZRG(),ZWG(),ZD(),WD(),DC(),CPTX(),CPTY()
  441. Global CPTZ(),HILITE,HILITE(),SWWL(),SWP(),SWN,MP,MPX,DR$(),DL$(),LL$(),LR$(),DLT(),DRT(),LLT(),LRT()
  442. Global VECT$(),LSP(),WGW,SWITCHTYPE(),NWA,ZWA(),WATH(),WASP(),REDCPT,OPS(),LOPS()
  443. Global TXT,EZONE
  444. Show On 
  445. Hot Spot 3,2,2
  446. MPTR=1
  447. Screen Open 3,320,64,64,Lowres
  448. Curs Off : Flash Off : Cls 0
  449. Screen To Front 2
  450. '
  451. MOS=0 : Menu Off 
  452. Screen Copy 0,EBX*32,128,EBX*32+192,176 To 0,0,0 : SHINEBOX[OP,3]
  453. Repeat 
  454.    Screen 0 : Locate 70,0 : Print CZ;"  "
  455.    If Choice
  456.       HED=Choice(1)
  457.       If HED=1
  458.          'HILITE=Choice(2)-1
  459.          Gosub REDRAW
  460.       End If 
  461.       If HED=2
  462.          If Choice(2)=1
  463.             Gosub SETLEVELTEXT
  464.          End If 
  465.          If Choice(2)=2
  466.             REDCPT=Choice(3)-1 : Gosub REDRAW
  467.          End If 
  468.       End If 
  469.    End If 
  470.    A$=Inkey$
  471.    If A$="]" Then SC=SC*2
  472.    If A$="[" : 
  473.       SC=SC/2
  474.       If SC=0 : 
  475.          SC=-1
  476.       End If 
  477.    End If 
  478.    VT=MU*32
  479.    If A$="(" and EBX>0 Then Add EBX,-1 : Screen Copy 0,EBX*32,128,EBX*32+192,176 To 0,0,0 : SHINEBOX[OP,3]
  480.    If A$=")" and EBX<14 Then Add EBX,1 : Screen Copy 0,EBX*32,128,EBX*32+192,176 To 0,0,0 : SHINEBOX[OP,3]
  481.    If A$=Chr$(29) Then XO=XO-VT : Gosub REDRAW
  482.    If A$=Chr$(28) Then XO=XO+VT : Gosub REDRAW
  483.    If A$=Chr$(30) Then YO=YO-VT : Gosub REDRAW
  484.    If A$=Chr$(31) Then YO=YO+VT : Gosub REDRAW
  485.    
  486.    If A$="E"
  487.       For A=0 To NZ-1
  488.          ECHO(A)=0
  489.       Next 
  490.    End If 
  491.    If A$="B"
  492.       For A=0 To NZ-1
  493.          BSFX(A)=0
  494.       Next 
  495.    End If 
  496.  
  497.    If A$="I" Then Gosub PICSAVE
  498.  
  499.    If A$="D" Then Gosub SHODEF
  500.    If A$="P" Then Gosub SCRNSAVE
  501.    If A$="s" Then Screen Hide 3 : Gosub LEVELSAVE
  502.    If A$="l" Then Screen Hide 3 : Gosub LEVELLOAD
  503.    If A$="#" Then MU=MU*2 : VT=VT*2 : XO=(XO/VT)*VT : YO=(YO/VT)*VT : GRID : Gosub REDRAW
  504.    If A$=";" and MU>1 Then MU=MU/2 : VT=VT/2 : XO=(XO/VT)*VT : YO=(YO/VT)*VT : GRID : Gosub REDRAW
  505.    XM=X Mouse : YM=Y Mouse
  506.    X=X Screen(2,XM) : Y=Y Screen(2,YM)
  507.    If Y<200 and Y>8
  508.       If MOS=1
  509.          Menu Off 
  510.          MOS=0
  511.       End If 
  512.       If MPTR<>2
  513.          Change Mouse 2
  514.          MPTR=2
  515.       End If 
  516.       Gosub MAPEDIT
  517.    Else If Y>=200
  518.          If MPTR<>4
  519.             Change Mouse 4
  520.             MPTR=4
  521.          End If : Screen Hide 3
  522.          Gosub PICKBUTTON
  523.       Else 
  524.          If Y<8
  525.             If MOS=0
  526.                Menu On 
  527.                MOS=1
  528.             End If 
  529.             If MPTR<>1
  530.                Change Mouse 1
  531.                MPTR=1
  532.             End If 
  533.          End If 
  534.       End If 
  535.    End If 
  536. Until 0
  537. End 
  538. '
  539.  
  540. PICSAVE:
  541.  
  542. 'Screen Open 7,640,256,16,Hires
  543. 'Curs Off : Flash Off : Cls 0
  544. 'Get Palette 0 
  545. 'Screen Copy 0,0,0,640,48 To 7,0,(256-48)
  546. '
  547. 'Zoom 2,0,0,320,200 To 7,0,0,640,200 
  548. 'Wait Key  
  549. 'Screen Close 7
  550.  
  551. Screen 2
  552. F$=Fsel$("","","")
  553. Save Iff F$
  554.  
  555. Return 
  556.  
  557. SHODEF:
  558.  
  559. For A=0 To NZ-1
  560.    For B=0 To ZP(A)-1
  561.       ZZ(A,B)=-1
  562.    Next 
  563. Next 
  564.  
  565. If NZ>0
  566.    If NZ>1
  567.       For A=0 To NZ-2
  568.          For B=0 To ZP(A)-1
  569.             F=ZO(A,B) : S=ZO(A,B+1)
  570.             For C=A+1 To NZ-1
  571.                For D=0 To ZP(C)-1
  572.                   If ZO(C,D)=S and ZO(C,D+1)=F
  573.                      ZZ(A,B)=C : ZZ(C,D)=A
  574.                   End If 
  575.                Next 
  576.             Next 
  577.          Next 
  578.       Next 
  579.    End If 
  580.    For A=0 To NZ-1
  581.       For B=0 To ZP(A)-1
  582.          If ZWG(A,B,3)=64 and ZWG(A,B,0)=0 and ZWG(A,B,1)=0 and ZWG(A,B,2)=0
  583.             Z=ZZ(A,B)
  584.             If Z=-1
  585.                JOIN[ZO(A,B),ZO(A,B+1),10]
  586.             Else If ZH(A,0)>ZH(Z,0) or ZH(A,1)<ZH(Z,1)
  587.                JOIN[ZO(A,B),ZO(A,B+1),10]
  588.             End If 
  589.          End If 
  590.       Next 
  591.    Next 
  592. End If 
  593. Return 
  594.  
  595. SCRNSAVE:
  596.  
  597. Screen Open 7,640,512,4,Hires+Laced
  598.  
  599. Curs Off : Flash Off : Cls 0
  600. MIX=20000 : MIZ=20000
  601. MXX=-20000 : MXZ=-20000
  602. For A=0 To NP-1
  603.    MIX=Min(MIX,PX(A))
  604.    MIZ=Min(MIZ,PY(A))
  605.    MXX=Max(MXX,PX(A))
  606.    MXZ=Max(MXZ,PY(A))
  607. Next 
  608. SC=Max((MXX-MIX),((MXZ-MIZ)*320)/256)/2
  609.  
  610. End 
  611.  
  612. MMX=(MXX+MIX)/2
  613. MMZ=(MXZ+MIZ)/2
  614.  
  615. Colour 0,$FFF
  616. Colour 1,$888
  617. Colour 2,0
  618. For A=0 To NZ-1
  619.    For B=0 To ZP(A)-1
  620.       Ink 1
  621.       If WT(A,B)=1
  622.          Ink 2
  623.       End If 
  624.       X1=PX(ZO(A,B))
  625.       Y1=PY(ZO(A,B))
  626.       X2=PX(ZO(A,B+1))
  627.       Y2=PY(ZO(A,B+1))
  628.       X1=((X1-MMX)*256)/SC
  629.       Y1=((Y1-MMZ)*256)/SC
  630.       X2=((X2-MMX)*256)/SC
  631.       Y2=((Y2-MMZ)*256)/SC
  632.       Draw X1+320,Y1+256 To X2+320,Y2+256
  633.    Next 
  634. Next 
  635. Screen Open 6,640,32,2,Hires
  636. Input "LEVEL NUMBER (A-P) ";A$
  637. Screen 7
  638. Save Iff "work:temp/ABLEV"+A$+".iff"
  639. Screen Close 7
  640. Screen Close 6
  641. Return 
  642.  
  643.  
  644. SETLEVELTEXT:
  645.  
  646. Menu Off 
  647. Screen Open 5,640,256,4,Hires
  648. Flash Off : Cls 0
  649. Curs On 
  650. Colour 1,$FFF : Colour 2,$F00
  651.  
  652. M=0
  653.  
  654. Repeat 
  655.    Gosub LEVELTEXTSHOW
  656.    Repeat 
  657.       M=Mouse Click
  658.    Until M<>0
  659.    If M=1
  660.       Y=Y Screen(3,Y Mouse)/24
  661.       Locate 0,Y*3+1 : Print Space$(160)
  662.       Locate 0,Y*3+1
  663.       TXTGET[Y*3+1] : LEVELTEXT$(Y)=Param$
  664.       If Len(LEVELTEXT$(Y))<160
  665.          LEVELTEXT$(Y)=LEVELTEXT$(Y)+Space$(160-Len(LEVELTEXT$(Y)))
  666.       End If 
  667.    End If 
  668. Until M<>1
  669.  
  670. Screen Close 5
  671. Menu On 
  672. Return 
  673.  
  674. Procedure TXTGET[Y]
  675.    
  676.    P$=""
  677.    Repeat 
  678.       Repeat 
  679.          A$=Inkey$
  680.       Until A$<>""
  681.       If A$=Chr$(8)
  682.          If P$<>""
  683.             P$=Left$(P$,Len(P$)-1)
  684.          End If 
  685.       Else 
  686.          If A$<>Chr$(13)
  687.             P$=P$+A$
  688.          End If 
  689.       End If 
  690.       Locate 0,Y : Wait Vbl : Print P$;" "
  691.    Until A$=Chr$(13)
  692.    
  693. End Proc[P$]
  694.  
  695. LEVELTEXTSHOW:
  696. For A=0 To 9
  697.    Locate 0,A*3
  698.    Pen 1 : Paper 0
  699.    Print A;
  700.    Pen 2 : Paper 0
  701.    Print "----------------------------------------------------------------------------"
  702.    Pen 1 : Paper 0
  703.    Print LEVELTEXT$(A);
  704.    Locate 0,A*3+2
  705. Next 
  706. Return 
  707.  
  708. '
  709. Procedure LK[V]
  710.    Loke MP,V : Add MP,4
  711. End Proc
  712. Procedure DK[V]
  713.    Doke MP,V : Add MP,2
  714. End Proc
  715. Procedure PK[V]
  716.    Poke MP,V : Add MP,1
  717. End Proc
  718. '
  719. LEVELSAVE:
  720. Screen 0
  721. Ink 0 : Bar TXP*8,8*4 To 640,80
  722. Curs Off 
  723. Locate TXP,4 : Print "Enter file name to save level:"
  724. Locate TXP,5 : Input "Filename: ";F$
  725. Curs Off 
  726. Bar TXP*8,8*4 To 640,80
  727. Locate TXP,4 : Print "Calculating level data..."
  728. MP=Start(15)
  729. '
  730. '* START *********************************** 
  731.  
  732. For A=0 To 9
  733.    For B=1 To 160
  734.       PK[Asc(Mid$(LEVELTEXT$(A),B,1))]
  735.    Next 
  736. Next 
  737.  
  738. DK[PLX]
  739. DK[-PLY]
  740. DK[PLZ]
  741. DK[PLX2]
  742. DK[-PLY2]
  743. DK[PLZ2]
  744. 'MYPRINT[" "]
  745. 'MYPRINT["NumCPts: dc.w "+ Fn MY$(NCPT+1)] 
  746. DK[NCPT+1]
  747. DK[NP+16]
  748. DK[NZ-1]
  749. DK[0]
  750. DK[NO+62]
  751. '22
  752. BASE=MP
  753. LK[0] : LK[0] : LK[0] : LK[0] : LK[0] : LK[0] : LK[0] : LK[0]
  754. '54
  755. '* CONTROLPOINTS ***************************   
  756. 'MYPRINT["CPtPos:"]
  757. If NCPT>=0
  758.    For A=0 To NCPT
  759.       'MYPRINT[" dc.w "+ Fn MY$(CPTX(A))+","+ Fn MY$(-CPTY(A))]
  760.       DK[CPTX(A)]
  761.       DK[-CPTY(A)]
  762.       If CPTUL(A)=0
  763.          DK[(ZH(CPTZ(A),CPTUL(A))+ZH(CPTZ(A),1))/2]
  764.       Else 
  765.          DK[(UZH(CPTZ(A),CPTUL(A))+UZH(CPTZ(A),1))/2]
  766.       End If 
  767.       
  768.       DK[CPTUL(A)]
  769.    Next 
  770. End If 
  771. 'MYPRINT[" "]
  772. 'MYPRINT["NumObjectPoints:"] 
  773. 'MYPRINT[" dc.w "+ Fn MY$(NO+41)]
  774. 'MYPRINT["ObjectPoints:"]
  775. Loke BASE+20,MP-Start(15)
  776. If NO>0
  777.    For A=0 To NO-1
  778.       'MYPRINT[" dc.l "+ Fn MY$(OBX(A)*65536)+","+ Fn MY$(-OBZ(A)*65536)]
  779.       LK[OBX(A)*65536]
  780.       LK[-OBZ(A)*65536]
  781.    Next 
  782. End If 
  783. 'MYPRINT[" ds.l 62*2"] 
  784. For A=0 To 62
  785.    LK[0] : LK[0]
  786. Next 
  787. 'MYPRINT[" "]
  788. 'MYPRINT["ObjectData:"]
  789. Loke BASE+8,MP-Start(15)
  790. If NO>0
  791.    S=Start(12)
  792.    For A=0 To NO-1
  793.       'M$=" dc.w "+ Fn MY$(A)+",0,"
  794.       ST=MP
  795.       DK[A]
  796.       DK[0]
  797.       WATT=Peek(S+11) : If WATT<>0 : WATT=128 : End If 
  798.       If Peek(S)=0 : Gosub ALIENSAVE : End If 
  799.       If Peek(S)=1 : Gosub THINGSAVE : End If 
  800.       '      If Peek(S)=0 : Gosub ENEMYSAVE : End If 
  801.       '      If Peek(S)=1 : Gosub MEDISAVE : End If  
  802.       '      If Peek(S)=3 : Gosub BIGGUNSAVE : End If  
  803.       '      If Peek(S)=4 : Gosub KEYSAVE : End If 
  804.       '      If Peek(S)=5 : Gosub FLHASAVE : End If  
  805.       '      If Peek(S)=6 : Gosub MARINESAVE : End If  
  806.       '      If Peek(S)=7 : Gosub GLASSSAVE : End If 
  807.       '      If Peek(S)=2 : Gosub AMMOSAVE : End If  
  808.       '      If Peek(S)=8 : Gosub BBARRELSAVE : End If 
  809.       '      If Peek(S)=9 : Gosub DDECOSAVE : End If 
  810.       Add S,32
  811.    Next 
  812. End If 
  813. 'MYPRINT["PlayerShotData:"]
  814. Loke BASE+12,MP-Start(15)
  815. For A=NO To NO+19
  816.    '   MYPRINT[" dc.w "+ Fn MY$(A)+",-10,0"]
  817.    DK[A] : DK[-10] : DK[0]
  818.    '   MYPRINT[" dc.b 20,20"] 
  819.    PK[20] : PK[20]
  820.    '   MYPRINT[" dc.l 0"] 
  821.    LK[0]
  822.    '   MYPRINT[" dc.w -1"]
  823.    DK[-1]
  824.    '   MYPRINT[" dc.b 16,16,2,0"] 
  825.    PK[16] : PK[16] : PK[2] : PK[0]
  826.    '   MYPRINT[" dc.w 0,0,0,0,0,0,0"] 
  827.    '   MYPRINT[" ds.w 16"]
  828.    For QQ=1 To 23 : DK[0] : Next 
  829. Next 
  830. Loke BASE+16,MP-Start(15)
  831. 'MYPRINT["NastyShotData:"] 
  832. For A=NO+20 To NO+39
  833.    '   MYPRINT[" dc.w "+ Fn MY$(A)+",-10,0"]
  834.    DK[A] : DK[-10] : DK[0]
  835.    '   MYPRINT[" dc.b 20,20"] 
  836.    PK[20] : PK[20]
  837.    '   MYPRINT[" dc.l 0"] 
  838.    LK[0]
  839.    '   MYPRINT[" dc.w -1"]
  840.    DK[-1]
  841.    '   MYPRINT[" dc.b 16,16,2,0"] 
  842.    PK[16] : PK[16] : PK[2] : PK[0]
  843.    '   MYPRINT[" dc.w 0,0,0,0,0,0,0"] 
  844.    '   MYPRINT[" ds.w 16"]
  845.    For QQ=1 To 23 : DK[0] : Next 
  846. Next 
  847. ' Other nasty data.... 
  848. For A=NO+40 To NO+59
  849.    '   MYPRINT[" dc.w "+ Fn MY$(A)+",-10,0"]
  850.    DK[A] : DK[-10] : DK[0]
  851.    '   MYPRINT[" dc.b 20,20"] 
  852.    PK[20] : PK[20]
  853.    '   MYPRINT[" dc.l 0"] 
  854.    LK[0]
  855.    '   MYPRINT[" dc.w -1"]
  856.    DK[-1]
  857.    '   MYPRINT[" dc.b 16,16,2,0"] 
  858.    PK[16] : PK[16] : PK[2] : PK[0]
  859.    '   MYPRINT[" dc.w 0,0,0,0,0,0,0"] 
  860.    '   MYPRINT[" ds.w 16"]
  861.    For QQ=1 To 23 : DK[0] : Next 
  862. Next 
  863.  
  864. '
  865. 'MYPRINT["PLR1_Obj:"]
  866. Loke BASE+24,MP-Start(15)
  867. DK[NO+60] : DK[0] : DK[0]
  868. PK[64] : PK[64]
  869. LK[0]
  870. DK[-1]
  871. PK[32] : PK[32]
  872. PK[-1] : PK[-1]
  873. For QQ=1 To 7 : DK[0] : Next 
  874. DK[10]
  875. For QQ=1 To 15 : DK[0] : Next 
  876.  
  877. Loke BASE+28,MP-Start(15)
  878. DK[NO+61] : DK[0] : DK[0]
  879. PK[64] : PK[64]
  880. LK[0]
  881. DK[-1]
  882. PK[32] : PK[32]
  883. PK[-1] : PK[-1]
  884. FLH=0 : RFH=-100
  885. For QQ=1 To 23 : DK[0] : Next 
  886. '
  887.  
  888. DK[NO+62] : DK[0] : DK[0]
  889. PK[64] : PK[32]
  890. LK[9*65536]
  891. DK[-1]
  892. PK[32] : PK[16]
  893. PK[-1] : PK[-1]
  894. For QQ=1 To 23 : DK[0] : Next 
  895.  
  896. 'MYPRINT[" dc.w -1"] 
  897. DK[-1]
  898. 'MYPRINT["Points:"]
  899. Loke BASE,MP-Start(15)
  900. For S=0 To 7
  901.    If SWWL(S,0)>-1 and SWWL(S,1)>-1
  902.       A=SWWL(S,0) : B=SWWL(S,1)
  903.       LX=PX(ZO(A,B)) : LY=PY(ZO(A,B))
  904.       RX=PX(ZO(A,B+1)) : RY=PY(ZO(A,B+1))
  905.       MX=(LX+RX)/2 : MY=(LY+RY)/2
  906.       RX=RX-LX : RY=RY-LY
  907.       L=Sqr(RX^2+RY^2)
  908.       LX=MX-(32*RX)/L : LY=MY-(32*RY)/L
  909.       RX=MX+(32*RX)/L : RY=MY+(32*RY)/L
  910.       PX(NP+S+S+1)=LX : PY(NP+S+S+1)=LY
  911.       PX(NP+S+S+2)=RX : PY(NP+S+S+2)=RY
  912.    End If 
  913. Next 
  914. If NP=-1 Then Goto 11
  915. For A=0 To NP+16
  916.    '   MYPRINT[" dc.w "+ Fn MY$(PX(A))+","+ Fn MY$(-PY(A))] 
  917.    DK[PX(A)] : DK[-PY(A)]
  918. Next 
  919. For A=0 To NZ-1
  920.    For B=0 To 9
  921.       For C=0 To 3
  922.          DK[ZPBR(A,B,C)]
  923.       Next 
  924.    Next 
  925. Next 
  926. SPLIB=MP
  927. For A=0 To NZ-1
  928.    For B=0 To ZP(A)-1
  929.       DK[ZO(A,B)]
  930.    Next 
  931.    If ZP(A)<10
  932.       For B=ZP(A) To 9
  933.          DK[-1]
  934.       Next 
  935.       
  936.    End If 
  937. Next 
  938.  
  939. 11
  940. 'MYPRINT[" "]
  941. 'MYPRINT["Walls:"] 
  942. 'If NZ=-1 Then Goto 22 
  943. 'T=0 
  944. 'For A=0 To NZ 
  945. '   If ZP(A)>0 
  946. '      For B=0 To ZP(A)-1
  947. '         If SWT(WT(A,B))=1
  948. '            LL=B-1 : If LL<0 : LL=ZP(A)-1 : End If  
  949. '            NL=B+1 : If LL>ZP(A)-1 : NL=0 : End If  
  950. '            X1=PX(ZO(A,B)) : Y1=-PY(ZO(A,B))
  951. '            X2=PX(ZO(A,B+1)) : Y2=-PY(ZO(A,B+1))
  952. '            X2=X2-X1 : Y2=Y2-Y1 
  953. '            L=Sqr(X2*X2+Y2*Y2)
  954. '            X1=X1+(Y2*32)/L 
  955. '            Y1=Y1-(X2*32)/L : XD=X2 : YD=Y2 
  956. '            X1=X1-(X2*2)/L
  957. '            Y1=Y1-(Y2*2)/L
  958. '            X2=X2+2*(X2*2)/L
  959. '            Y2=Y2+2*(Y2*2)/L
  960. '            MYPRINT[" dc.w "+ Fn MY$(X1)+","+ Fn MY$(Y1)+","+ Fn MY$(X2)+","+ Fn MY$(Y2)] 
  961. '            MYPRINT[" dc.w "+ Fn MY$(L)+",0,0,0"] 
  962. '            ZW(A,B,0)=T : Add T,1 
  963. '         End If 
  964. '      Next  
  965. '   End If 
  966. 'Next  
  967. 22
  968. 'MYPRINT[" "]
  969. 'MYPRINT["FloorLines:"]
  970.  
  971. DK[EZONE]
  972.  
  973. Loke BASE+4,MP-Start(15)
  974. If NZ=-1 Then Goto 13
  975. T=0
  976. For A=0 To NZ
  977.    If ZP(A)>0
  978.       For B=0 To ZP(A)-1
  979.          If ZO(A,B)>ZO(A,B+1)
  980.             X1=PX(ZO(A,B)) : Y1=-PY(ZO(A,B))
  981.             X2=PX(ZO(A,B+1)) : Y2=-PY(ZO(A,B+1))
  982.             DK[X1] : DK[Y1] : DK[X2-X1] : DK[Y2-Y1]
  983.             
  984.             X2#=X2-X1 : Y2#=Y2-Y1
  985.             L#=Sqr(X2#*X2#+Y2#*Y2#)
  986.             L=L#
  987.             XA#=(X2#*20.0)/L#
  988.             YA#=(Y2#*20.0)/L#
  989.             XA=YA#-XA#
  990.             YA=-(XA#+YA#)
  991.             'JOINCOORDS[X1+XA,-(Y1+YA),X2-YA,-(Y2+XA),3] 
  992.             '            JOINCOORDS[X1,-Y1,X2,-Y2,3] 
  993.             '            Wait Key  
  994.             
  995.          Else 
  996.             X1=PX(ZO(A,B+1)) : Y1=-PY(ZO(A,B+1))
  997.             X2=PX(ZO(A,B)) : Y2=-PY(ZO(A,B))
  998.             
  999.             X2#=X2-X1 : Y2#=Y2-Y1
  1000.             L#=Sqr(X2#*X2#+Y2#*Y2#)
  1001.             L=L#
  1002.             XA#=(X2#*20.0)/L#
  1003.             YA#=(Y2#*20.0)/L#
  1004.             XA=-(YA#-XA#)
  1005.             YA=(XA#+YA#)
  1006.             
  1007.             'JOINCOORDS[X2+XA,-(Y2+YA),X1-YA,-(Y1+XA),3] 
  1008.             'JOINCOORDS[X2,-Y2,X1,-Y1,3] 
  1009.             'Wait Key  
  1010.             DK[X2] : DK[Y2] : DK[X1-X2] : DK[Y1-Y2]
  1011.          End If 
  1012.          If BWT(WT(A,B))=1
  1013.             For C=0 To NZ
  1014.                For D=0 To ZP(C)-1
  1015.                   If ZO(A,B)=ZO(C,D+1) and ZO(A,B+1)=ZO(C,D)
  1016.                      'MYPRINT[" dc.l ZoneDat"+ Fn MY$(C)+",ZoneDat"+ Fn MY$(A)] 
  1017.                      ZZ(A,B)=C
  1018.                      D=ZP(C) : C=NZ
  1019.                   End If 
  1020.                Next 
  1021.             Next 
  1022.             If WT(A,B)<>3 and WT(A,B)<>4
  1023.                H1=ZH(ZZ(A,B),0)
  1024.                H2=ZH(ZZ(A,B),1)
  1025.                DK[ZZ(A,B)]
  1026.             Else 
  1027.                H1=900 : H2=900
  1028.                DK[-1]
  1029.             End If 
  1030.             'MYPRINT[" dc.l "+ Fn MY$(H1*256)+","+ Fn MY$(H2*256)] 
  1031.          Else 
  1032.             DK[-1]
  1033.             'MYPRINT[" dc.l 0,0"]
  1034.             'MYPRINT[" dc.l 900*256,900*256"]
  1035.          End If 
  1036.          'MYPRINT[" dc.w "+ Fn MY$(L)+","+ Fn MY$(XA)+","+ Fn MY$(YA)+",0"] 
  1037.          DK[L] : PK[XA] : PK[YA] : DK[0]
  1038.          ZW(A,B,0)=T : ZW(A,B,1)=T : Add T,1
  1039.       Next 
  1040.    End If 
  1041. Next 
  1042. 'MYPRINT[" "]
  1043. 13
  1044. T=0
  1045. For A=0 To NP : PW(A)=-1 : Next 
  1046. For A=0 To NZ-1
  1047.    For B=0 To ZP(A)-1
  1048.       If WT(A,B)=1
  1049.          PW(ZO(A,B))=T
  1050.          PCW(ZO(A,B),1)=ZO(A,B+1)
  1051.          PCW(ZO(A,B+1),0)=ZO(A,B)
  1052.       End If 
  1053.       Add T,1
  1054.    Next 
  1055. Next 
  1056. DK[NZ]
  1057.  
  1058. For A=0 To NZ-1
  1059.    BT=0 : UT=0
  1060.    For B=0 To ZP(A)-1
  1061.       For C=0 To 1
  1062.          PB=ZPBR(A,B,C) and $FF
  1063.          If PB>127 Then PB=PB-256
  1064.          BT=BT+PB
  1065.       Next 
  1066.       For C=0 To 1
  1067.          PB=ZPBR(A,B,C+2) and $FF
  1068.          If PB>127 Then PB=PB-256
  1069.          UT=UT+PB
  1070.       Next 
  1071.    Next 
  1072.    BT=BT/(ZP(A)*2)
  1073.    UT=UT/(ZP(A)*2)
  1074.    ZB(A)=BT : UZB(A)=UT
  1075. Next 
  1076.  
  1077. For A=0 To NZ-1
  1078.    If ZP(A)>0
  1079.       'MYPRINT["ZoneBorders"+ Fn MY$(A)+":"] 
  1080.       'M$="" 
  1081.       'B$="" 
  1082.       ZBPT=MP
  1083.       For B=0 To ZP(A)-1
  1084.          'M$=M$+ Fn MY$(ZW(A,B,1))+","
  1085.          DK[ZW(A,B,1)]
  1086.       Next 
  1087.       'MYPRINT[" dc.w "+M$+"-1"] 
  1088.       DK[-1]
  1089.       '
  1090.       L=ZP(A)-1
  1091.       For B=0 To ZP(A)-1
  1092.          If PW(ZO(A,B))<>-1
  1093.             If ZO(A,L)<>PCW(ZO(A,B),0)
  1094.                DK[PW(PCW(ZO(A,B),0))]
  1095.             End If 
  1096.             If ZO(A,B+1)<>PCW(ZO(A,B),1)
  1097.                DK[PW(ZO(A,B))]
  1098.             End If 
  1099.          End If 
  1100.          L=(L+1) mod ZP(A)
  1101.       Next 
  1102.       DK[-2]
  1103.       'MYPRINT["ZoneDat"+ Fn MY$(A)+":"] 
  1104.       'MYPRINT[" dc.w "+ Fn MY$(A)]
  1105.       ZDPT(A)=MP
  1106.       DK[A]
  1107.       '2 
  1108.       'If ZLI(A)>0 
  1109.       '   MYPRINT["ZoneFloor"+ Fn MY$(A)+":"]
  1110.       'End If  
  1111.       'MYPRINT[" dc.l "+ Fn MY$(ZH(A,0)*256)]
  1112.       LK[ZH(A,0)*256]
  1113.       '6 
  1114.       'If ZD(A)>0
  1115.       '   MYPRINT["ZoneRoof"+ Fn MY$(A)+":"] 
  1116.       'End If
  1117.       'MYPRINT[" dc.l "+ Fn MY$(ZH(A,1)*256)]
  1118.       LK[ZH(A,1)*256]
  1119.       '10
  1120.       LK[UZH(A,0)*256]
  1121.       '14
  1122.       LK[UZH(A,1)*256]
  1123.       '18
  1124.       LK[ZH(A,2)*256]
  1125.       '22
  1126.       'MYPRINT[" dc.w "+ Fn MY$(ZB(A))]
  1127.       DK[ZB(A)]
  1128.       '24
  1129.       DK[UZB(A)]
  1130.       '26
  1131.       'MYPRINT[" dc.w "+ Fn MY$(ZCPT(A))]
  1132.       PK[ZCPT(A)] : PK[UZCPT(A)]
  1133.       '28
  1134.       'MYPRINT[" dc.l 0"]
  1135.       LK[BSFX(A)]
  1136.       '32
  1137.       'MYPRINT[" dc.l ZoneBorders"+ Fn MY$(A)] 
  1138.       DK[ZBPT-ZDPT(A)]
  1139.       '34
  1140.       'MYPRINT[" dc.l ZPTS"+ Fn MY$(A)]
  1141.       ZPPT=MP
  1142.       DK[0]
  1143.       '36
  1144.       S=Start(14)+(A*64*6)
  1145.       BACK=0
  1146.       For QQ=0 To NZ : ZU(QQ)=0 : Next 
  1147.       For B=0 To 63
  1148.          C=Deek(S)
  1149.          If C<>65535
  1150.             ZU(C)=1
  1151.             If ZRG(C,0)=16
  1152.                BACK=1
  1153.             End If 
  1154.          End If 
  1155.          Add S,6
  1156.       Next 
  1157.       ZU(A)=1
  1158.       If BACK=1 or ZRG(A,0)=16
  1159.          'MYPRINT[" dc.l BackGraph"]
  1160.          PK[-1]
  1161.          'MYPRINT[" dc.l NullClip,0"] 
  1162.       Else 
  1163.          PK[0]
  1164.       End If 
  1165.       
  1166.       PK[ECHO(A)]
  1167.       
  1168.       '38
  1169.       
  1170.       DK[TELZO(A)] : DK[TELX(A)] : DK[-TELZ(A)]
  1171.       '44
  1172.       DK[ZFG(A,0)] : DK[UZFG(A,0)]
  1173.       '48
  1174.       
  1175.       S=Start(14)+(A*64*6)
  1176.       For B=0 To NP+16 : PU(B)=0 : Next 
  1177.       For K=0 To ZP(A)-1
  1178.          PU(ZO(A,K))=1
  1179.       Next 
  1180.       For K=0 To 7
  1181.          If SWWL(K,0)=A
  1182.             PU(NP+K+K+1)=1
  1183.             PU(NP+K+K+2)=1
  1184.          End If 
  1185.       Next 
  1186.       VAT=0
  1187.       'MYPRINT[" dc.l ZoneGraph"+ Fn MY$(A)] 
  1188.       DK[A]
  1189.       '      MYPRINT[" dc.l NullClip"] 
  1190.       DK[-1]
  1191.       CORD=0
  1192.       BTS=0
  1193.       For QQ=0 To ZP(A)-1
  1194.          If WT(A,QQ)<>1
  1195.             Bset BTS,CORD
  1196.             Bset BTS+1,CORD
  1197.             Bset BTS+2,CORD
  1198.             Add BTS,3
  1199.          End If 
  1200.       Next 
  1201.       'MYPRINT[" dc.l "+Bin$(CORD)]
  1202.       LK[CORD]
  1203.       For B=0 To 63
  1204.          If Deek(S)<>65535
  1205.             L=Deek(S)
  1206.             CORD=Leek(S+2)
  1207.             BTS=0
  1208.             For K=0 To ZP(L)-1
  1209.                PU(ZO(L,K))=1
  1210.                If WT(L,K)<>1
  1211.                   If ZU(ZZ(L,K))=1
  1212.                      Bset BTS,CORD
  1213.                   End If 
  1214.                End If 
  1215.                Add BTS,3
  1216.             Next 
  1217.             For K=0 To 7
  1218.                If SWWL(K,0)=L
  1219.                   PU(NP+K+K+1)=1
  1220.                   PU(NP+K+K+2)=1
  1221.                End If 
  1222.             Next 
  1223.             'MYPRINT[" dc.l ZoneGraph"+ Fn MY$(Deek(S))] 
  1224.             DK[Deek(S)]
  1225.             'MYPRINT[" dc.l ZoneClip"+ Fn MY$(A)+"to"+ Fn MY$(VAT)]
  1226.             DK[0]
  1227.             'MYPRINT[" dc.l "+Bin$(CORD)]
  1228.             LK[CORD]
  1229.             Add VAT,1
  1230.             '            B$=" dc.w " 
  1231.             '            If Deek(S+2)<>65535 
  1232.             '               B$=B$+ Fn MY$(Deek(S+2))+"," 
  1233.             '            Else  
  1234.             '               B$=B$+"-1,"
  1235.             '            End If  
  1236.             '            If Deek(S+4)<>65535 
  1237.             '               B$=B$+ Fn MY$(Deek(S+4))+"," 
  1238.             '            Else  
  1239.             '               B$=B$+"-1,"
  1240.             '            End If  
  1241.             '            If Deek(S+6)<>65535 
  1242.             '               B$=B$+ Fn MY$(Deek(S+6)) 
  1243.             '            Else  
  1244.             '               B$=B$+"-1" 
  1245.             '            End If  
  1246.             '            MYPRINT[B$] 
  1247.          End If 
  1248.          Add S,6
  1249.       Next 
  1250.       'MYPRINT[" dc.l -1"] 
  1251.       LK[-1]
  1252.       'MYPRINT[" "]
  1253.       'MYPRINT["ZPTS"+ Fn MY$(A)+":"]
  1254.       TMPT=MP
  1255.       Doke ZPPT,TMPT-ZDPT(A)
  1256.       T=0
  1257.       M$=""
  1258.       For B=0 To NP+16
  1259.          If PU(B)=1
  1260.             'If T mod 10=9 
  1261.             '   M$=M$+ Fn MY$(B) : MYPRINT[" dc.w "+M$] : M$=""
  1262.             'Else  
  1263.             '   M$=M$+ Fn MY$(B)+"," 
  1264.             'End If  
  1265.             'Add T,1 
  1266.             DK[B]
  1267.          End If 
  1268.       Next 
  1269.       DK[-1]
  1270.       'If M$=""
  1271.       '   MYPRINT[" dc.w -1"]
  1272.       'Else  
  1273.       '   MYPRINT[" dc.w "+M$+"-1"]
  1274.       'End If  
  1275.    End If 
  1276. Next 
  1277. 12
  1278. 'If NP>-1
  1279. '   MYPRINT["AllPoints:"]
  1280. '   M$=""
  1281. '   For A=0 To NP+16 
  1282. '      If A mod 10=9 
  1283. '         M$=M$+ Fn MY$(A) : MYPRINT[" dc.w "+M$] : M$=""
  1284. '      Else  
  1285. '         M$=M$+ Fn MY$(A)+"," 
  1286. '      End If  
  1287. '   Next 
  1288. '   If NP mod 10<>9
  1289. '      M$=Left$(M$,Len(M$)-1)
  1290. '      MYPRINT[" dc.w "+M$]
  1291. '   End If 
  1292. '   MYPRINT[" dc.w -1"]
  1293. 'End If  
  1294. '
  1295.  
  1296.  
  1297. Bsave "ab3:levels/level_"+F$+"/twolev.bin",Start(15) To MP
  1298. Bar TXP*8,8*4 To 640,80
  1299. Locate TXP,4 : Print "Calculating graphics file..."
  1300. '
  1301. MP=Start(15)
  1302. ' Pointer to door/Lift/switch/Graphiclist data 
  1303. LK[0] : LK[0] : LK[0] : LK[0]
  1304. If NZ>0
  1305.    'MYPRINT["ZoneAdds:"]
  1306.    For A=0 To NZ-1
  1307.       'MYPRINT[" dc.l ZoneDat"+ Fn MY$(A)] 
  1308.       LK[ZDPT(A)-Start(15)]
  1309.    Next 
  1310.    Loke Start(15)+12,MP-Start(15)
  1311.    'MYPRINT["ZoneGraphAdds:"] 
  1312.    ZGAPT=MP
  1313.    For A=0 To NZ-1
  1314.       'MYPRINT[" dc.l ZoneGraph"+ Fn MY$(A)] 
  1315.       LK[0] : LK[0]
  1316.    Next 
  1317.    For A=0 To NZ-1
  1318.       'MYPRINT["ZoneGraph"+ Fn MY$(A)+": dc.w "+ Fn MY$(A)]
  1319.       B=MP-Start(15)
  1320.       Loke ZGAPT+(A*8),B
  1321.       DK[A]
  1322.       If ZP(A)>0
  1323.          For B=0 To ZP(A)-1
  1324.             X1=PX(ZO(A,B)) : Y1=PY(ZO(A,B))
  1325.             X2=PX(ZO(A,B+1)) : Y2=PY(ZO(A,B+1))
  1326.             L=Sqr((X2-X1)^2+(Y2-Y1)^2)
  1327.             L=L/2
  1328.             GW=ZWG(A,B,3)
  1329.             If ZWG(A,B,1)=1
  1330.                L=(L and(-GW))
  1331.                L=L+GW
  1332.             End If 
  1333.             If ZWG(A,B,1)=2
  1334.                L=(L and(-GW))
  1335.                If L=0
  1336.                   L=L+GW
  1337.                End If 
  1338.             End If 
  1339.             'W$=" dc.l "+ Fn MY$(ZWG(A,B,0))+"*4096" 
  1340.             W=ZWG(A,B,0)*65536 : CH=WCY(ZWG(A,B,2))-1 : CSV=WCSV(ZWG(A,B,2))
  1341.             GW=GW-1
  1342.             NB=(B+1) mod ZP(A)
  1343.             If WT(A,B)=0
  1344.                H2=ZH(A,0) : H1=ZH(A,1)
  1345.                OH1=UZH(ZZ(A,B),1)
  1346.                OH2=UZH(ZZ(A,B),0)
  1347.                OH3=ZH(ZZ(A,B),1)
  1348.                OH4=ZH(ZZ(A,B),0)
  1349.                If OH1>OH3
  1350.                   OH1=-5000 : OH2=-5000
  1351.                End If 
  1352.                If H1<OH1
  1353.                   'If H2<OH1 
  1354.                   BBV=0+0
  1355.                   'Else  
  1356.                   '   BBV=8+3
  1357.                   'End If  
  1358.                   VO=-Min(OH1,H2) and 255
  1359.                   'MYPRINT[" dc.w wall,"+ Fn MY$(ZO(A,B))+","+ Fn MY$(ZO(A,B+1))+",0,"+ Fn MY$(L)] 
  1360.                   PK[-1] : PK[0] : DK[ZO(A,B)] : DK[ZO(A,B+1)] : PK[B] : PK[NB] : DK[L]
  1361.                   'MYPRINT[W$] 
  1362.                   LK[W+VO]
  1363.                   'MYPRINT[" dc.w 0,0,0"]
  1364.                   DK[ZWG(A,B,2)] : PK[CH] : PK[CSV] : PK[GW] : PK[TBV*16+BBV]
  1365.                   'MYPRINT[" dc.l "+ Fn MY$(H2)+"*256,"+ Fn MY$(H1)+"*256"]
  1366.                   LK[H1*256] : LK[Min(OH1,H2)*256]
  1367.                   PK[WB(A,B)] : PK[ZZ(A,B)]
  1368.                   'MYPRINT[" "]
  1369.                End If 
  1370.                If H1<OH3 and H2>OH2
  1371.                   'If H2<OH3 
  1372.                   BBV=0+0
  1373.                   'Else  
  1374.                   '   BBV=8+1
  1375.                   'End If  
  1376.                   'If H1>OH2 
  1377.                   TBV=0+1
  1378.                   'Else  
  1379.                   '   TBV=8+2
  1380.                   'End If  
  1381.                   VO=-Min(OH3,H2) and 255
  1382.                   'MYPRINT[" dc.w wall,"+ Fn MY$(ZO(A,B))+","+ Fn MY$(ZO(A,B+1))+",0,"+ Fn MY$(L)] 
  1383.                   PK[-1] : PK[0] : DK[ZO(A,B)] : DK[ZO(A,B+1)] : PK[B] : PK[NB] : DK[L]
  1384.                   'MYPRINT[W$] 
  1385.                   LK[W+VO]
  1386.                   'MYPRINT[" dc.w 0,0,0"]
  1387.                   DK[ZWG(A,B,2)] : PK[CH] : PK[CSV] : PK[GW] : PK[TBV*16+BBV]
  1388.                   'MYPRINT[" dc.l "+ Fn MY$(H1)+"*256,"+ Fn MY$(H2)+"*256"]
  1389.                   LK[Max(OH2,H1)*256] : LK[Min(H2,OH3)*256]
  1390.                   PK[WB(A,B)] : PK[ZZ(A,B)]
  1391.                   'MYPRINT[" "]
  1392.                End If 
  1393.                If H2>OH4
  1394.                   'If H1>OH4 
  1395.                   TBV=1
  1396.                   'Else  
  1397.                   '   TBV=8+0
  1398.                   'End If  
  1399.                   BBV=0+0
  1400.                   VO=(-H2) and 255
  1401.                   'MYPRINT[" dc.w wall,"+ Fn MY$(ZO(A,B))+","+ Fn MY$(ZO(A,B+1))+",0,"+ Fn MY$(L)] 
  1402.                   PK[B+16] : PK[0] : DK[ZO(A,B)] : DK[ZO(A,B+1)] : PK[B] : PK[NB] : DK[L]
  1403.                   'MYPRINT[W$] 
  1404.                   LK[W+VO]
  1405.                   'MYPRINT[" dc.w 0,0,0"]
  1406.                   DK[ZWG(A,B,2)] : PK[CH] : PK[CSV] : PK[GW] : PK[TBV*16+BBV]
  1407.                   'MYPRINT[" dc.l "+ Fn MY$(H1)+"*256,"+ Fn MY$(H2)+"*256"]
  1408.                   LK[Max(OH4,H1)*256] : LK[H2*256]
  1409.                   PK[WB(A,B)] : PK[ZZ(A,B)]
  1410.                   'MYPRINT[" "]
  1411.                End If 
  1412.                For S=0 To 7
  1413.                   If SWWL(S,0)=A and SWWL(S,1)=B
  1414.                      'MYPRINT[" dc.w wall,"+ Fn MY$(NP+S+S+1)+","+ Fn MY$(NP+S+S+2)+",0,31"]
  1415.                      DK[0] : DK[NP+S+S+1] : DK[NP+S+S+2] : DK[0] : DK[31]
  1416.                      SGO(S)=MP-Start(15)
  1417.                      'MYPRINT["SWITCHGRAPH"+ Fn MY$(S)+":"] 
  1418.                      SW=(-ZH(A,0)) and 31
  1419.                      'MYPRINT[" dc.l 13*4096+"+ Fn MY$(SW)] 
  1420.                      LK[SW]
  1421.                      'MYPRINT[" dc.w 0,0,0"]
  1422.                      DK[11] : PK[31] : PK[5] : DK[31]
  1423.                      'MYPRINT[" dc.l "+ Fn MY$(ZH(A,0)-64)+"*256,"+ Fn MY$(ZH(A,0)-32)+"*256"]
  1424.                      LK[(ZH(A,0)-64)*256] : LK[(ZH(A,0)-32)*256]
  1425.                      PK[WB(A,B)] : PK[ZZ(A,B)]
  1426.                      'MYPRINT[" "]
  1427.                   End If 
  1428.                Next 
  1429.                
  1430.             End If 
  1431.             If WT(A,B)=1
  1432.                TBV=1 : BBV=0
  1433.                VO=(-ZH(A,0)) and 255
  1434.                'MYPRINT[" dc.w wall,"+ Fn MY$(ZO(A,B))+","+ Fn MY$(ZO(A,B+1))+",0,"+ Fn MY$(L)] 
  1435.                PK[B] : PK[0] : DK[ZO(A,B)] : DK[ZO(A,B+1)] : PK[B] : PK[NB] : DK[L]
  1436.                'MYPRINT[W$] 
  1437.                LK[W+VO]
  1438.                'MYPRINT[" dc.w 0,0,0"]
  1439.                DK[ZWG(A,B,2)] : PK[CH] : PK[CSV] : PK[GW] : PK[TBV*16+BBV]
  1440.                'MYPRINT[" dc.l "+ Fn MY$(ZH(A,1))+"*256,"+ Fn MY$(ZH(A,0))+"*256"]
  1441.                LK[ZH(A,1)*256] : LK[ZH(A,0)*256]
  1442.                PK[WB(A,B)] : PK[ZZ(A,B)]
  1443.                'MYPRINT[" "]
  1444.                For S=0 To 7
  1445.                   If SWWL(S,0)=A and SWWL(S,1)=B
  1446.                      'MYPRINT[" dc.w wall,"+ Fn MY$(NP+S+S+1)+","+ Fn MY$(NP+S+S+2)+",0,31"]
  1447.                      DK[0] : DK[NP+S+S+1] : DK[NP+S+S+2] : DK[0] : DK[31]
  1448.                      SGO(S)=MP-Start(15)
  1449.                      'MYPRINT["SWITCHGRAPH"+ Fn MY$(S)+":"] 
  1450.                      SW=(-ZH(A,0)) and 31
  1451.                      'MYPRINT[" dc.l 13*4096+"+ Fn MY$(SW)] 
  1452.                      LK[SW]
  1453.                      'MYPRINT[" dc.w 0,0,0"]
  1454.                      DK[11] : PK[31] : PK[5] : DK[31]
  1455.                      'MYPRINT[" dc.l "+ Fn MY$(ZH(A,0)-64)+"*256,"+ Fn MY$(ZH(A,0)-32)+"*256"]
  1456.                      LK[(ZH(A,0)-64)*256] : LK[(ZH(A,0)-32)*256]
  1457.                      DK[WB(A,B)]
  1458.                      'MYPRINT[" "]
  1459.                   End If 
  1460.                Next 
  1461.             End If 
  1462.             If WT(A,B)=3
  1463.                VO=(-ZH(A,0)) and 255
  1464.                'MYPRINT[" dc.w seethruwall,"+ Fn MY$(ZO(A,B))+","+ Fn MY$(ZO(A,B+1))+",0,"+ Fn MY$(L)]
  1465.                DK[13] : DK[ZO(A,B)] : DK[ZO(A,B+1)] : PK[B] : PK[NB] : DK[L]
  1466.                'MYPRINT[W$] 
  1467.                LK[W+VO]
  1468.                'MYPRINT[" dc.w 0,0,0"]
  1469.                DK[ZWG(A,B,2)] : PK[CH] : PK[CSV] : PK[GW] : PK[TBV*16+BBV]
  1470.                'MYPRINT[" dc.l "+ Fn MY$(ZH(A,1))+"*256,"+ Fn MY$(ZH(A,0))+"*256"]
  1471.                LK[ZH(A,1)*256] : LK[ZH(A,0)*256]
  1472.                PK[WB(A,B)] : PK[ZZ(A,B)]
  1473.                'MYPRINT[" "]
  1474.             End If 
  1475.             If WT(A,B)=4
  1476.                VO=(-ZH(A,0)) and 255
  1477.                'MYPRINT[" dc.w seethruwall,"+ Fn MY$(ZO(A,B))+","+ Fn MY$(ZO(A,B+1))+","+ Fn MY$(-L)+",0"]
  1478.                DK[13] : DK[ZO(A,B)] : DK[ZO(A,B+1)] : PK[B] : PK[NB] : DK[L]
  1479.                'MYPRINT[W$] 
  1480.                LK[W+VO]
  1481.                'MYPRINT[" dc.w 0,0,0"]
  1482.                DK[ZWG(A,B,2)] : PK[CH] : PK[CSV] : PK[GW] : PK[TBV*16+BBV]
  1483.                'MYPRINT[" dc.l "+ Fn MY$(ZH(A,1))+"*256,"+ Fn MY$(ZH(A,0))+"*256"]
  1484.                LK[ZH(A,1)*256] : LK[ZH(A,0)*256]
  1485.                PK[WB(A,B)] : PK[ZZ(A,B)]
  1486.                'MYPRINT[" "]
  1487.             End If 
  1488.             If WT(A,B)=2
  1489.                TBV=8 : BBV=0
  1490.                H1=ZH(A,0) : H2=ZH(ZZ(A,B),0)
  1491.                If H2<H1
  1492.                   VO=(-H1) and 255
  1493.                   'MYPRINT[" dc.w wall,"+ Fn MY$(ZO(A,B))+","+ Fn MY$(ZO(A,B+1))+",0,"+ Fn MY$(L)] 
  1494.                   PK[-1] : PK[0] : DK[ZO(A,B)] : DK[ZO(A,B+1)] : PK[B] : PK[NB] : DK[L]
  1495.                   'MYPRINT[W$] 
  1496.                   LK[W+VO]
  1497.                   'MYPRINT[" dc.w 0,0,0"]
  1498.                   DK[ZWG(A,B,2)] : PK[CH] : PK[CSV] : PK[GW] : PK[TBV*16+BBV]
  1499.                   'MYPRINT[" dc.l "+ Fn MY$(H2)+"*256,"+ Fn MY$(H1)+"*256"]
  1500.                   LK[H2*256] : LK[H1*256]
  1501.                   PK[WB(A,B)] : PK[ZZ(A,B)]
  1502.                   'MYPRINT[" "]
  1503.                End If 
  1504.                H1=ZH(A,1) : H2=ZH(ZZ(A,B),0)
  1505.                TBV=1 : BBV=8+0
  1506.                If H2>H1
  1507.                   VO=(-H2) and 255
  1508.                   DWPT(A,B)=MP-Start(15)
  1509.                   'MYPRINT["DW_"+ Fn MY$(A)+"_"+ Fn MY$(B)+":"]
  1510.                   'MYPRINT[" dc.w wall,"+ Fn MY$(ZO(A,B))+","+ Fn MY$(ZO(A,B+1))+",0,"+ Fn MY$(L)] 
  1511.                   PK[B+16] : PK[0] : DK[ZO(A,B)] : DK[ZO(A,B+1)] : PK[B] : PK[NB] : DK[L]
  1512.                   'MYPRINT[W$] 
  1513.                   LK[W+VO]
  1514.                   'MYPRINT[" dc.w 0,0,0"]
  1515.                   DK[ZWG(A,B,2)] : PK[CH] : PK[CSV] : PK[GW] : PK[TBV*16+BBV]
  1516.                   'MYPRINT[" dc.l "+ Fn MY$(H1)+"*256,"+ Fn MY$(H2)+"*256"]
  1517.                   LK[H1*256] : LK[H2*256]
  1518.                   PK[WB(A,B)] : PK[ZZ(A,B)]
  1519.                   'MYPRINT[" "]
  1520.                End If 
  1521.             End If 
  1522.             If WT(A,B)=5
  1523.                TBV=8+0 : BBV=0
  1524.                H1=ZH(A,0) : H2=ZH(A,3)
  1525.                DWPT(A,B)=MP-Start(15)
  1526.                'MYPRINT["LW_"+ Fn MY$(A)+"_"+ Fn MY$(B)+":"]
  1527.                'MYPRINT[" dc.w wall,"+ Fn MY$(ZO(A,B))+","+ Fn MY$(ZO(A,B+1))+",0,"+ Fn MY$(L)] 
  1528.                PK[B+16] : PK[0] : DK[ZO(A,B)] : DK[ZO(A,B+1)] : PK[B] : PK[NB] : DK[L]
  1529.                'MYPRINT[W$] 
  1530.                LK[W]
  1531.                'MYPRINT[" dc.w 0,0,0"]
  1532.                DK[ZWG(A,B,2)] : PK[CH] : PK[CSV] : PK[GW] : PK[TBV*16+BBV]
  1533.                'MYPRINT[" dc.l "+ Fn MY$(H2)+"*256,"+ Fn MY$(H1)+"*256"]
  1534.                LK[H2*256] : LK[H1*256]
  1535.                PK[WB(A,B)] : PK[ZZ(A,B)]
  1536.                'MYPRINT[" "]
  1537.                TBV=1 : BBV=8+1
  1538.                H1=ZH(A,1) : H2=ZH(ZZ(A,B),1)
  1539.                If H2>H1
  1540.                   VO=(-H2) and 255
  1541.                   'MYPRINT[" dc.w wall,"+ Fn MY$(ZO(A,B))+","+ Fn MY$(ZO(A,B+1))+",0,"+ Fn MY$(L)] 
  1542.                   PK[-1] : PK[0] : DK[ZO(A,B)] : DK[ZO(A,B+1)] : PK[B] : PK[NB] : DK[L]
  1543.                   'MYPRINT[W$] 
  1544.                   LK[W+VO]
  1545.                   'MYPRINT[" dc.w 0,0,0"]
  1546.                   DK[ZWG(A,B,2)] : PK[CH] : PK[CSV] : PK[GW] : PK[TBV*16+BBV]
  1547.                   'MYPRINT[" dc.l "+ Fn MY$(H1)+"*256,"+ Fn MY$(H2)+"*256"]
  1548.                   LK[H1*256] : LK[H2*256]
  1549.                   PK[WB(A,B)] : PK[ZZ(A,B)]
  1550.                   'MYPRINT[" "]
  1551.                End If 
  1552.             End If 
  1553.          Next 
  1554.          FL=1 : RO=2
  1555.          K$=""
  1556.          If FB(A)=1
  1557.             FL=8
  1558.          End If 
  1559.          If ZLI(A)>0
  1560.             ZLIPT(ZLI(A)-1)=MP-Start(15)
  1561.             'MYPRINT["LF_"+ Fn MY$(A)+":"] 
  1562.          End If 
  1563.          'MYPRINT[" dc.w "+K$+"floor,"+ Fn MY$(ZH(A,0))+"*4,"+ Fn MY$(ZP(A)-1)] 
  1564.          DK[FL] : DK[ZH(A,0)*4] : DK[ZP(A)-1]
  1565.          'M$=" dc.w "+ Fn MY$(ZO(A,0))
  1566.          For B=0 To ZP(A)-1
  1567.             'M$=M$+","+ Fn MY$(ZO(A,B))
  1568.             DK[ZO(A,B)+(B*16*256)]
  1569.          Next 
  1570.          DK[ZO(A,0)]
  1571.          'MYPRINT[M$] 
  1572.          R=ZFG(A,0) : R=(R/4)*256+(R mod 4)
  1573.          'MYPRINT[" dc.w -1,"+ Fn MY$(R)+",0"]
  1574.          DK[ZFG(A,1)] : DK[R] : DK[0]
  1575.          'MYPRINT[" "]
  1576.          '
  1577.          If ZD(A)>0
  1578.             'MYPRINT["DR_"+ Fn MY$(A)+":"] 
  1579.             ZDOPT(ZD(A)-1)=MP-Start(15)
  1580.          End If 
  1581.          If RB(A)=1
  1582.             RO=9
  1583.          End If 
  1584.          If ZRG(A,0)<16
  1585.             'MYPRINT[" dc.w "+K$+"roof,"+ Fn MY$(ZH(A,1))+"*4,"+ Fn MY$(ZP(A)-1)]
  1586.             DK[RO] : DK[ZH(A,1)*4] : DK[ZP(A)-1]
  1587.             'M$=" dc.w "+ Fn MY$(ZO(A,0))
  1588.             For B=0 To ZP(A)-1
  1589.                'M$=M$+","+ Fn MY$(ZO(A,B))
  1590.                DK[ZO(A,B)+(B*16*256)]
  1591.             Next 
  1592.             DK[ZO(A,0)]
  1593.             'MYPRINT[M$] 
  1594.             R=ZRG(A,0) : R=(R/4)*256+(R mod 4)
  1595.             'MYPRINT[" dc.w -1,"+ Fn MY$(R)+",0"]
  1596.             DK[ZRG(A,1)] : DK[R] : DK[0]
  1597.          End If 
  1598.          If(ZH(A,2)<ZH(A,0)) or ZWA(A)<>0
  1599.             'MYPRINT[" dc.w object"] 
  1600.             DK[4]
  1601.             'MYPRINT[" dc.l "+ Fn MY$(ZH(A,0)+4)+"*256,"+ Fn MY$(ZH(A,2))+"*256"]
  1602.             'LK[(ZH(A,0)+4)*256] : LK[ZH(A,2)*256] 
  1603.             DK[0]
  1604.             
  1605.             WAPT(A)=MP-Start(15)
  1606.             
  1607.             'MYPRINT[" dc.w water,"+ Fn MY$(ZH(A,2))+"*4,"+ Fn MY$(ZP(A)-1)] 
  1608.             DK[7] : DK[ZH(A,2)*4] : DK[ZP(A)-1]
  1609.             'M$=" dc.w "+ Fn MY$(ZO(A,0))
  1610.             For B=0 To ZP(A)-1
  1611.                'M$=M$+","+ Fn MY$(ZO(A,B))
  1612.                DK[ZO(A,B)+(B*16*256)]
  1613.             Next 
  1614.             DK[ZO(A,0)]
  1615.             'MYPRINT[M$] 
  1616.             R=ZRG(A,0) : R=(R/4)*256+(R mod 4)
  1617.             'MYPRINT[" dc.w 0,"+ Fn MY$(R)+",0"] 
  1618.             DK[-1] : DK[R] : DK[0]
  1619.             'MYPRINT[" dc.w object"] 
  1620.             DK[4]
  1621.             'MYPRINT[" dc.l "+ Fn MY$(ZH(A,2))+"*256,"+ Fn MY$(ZH(A,1))+"*256"]
  1622.             'LK[ZH(A,2)*256] : LK[ZH(A,1)*256] 
  1623.             DK[1]
  1624.          Else 
  1625.             'MYPRINT[" dc.w object"] 
  1626.             DK[4]
  1627.             'MYPRINT[" dc.l "+ Fn MY$(ZH(A,0)+4)+"*256,"+ Fn MY$(ZH(A,1))+"*256"]
  1628.             'LK[(ZH(A,0)+4)*256] : LK[ZH(A,1)*256] 
  1629.             DK[2]
  1630.          End If 
  1631.          'MYPRINT[" dc.w setclip,-1,-1,-1"] 
  1632.          'MYPRINT[" "]
  1633.          'MYPRINT[" dc.l -1"] 
  1634.          LK[-1]
  1635.          'MYPRINT[" "]
  1636.       End If 
  1637.       'MYPRINT["ZoneGraph"+ Fn MY$(A)+": dc.w "+ Fn MY$(A)]
  1638.       
  1639.       If UZH(A,0)<ZH(A,1)
  1640.          B=MP-Start(15)
  1641.          Loke ZGAPT+(A*8)+4,B
  1642.          DK[A]
  1643.          If ZP(A)>0
  1644.             For B=0 To ZP(A)-1
  1645.                NB=(B+1) mod ZP(A)
  1646.                X1=PX(ZO(A,B)) : Y1=PY(ZO(A,B))
  1647.                X2=PX(ZO(A,B+1)) : Y2=PY(ZO(A,B+1))
  1648.                L=Sqr((X2-X1)^2+(Y2-Y1)^2)
  1649.                L=L/2
  1650.                GW=UZWG(A,B,3)
  1651.                If UZWG(A,B,1)=1
  1652.                   L=(L and(-GW))
  1653.                   L=L+GW
  1654.                End If 
  1655.                If UZWG(A,B,1)=2
  1656.                   L=(L and(-GW))
  1657.                   If L=0
  1658.                      L=L+GW
  1659.                   End If 
  1660.                End If 
  1661.                'W$=" dc.l "+ Fn MY$(ZWG(A,B,0))+"*4096" 
  1662.                W=UZWG(A,B,0)*65536 : CH=WCY(ZWG(A,B,2))-1 : CSV=WCSV(ZWG(A,B,2))
  1663.                GW=GW-1
  1664.                If WT(A,B)=0
  1665.                   H2=UZH(A,0) : H1=UZH(A,1)
  1666.                   OH1=UZH(ZZ(A,B),1)
  1667.                   OH2=UZH(ZZ(A,B),0)
  1668.                   OH3=ZH(ZZ(A,B),1)
  1669.                   OH4=ZH(ZZ(A,B),0)
  1670.                   If OH1>OH3
  1671.                      OH1=-5000 : OH2=-5000
  1672.                   End If 
  1673.                   If H1<OH1
  1674.                      TBV=1 : BBV=0
  1675.                      'MYPRINT[" dc.w wall,"+ Fn MY$(ZO(A,B))+","+ Fn MY$(ZO(A,B+1))+",0,"+ Fn MY$(L)] 
  1676.                      PK[-1] : PK[0] : DK[ZO(A,B)] : DK[ZO(A,B+1)] : PK[B] : PK[NB] : DK[L]
  1677.                      'MYPRINT[W$] 
  1678.                      LK[W]
  1679.                      'MYPRINT[" dc.w 0,0,0"]
  1680.                      DK[UZWG(A,B,2)] : PK[CH] : PK[CSV] : PK[GW] : PK[TBV*16+BBV]
  1681.                      'MYPRINT[" dc.l "+ Fn MY$(H2)+"*256,"+ Fn MY$(H1)+"*256"]
  1682.                      LK[H1*256] : LK[Min(OH1,H2)*256]
  1683.                      PK[UWB(A,B)] : PK[ZZ(A,B)]
  1684.                      'MYPRINT[" "]
  1685.                   End If 
  1686.                   If H1<OH3 and H2>OH2
  1687.                      TBV=1 : BBV=0
  1688.                      'MYPRINT[" dc.w wall,"+ Fn MY$(ZO(A,B))+","+ Fn MY$(ZO(A,B+1))+",0,"+ Fn MY$(L)] 
  1689.                      PK[-1] : PK[0] : DK[ZO(A,B)] : DK[ZO(A,B+1)] : PK[B] : PK[NB] : DK[L]
  1690.                      'MYPRINT[W$] 
  1691.                      LK[W]
  1692.                      'MYPRINT[" dc.w 0,0,0"]
  1693.                      DK[UZWG(A,B,2)] : PK[CH] : PK[CSV] : PK[GW] : PK[TBV*16+BBV]
  1694.                      'MYPRINT[" dc.l "+ Fn MY$(H1)+"*256,"+ Fn MY$(H2)+"*256"]
  1695.                      LK[Max(OH2,H1)*256] : LK[Min(H2,OH3)*256]
  1696.                      PK[UWB(A,B)] : PK[ZZ(A,B)]
  1697.                      'MYPRINT[" "]
  1698.                   End If 
  1699.                   If H2>OH4
  1700.                      TBV=1 : BBV=0
  1701.                      'MYPRINT[" dc.w wall,"+ Fn MY$(ZO(A,B))+","+ Fn MY$(ZO(A,B+1))+",0,"+ Fn MY$(L)] 
  1702.                      PK[B+16] : PK[0] : DK[ZO(A,B)] : DK[ZO(A,B+1)] : PK[B] : PK[NB] : DK[L]
  1703.                      'MYPRINT[W$] 
  1704.                      LK[W]
  1705.                      'MYPRINT[" dc.w 0,0,0"]
  1706.                      DK[UZWG(A,B,2)] : PK[CH] : PK[CSV] : PK[GW] : PK[TBV*16+BBV]
  1707.                      'MYPRINT[" dc.l "+ Fn MY$(H1)+"*256,"+ Fn MY$(H2)+"*256"]
  1708.                      LK[Max(OH4,H1)*256] : LK[H2*256]
  1709.                      PK[UWB(A,B)] : PK[ZZ(A,B)]
  1710.                      'MYPRINT[" "]
  1711.                   End If 
  1712.                End If 
  1713.                
  1714.                If WT(A,B)=1
  1715.                   TBV=1 : BBV=0
  1716.                   'MYPRINT[" dc.w wall,"+ Fn MY$(ZO(A,B))+","+ Fn MY$(ZO(A,B+1))+",0,"+ Fn MY$(L)] 
  1717.                   PK[B] : PK[0] : DK[ZO(A,B)] : DK[ZO(A,B+1)] : PK[B] : PK[NB] : DK[L]
  1718.                   'MYPRINT[W$] 
  1719.                   LK[W]
  1720.                   'MYPRINT[" dc.w 0,0,0"]  
  1721.                   DK[UZWG(A,B,2)] : PK[CH] : PK[CSV] : PK[GW] : PK[TBV*16+BBV]
  1722.                   'MYPRINT[" dc.l "+ Fn MY$(ZH(A,1))+"*256,"+ Fn MY$(ZH(A,0))+"*256"]
  1723.                   LK[UZH(A,1)*256] : LK[UZH(A,0)*256]
  1724.                   PK[UWB(A,B)] : PK[ZZ(A,B)]
  1725.                   'MYPRINT[" "]
  1726.                   
  1727.                End If 
  1728.                If WT(A,B)=3
  1729.                   'MYPRINT[" dc.w seethruwall,"+ Fn MY$(ZO(A,B))+","+ Fn MY$(ZO(A,B+1))+",0,"+ Fn MY$(L)]
  1730.                   DK[13] : DK[ZO(A,B)] : DK[ZO(A,B+1)] : PK[B] : PK[NB] : DK[L]
  1731.                   'MYPRINT[W$] 
  1732.                   LK[W]
  1733.                   'MYPRINT[" dc.w 0,0,0"]
  1734.                   DK[UZWG(A,B,2)] : PK[CH] : PK[CSV] : PK[GW] : PK[TBV*16+BBV]
  1735.                   'MYPRINT[" dc.l "+ Fn MY$(ZH(A,1))+"*256,"+ Fn MY$(ZH(A,0))+"*256"]
  1736.                   LK[UZH(A,1)*256] : LK[UZH(A,0)*256]
  1737.                   PK[UWB(A,B)] : PK[ZZ(A,B)]
  1738.                   'MYPRINT[" "]
  1739.                End If 
  1740.                If WT(A,B)=4
  1741.                   'MYPRINT[" dc.w seethruwall,"+ Fn MY$(ZO(A,B))+","+ Fn MY$(ZO(A,B+1))+","+ Fn MY$(-L)+",0"]
  1742.                   DK[13] : DK[ZO(A,B)] : DK[ZO(A,B+1)] : PK[B] : PK[NB] : DK[L]
  1743.                   'MYPRINT[W$] 
  1744.                   LK[W]
  1745.                   'MYPRINT[" dc.w 0,0,0"]
  1746.                   DK[UZWG(A,B,2)] : PK[CH] : PK[CSV] : PK[GW] : PK[TBV*16+BBV]
  1747.                   'MYPRINT[" dc.l "+ Fn MY$(ZH(A,1))+"*256,"+ Fn MY$(ZH(A,0))+"*256"]
  1748.                   LK[UZH(A,1)*256] : LK[UZH(A,0)*256]
  1749.                   PK[UWB(A,B)] : PK[ZZ(A,B)]
  1750.                   'MYPRINT[" "]
  1751.                End If 
  1752.             Next 
  1753.             FL=1 : RO=2
  1754.             K$=""
  1755.             If FB(A)=1
  1756.                FL=8
  1757.             End If 
  1758.             If ZLI(A)>0
  1759.                ZLIPT(ZLI(A)-1)=MP-Start(15)
  1760.                'MYPRINT["LF_"+ Fn MY$(A)+":"] 
  1761.             End If 
  1762.             'MYPRINT[" dc.w "+K$+"floor,"+ Fn MY$(ZH(A,0))+"*4,"+ Fn MY$(ZP(A)-1)] 
  1763.             DK[FL] : DK[UZH(A,0)*4] : DK[ZP(A)-1]
  1764.             'M$=" dc.w "+ Fn MY$(ZO(A,0))
  1765.             For B=0 To ZP(A)-1
  1766.                'M$=M$+","+ Fn MY$(ZO(A,B))
  1767.                DK[ZO(A,B)+(B*16*256)]
  1768.             Next 
  1769.             DK[ZO(A,0)]
  1770.             'MYPRINT[M$] 
  1771.             R=UZFG(A,0) : R=(R/4)*256+(R mod 4)
  1772.             'MYPRINT[" dc.w -1,"+ Fn MY$(R)+",0"]
  1773.             DK[ZFG(A,1)] : DK[R] : DK[0]
  1774.             'MYPRINT[" "]
  1775.             '
  1776.             If ZD(A)>0
  1777.                'MYPRINT["DR_"+ Fn MY$(A)+":"] 
  1778.                ZDOPT(ZD(A)-1)=MP-Start(15)
  1779.             End If 
  1780.             If RB(A)=1
  1781.                RO=9
  1782.             End If 
  1783.             If UZRG(A,0)<16
  1784.                'MYPRINT[" dc.w "+K$+"roof,"+ Fn MY$(ZH(A,1))+"*4,"+ Fn MY$(ZP(A)-1)]
  1785.                DK[RO] : DK[UZH(A,1)*4] : DK[ZP(A)-1]
  1786.                'M$=" dc.w "+ Fn MY$(ZO(A,0))
  1787.                For B=0 To ZP(A)-1
  1788.                   'M$=M$+","+ Fn MY$(ZO(A,B))
  1789.                   DK[ZO(A,B)+(B*16*256)]
  1790.                Next 
  1791.                DK[ZO(A,0)]
  1792.                'MYPRINT[M$] 
  1793.                R=UZRG(A,0) : R=(R/4)*256+(R mod 4)
  1794.                'MYPRINT[" dc.w -1,"+ Fn MY$(R)+",0"]
  1795.                DK[ZRG(A,1)] : DK[R] : DK[0]
  1796.             End If 
  1797.             If UZH(A,2)<UZH(A,0)
  1798.                'MYPRINT[" dc.w object"] 
  1799.                DK[4]
  1800.                'MYPRINT[" dc.l "+ Fn MY$(ZH(A,0)+4)+"*256,"+ Fn MY$(ZH(A,2))+"*256"]
  1801.                'LK[(UZH(A,0)+4)*256] : LK[UZH(A,2)*256] 
  1802.                DK[0]
  1803.                'MYPRINT[" dc.w water,"+ Fn MY$(ZH(A,2))+"*4,"+ Fn MY$(ZP(A)-1)] 
  1804.                DK[7] : DK[UZH(A,2)*4] : DK[ZP(A)-1]
  1805.                'M$=" dc.w "+ Fn MY$(ZO(A,0))
  1806.                For B=0 To ZP(A)-1
  1807.                   'M$=M$+","+ Fn MY$(ZO(A,B))
  1808.                   DK[ZO(A,B)+(B*16*256)]
  1809.                Next 
  1810.                DK[ZO(A,0)]
  1811.                'MYPRINT[M$] 
  1812.                R=UZRG(A,0) : R=(R/4)*256+(R mod 4)
  1813.                'MYPRINT[" dc.w 0,"+ Fn MY$(R)+",0"] 
  1814.                DK[-1] : DK[R] : DK[0]
  1815.                'MYPRINT[" dc.w object"] 
  1816.                DK[4]
  1817.                'MYPRINT[" dc.l "+ Fn MY$(ZH(A,2))+"*256,"+ Fn MY$(ZH(A,1))+"*256"]
  1818.                'LK[UZH(A,2)*256] : LK[UZH(A,1)*256] 
  1819.                DK[1]
  1820.             Else 
  1821.                'MYPRINT[" dc.w object"] 
  1822.                DK[4]
  1823.                'MYPRINT[" dc.l "+ Fn MY$(ZH(A,0)+4)+"*256,"+ Fn MY$(ZH(A,1))+"*256"]
  1824.                'LK[(UZH(A,0)+4)*256] : LK[UZH(A,1)*256] 
  1825.                DK[2]
  1826.             End If 
  1827.             'MYPRINT[" dc.w setclip,-1,-1,-1"] 
  1828.             'MYPRINT[" "]
  1829.             'MYPRINT[" dc.l -1"] 
  1830.             LK[-1]
  1831.             'MYPRINT[" "]
  1832.          End If 
  1833.       End If 
  1834.       
  1835.       
  1836.       
  1837.       
  1838.       
  1839.       
  1840.    Next 
  1841.    'MYPRINT["DoorData:"]
  1842.    Loke Start(15),MP-Start(15)
  1843.    For D=0 To 20
  1844.       US=0
  1845.       For A=0 To NZ-1
  1846.          If ZD(A)=D+1
  1847.             US=1
  1848.             'MYPRINT[" dc.w "+ Fn MY$(ZH(A,0)*4)+","+ Fn MY$(ZH(A,1)*4)] 
  1849.             DK[ZH(A,0)*4] : DK[ZH(A,1)*4]
  1850.             
  1851.             For QWE=0 To 6
  1852.                DK[OPS(D,QWE)]
  1853.             Next 
  1854.             TX=0 : TZ=0
  1855.             For W=0 To ZP(A)-1
  1856.                Add TX,PX(ZO(A,W))
  1857.                Add TZ,PY(ZO(A,W))
  1858.             Next 
  1859.             TX=TX/ZP(A) : TZ=TZ/ZP(A)
  1860.             DK[TX] : DK[-TZ]
  1861.             
  1862.             'MYPRINT[" dc.w "+ Fn MY$(ZH(A,0)*4)+",0"] 
  1863.             DK[ZH(A,0)*4] : DK[0]
  1864.             'MYPRINT[" dc.l DR_"+ Fn MY$(A)] 
  1865.             LK[ZDOPT(ZD(A)-1)]
  1866.             'MYPRINT[" dc.l ZoneRoof"+ Fn MY$(A)]
  1867.             DK[A]
  1868.             'MYPRINT[" dc.w "+ Fn MY$(DC(D)
  1869.             DK[DC(D)] : PK[DRT(D)] : PK[DLT(D)]
  1870.          End If 
  1871.       Next 
  1872.       For A=0 To NZ-1
  1873.          For B=0 To ZP(A)-1
  1874.             If WD(A,B)=D+1
  1875.                'MYPRINT[" dc.w "+ Fn MY$(ZW(A,B,0))]
  1876.                DK[ZW(A,B,0)]
  1877.                'MYPRINT[" dc.l DW_"+ Fn MY$(A)+"_"+ Fn MY$(B)]
  1878.                LK[DWPT(A,B)]
  1879.                'MYPRINT[" dc.l "+ Fn MY$(ZWG(A,B,0))+"*4096"] 
  1880.                LK[ZWG(A,B,0)*4096]
  1881.             End If 
  1882.          Next 
  1883.       Next 
  1884.       If US=1
  1885.          'MYPRINT[" dc.w -1"] 
  1886.          DK[-1]
  1887.       End If 
  1888.    Next 
  1889.    'MYPRINT[" dc.w 999"]
  1890.    DK[999]
  1891.    'MYPRINT["LiftData:"]
  1892.    Loke Start(15)+4,MP-Start(15)
  1893.    For L=0 To 20
  1894.       US=0
  1895.       For A=0 To NZ
  1896.          If ZLI(A)=L+1
  1897.             US=1
  1898.             'MYPRINT[" dc.w "+ Fn MY$(ZH(A,0)*4)+","+ Fn MY$(ZH(A,3)*4)] 
  1899.             DK[ZH(A,0)*4] : DK[ZH(A,3)*4]
  1900.             For QWE=0 To 6
  1901.                DK[LOPS(L,QWE)]
  1902.             Next 
  1903.             
  1904.             TX=0 : TZ=0
  1905.             For W=0 To ZP(A)-1
  1906.                Add TX,PX(ZO(A,W))
  1907.                Add TZ,PY(ZO(A,W))
  1908.             Next 
  1909.             TX=TX/ZP(A) : TZ=TZ/ZP(A)
  1910.             DK[TX] : DK[-TZ]
  1911.             
  1912.             'MYPRINT[" dc.w "+ Fn MY$(ZH(A,0)*4)+",0"] 
  1913.             If LSP(L)=0
  1914.                DK[ZH(A,0)*4]
  1915.             Else 
  1916.                DK[ZH(A,3)*4]
  1917.             End If 
  1918.             DK[0]
  1919.             'MYPRINT[" dc.l LF_"+ Fn MY$(A)] 
  1920.             LK[ZLIPT(L)]
  1921.             'MYPRINT[" dc.l ZoneFloor"+ Fn MY$(A)] 
  1922.             DK[A]
  1923.             'MYPRINT[" dc.w "+ Fn MY$(LIFTC(L)/256)+","+ Fn MY$(LIFTC(L) and 255)] 
  1924.             DK[LIFTC(L)] : PK[LRT(L)] : PK[LLT(L)]
  1925.          End If 
  1926.       Next 
  1927.       For A=0 To NZ-1
  1928.          For B=0 To ZP(A)-1
  1929.             If WLI(A,B)=L+1
  1930.                'MYPRINT[" dc.w "+ Fn MY$(ZW(A,B,0))]
  1931.                DK[ZW(A,B,0)]
  1932.                'MYPRINT[" dc.l LW_"+ Fn MY$(A)+"_"+ Fn MY$(B)]
  1933.                LK[DWPT(A,B)]
  1934.                'MYPRINT[" dc.l "+ Fn MY$(ZWG(A,B,0))+"*4096"] 
  1935.                LK[ZWG(A,B,0)*4096]
  1936.             End If 
  1937.          Next 
  1938.       Next 
  1939.       If US=1
  1940.          'MYPRINT[" dc.w -1"] 
  1941.          DK[-1]
  1942.       End If 
  1943.    Next 
  1944.    
  1945.    
  1946.    'MYPRINT[" dc.w 999"]
  1947.    DK[999]
  1948.    
  1949.    For S=0 To 20
  1950.       LK[WATH(S)*256] : LK[WABH(S)*256]
  1951.       LK[WATH(S)*256] : DK[128]
  1952.       For A=0 To NZ-1
  1953.          If ZWA(A)=S+1
  1954.             DK[A]
  1955.             LK[WAPT(A)]
  1956.          End If 
  1957.       Next 
  1958.       DK[-1]
  1959.    Next 
  1960.    
  1961.    'MYPRINT["SwitchData:"]
  1962.    Loke Start(15)+8,MP-Start(15)
  1963.    For S=0 To 7
  1964.       'MYPRINT[" dc.w "+ Fn MY$(SWWL(S,0))]
  1965.       DK[SWWL(S,0)]
  1966.       PK[SWITCHTYPE(S)] : PK[0]
  1967.       'MYPRINT[" dc.w "+ Fn MY$(NP+S+S+1)] 
  1968.       DK[NP+S+S+1]
  1969.       If SWWL(S,0)<>-1
  1970.          'MYPRINT[" dc.l SWITCHGRAPH"+ Fn MY$(S)] 
  1971.          LK[SGO(S)]
  1972.       Else 
  1973.          'MYPRINT[" dc.l 0"]
  1974.          LK[0]
  1975.       End If 
  1976.       'MYPRINT[" dc.l 0"]
  1977.       LK[0]
  1978.    Next 
  1979.    Bsave "ab3:levels/level_"+F$+"/twolev.graph.bin",Start(15) To MP
  1980. End If 
  1981. '
  1982. Bar TXP*8,8*4 To 640,80
  1983. Locate TXP,4 : Print "Saving level as AB3:Includes/"+F$
  1984. '
  1985.  
  1986.  
  1987. MP=Start(15)
  1988. Loke MP,NCPT
  1989. Add MP,4
  1990. If NCPT>=0
  1991.    For A=0 To NCPT
  1992.       Loke MP,CPTX(A) : Loke MP+4,CPTY(A)
  1993.       Doke MP+8,CPTZ(A) : Doke MP+10,CPTUL(A)
  1994.       Add MP,12
  1995.    Next 
  1996. End If 
  1997. For A=0 To 20
  1998.    Doke MP,DC(A)
  1999.    Doke MP+2,DRT(A)
  2000.    Doke MP+4,DLT(A)
  2001.    For Q=0 To 6
  2002.       Doke MP+6+Q*2,OPS(A,Q)
  2003.    Next 
  2004.    Add MP,20
  2005. Next 
  2006. For A=0 To 20
  2007.    Doke MP,LIFTC(A)
  2008.    Doke MP+2,LSP(A)
  2009.    Doke MP+4,LRT(A)
  2010.    Doke MP+6,LLT(A)
  2011.    For Q=0 To 6
  2012.       Doke MP+8+Q*2,LOPS(A,Q)
  2013.    Next 
  2014.    Add MP,22
  2015. Next 
  2016. For A=0 To 7
  2017.    Doke MP,SWWL(A,0)
  2018.    Doke MP+2,SWWL(A,1)
  2019.    Add MP,4
  2020. Next 
  2021. Doke MP,NO : Add MP,2
  2022. If NO>0
  2023.    For A=0 To NO-1 : Loke MP,OBX(A) : Loke MP+4,OBZ(A) : Add MP,8 : Next 
  2024. End If 
  2025. Doke MP,NP : Add MP,2
  2026. If NP>-1
  2027.    For A=0 To NP
  2028.       Loke MP,PX(A)
  2029.       Loke MP+4,PY(A)
  2030.       '      Loke MP+8,PBR(A)
  2031.       '      Loke MP+12,UPBR(A)
  2032.       Add MP,8
  2033.    Next 
  2034. End If 
  2035. Doke MP,NZ : Add MP,2
  2036. If NZ>-1
  2037.    For A=0 To NZ
  2038.       
  2039.       Loke MP,TELZO(A) : Add MP,4
  2040.       Loke MP,TELX(A) : Add MP,4
  2041.       Loke MP,TELZ(A) : Add MP,4
  2042.       
  2043.       Doke MP,ZB(A) : Add MP,2
  2044.       Doke MP,UZB(A) : Add MP,2
  2045.       Doke MP,ZCPT(A) : Add MP,2
  2046.       Doke MP,UZCPT(A) : Add MP,2
  2047.       Doke MP,ZP(A) : Add MP,2
  2048.       For B=0 To ZP(A)
  2049.          Doke MP,ZO(A,B)
  2050.          Doke MP+2,WT(A,B)
  2051.          Doke MP+4,ZC(A,B)
  2052.          Doke MP+6,ZWG(A,B,0)
  2053.          Doke MP+8,ZWG(A,B,1)
  2054.          Doke MP+10,ZWG(A,B,2)
  2055.          Doke MP+12,ZWG(A,B,3)
  2056.          Doke MP+14,UZWG(A,B,0)
  2057.          Doke MP+16,UZWG(A,B,1)
  2058.          Doke MP+18,UZWG(A,B,2)
  2059.          Doke MP+20,UZWG(A,B,3)
  2060.          Doke MP+22,WD(A,B)
  2061.          Doke MP+24,WLI(A,B)
  2062.          Doke MP+26,WB(A,B)
  2063.          Doke MP+28,UWB(A,B)
  2064.          Doke MP+30,ZPBR(A,B,0)
  2065.          Doke MP+32,ZPBR(A,B,1)
  2066.          Doke MP+34,ZPBR(A,B,2)
  2067.          Doke MP+36,ZPBR(A,B,3)
  2068.          
  2069.          Add MP,38
  2070.       Next 
  2071.       Loke MP,ZH(A,0) : Add MP,4
  2072.       Loke MP,ZH(A,1) : Add MP,4
  2073.       Loke MP,ZH(A,2) : Add MP,4
  2074.       Loke MP,ZH(A,3) : Add MP,4
  2075.       Loke MP,UZH(A,0) : Add MP,4
  2076.       Loke MP,UZH(A,1) : Add MP,4
  2077.       Loke MP,UZH(A,2) : Add MP,4
  2078.       Loke MP,UZH(A,3) : Add MP,4
  2079.       Poke MP,ZRG(A,0) : Poke MP+1,ZFG(A,0) : Add MP,2
  2080.       Poke MP,ZRG(A,1)+10 : Poke MP+1,ZFG(A,1)+10 : Add MP,2
  2081.       Poke MP,UZRG(A,0) : Poke MP+1,UZFG(A,0) : Add MP,2
  2082.       Poke MP,UZRG(A,1)+10 : Poke MP+1,UZFG(A,1)+10 : Add MP,2
  2083.       Doke MP,ZD(A) : Add MP,2
  2084.       Doke MP,ZLI(A) : Add MP,2
  2085.       Poke MP,RB(A) : Add MP,1
  2086.       Poke MP,FB(A) : Add MP,1
  2087.       S=Start(14)+(A*64*6)
  2088.       For B=0 To 63
  2089.          Doke MP,Deek(S) : Doke MP+2,Deek(S+2) : Doke MP+4,Deek(S+4)
  2090.          Add MP,6 : Add S,6
  2091.       Next 
  2092.    Next 
  2093. End If 
  2094. Loke MP,PLX
  2095. Loke MP+4,PLY
  2096. Doke MP+8,PLZ
  2097. Add MP,10
  2098. Loke MP,PLX2
  2099. Loke MP+4,PLY2
  2100. Doke MP+8,PLZ2
  2101. Add MP,10
  2102. For A=0 To 9
  2103.    For B=1 To 160
  2104.       PK[Asc(Mid$(LEVELTEXT$(A),B,1))]
  2105.    Next 
  2106. Next 
  2107. DK[EZONE]
  2108.  
  2109. For A=0 To NZ-1
  2110.    LK[BSFX(A)]
  2111. Next 
  2112. For A=0 To NZ-1
  2113.    LK[ECHO(A)]
  2114. Next 
  2115.  
  2116. Bsave "ab3:levels/level_"+F$+"/twolev.dat",Start(15) To MP
  2117. Bsave "ab3:levels/level_"+F$+"/twolev.obj",Start(12) To Start(12)+200*32
  2118. Bsave "ab3:levels/level_"+F$+"/twolev.links",Start(11) To Start(11)+100*100
  2119.  
  2120. '
  2121. Bar TXP*8,8*4 To 640,80
  2122. Return 
  2123. '
  2124. BBARRELSAVE:
  2125. TP=Peek(S+10)
  2126. If TP=0 Then H=ZH(Deek(S+6),0) Else H=UZH(Deek(S+6),0)
  2127. H=H*2+48
  2128.  
  2129. H=H-120*4
  2130. T=7*65536+0
  2131.  
  2132. DK[H]
  2133. PK[60] : PK[60]
  2134. LK[T]
  2135. DK[Deek(S+6)]
  2136. PK[32] : PK[32]
  2137. PK[10] : PK[0] : PK[Deek(S+2)] : PK[0]
  2138. For QQ=1 To 21 : DK[0] : Next 
  2139. PK[WATT] : PK[TP]
  2140. Return 
  2141. '
  2142.  
  2143. ALIENSAVE:
  2144.  
  2145. ' First put in the dummy effort: 
  2146.  
  2147. For RT=1 To 15
  2148. LK[0] : Next 
  2149.  
  2150. Poke ST+16,3
  2151. Doke ST+12,-1
  2152.  
  2153. ST=MP
  2154.  
  2155. DK[A]
  2156. DK[0]
  2157.  
  2158.  
  2159. For RT=1 To 15
  2160. LK[0] : Next 
  2161.  
  2162. TP=Peek(S+10)
  2163. If TP=0
  2164.    H=ZH(Deek(S+6),0)
  2165. Else 
  2166.    H=UZH(Deek(S+6),0)
  2167. End If 
  2168. H=(H-8)*2
  2169.  
  2170. Poke ST+63,TP
  2171. Poke ST+62,WATT
  2172. Poke ST+16,0
  2173. Poke ST+54,Peek(S+2)
  2174. Doke ST+50,Deek(S+4)
  2175. Doke ST+12,Deek(S+6)
  2176. Doke ST+52,Deek(S+8)
  2177. Poke ST+18,ALHITPTS(Peek(S+2))
  2178. Poke ST+19,0
  2179. Doke ST+28,ZCPT(Deek(S+6))
  2180. Poke ST+21,Peek(S+12)
  2181. Doke ST+24,Deek(S+14)
  2182. Doke ST+32,Deek(S+16)
  2183.  
  2184. Return 
  2185.  
  2186. THINGSAVE:
  2187. For RT=1 To 15
  2188. LK[0] : Next 
  2189.  
  2190. TP=Peek(S+10)
  2191. If TP=0
  2192.    H=ZH(Deek(S+6),0)
  2193. Else 
  2194.    H=UZH(Deek(S+6),0)
  2195. End If 
  2196. H=(H-8)*2
  2197.  
  2198. Poke ST+63,TP
  2199. Poke ST+62,WATT
  2200. Poke ST+16,1
  2201. Poke ST+54,Peek(S+2)
  2202. Doke ST+50,Deek(S+4)
  2203. Doke ST+12,Deek(S+6)
  2204. Doke ST+52,Deek(S+8)
  2205. Doke ST+24,Deek(S+14)
  2206. Doke ST+34,Deek(S+18)
  2207.  
  2208.  
  2209. ANQ=Deek(S+12)
  2210. ANQ=(ANQ*8192)/360
  2211. ANQ=ANQ and 8190
  2212. Doke ST+30,ANQ
  2213. Return 
  2214.  
  2215. ENEMYSAVE:
  2216. If Peek(S+1)=0
  2217.    ' calculate start height 
  2218.    TP=Peek(S+10)
  2219.    If TP=0
  2220.       H=ZH(Deek(S+6),0)
  2221.    Else 
  2222.       H=UZH(Deek(S+6),0)
  2223.    End If 
  2224.    H=(H-8)*2
  2225.    '   M$=M$+ Fn MY$(H) 
  2226.    '   MYPRINT[M$]
  2227.    DK[H]
  2228.    '   MYPRINT[" dc.b 64,64"] 
  2229.    PK[64] : PK[64]
  2230.    ' 8
  2231.    '   MYPRINT[" dc.l 0"] 
  2232.    LK[0]
  2233.    ' 12 
  2234.    '   MYPRINT[" dc.w "+ Fn MY$(Deek(S+6))] 
  2235.    DK[Deek(S+6)]
  2236.    ' 14 
  2237.    '   MYPRINT[" dc.b 32,32"] 
  2238.    PK[32] : PK[32]
  2239.    ' 16 
  2240.    '   MYPRINT[" dc.b 0,0,"+ Fn MY$(Deek(S+2))+",0"]
  2241.    PK[0] : PK[0] : PK[Deek(S+2)] : PK[0]
  2242.    ' 20 
  2243.    '   MYPRINT[" dc.w "+ Fn MY$(Deek(S+4))+",0,0"]
  2244.    PK[0] : PK[Deek(S+4) and 255] : DK[0] : DK[0]
  2245.    ' 26 
  2246.    FINDCONT[OBX(A),OBZ(A)]
  2247.    P=Param
  2248.    '   MYPRINT[" dc.w "+ Fn MY$(P)+","+ Fn MY$(P)+",0"] 
  2249.    DK[0] : DK[P] : DK[0] : DK[P]
  2250.    '   MYPRINT[" ds.w 16"]
  2251.    For QQ=0 To 13 : DK[0] : Next 
  2252.    '   MYPRINT[" "] 
  2253.    PK[WATT] : PK[TP]
  2254. End If 
  2255. If Peek(S+1)=1
  2256.    
  2257.    ' calculate start height 
  2258.    TP=Peek(S+10)
  2259.    If TP=0
  2260.       H=ZH(Deek(S+6),0)
  2261.    Else 
  2262.       H=UZH(Deek(S+6),0)
  2263.    End If 
  2264.    H=(H-8)*2
  2265.    '   M$=M$+ Fn MY$(H) 
  2266.    '   MYPRINT[M$]
  2267.    DK[H]
  2268.    '   MYPRINT[" dc.b 64,64"] 
  2269.    PK[64] : PK[64]
  2270.    ' 8
  2271.    '   MYPRINT[" dc.l 0"] 
  2272.    LK[0]
  2273.    ' 12 
  2274.    '   MYPRINT[" dc.w "+ Fn MY$(Deek(S+6))] 
  2275.    DK[Deek(S+6)]
  2276.    ' 14 
  2277.    '   MYPRINT[" dc.b 32,32"] 
  2278.    PK[32] : PK[32]
  2279.    ' 16 
  2280.    '   MYPRINT[" dc.b 0,0,"+ Fn MY$(Deek(S+2))+",0"]
  2281.    PK[14] : PK[0] : PK[Deek(S+2)] : PK[0]
  2282.    ' 20 
  2283.    '   MYPRINT[" dc.w "+ Fn MY$(Deek(S+4))+",0,0"]
  2284.    DK[Deek(S+4)] : DK[0] : DK[0]
  2285.    ' 26 
  2286.    FINDCONT[OBX(A),OBZ(A)]
  2287.    P=Param
  2288.    '   MYPRINT[" dc.w "+ Fn MY$(P)+","+ Fn MY$(P)+",0"] 
  2289.    DK[P] : DK[P] : DK[0]
  2290.    '   MYPRINT[" ds.w 16"]
  2291.    For QQ=0 To 14 : DK[0] : Next 
  2292.    '   MYPRINT[" "] 
  2293.    PK[WATT] : PK[TP]
  2294. End If 
  2295. If Peek(S+1)=2
  2296.    TP=Peek(S+10)
  2297.    If TP=0
  2298.       H=ZH(Deek(S+6),0)
  2299.    Else 
  2300.       H=UZH(Deek(S+6),0)
  2301.    End If 
  2302.    ' calculate start height 
  2303.    H=(ZH(Deek(S+6),0)-8)*2
  2304.    '   M$=M$+ Fn MY$(H) 
  2305.    '   MYPRINT[M$]
  2306.    DK[H]
  2307.    '   MYPRINT[" dc.b 64,64"] 
  2308.    PK[64] : PK[64]
  2309.    ' 8
  2310.    '   MYPRINT[" dc.l 0"] 
  2311.    LK[0]
  2312.    ' 12 
  2313.    '   MYPRINT[" dc.w "+ Fn MY$(Deek(S+6))] 
  2314.    DK[Deek(S+6)]
  2315.    ' 14 
  2316.    '   MYPRINT[" dc.b 32,32"] 
  2317.    PK[32] : PK[32]
  2318.    ' 16 
  2319.    '   MYPRINT[" dc.b 8,0,"+ Fn MY$(Deek(S+2))+",0"]
  2320.    PK[8] : PK[0] : PK[Deek(S+2)] : PK[0]
  2321.    ' 20 
  2322.    '   MYPRINT[" dc.w "+ Fn MY$(Deek(S+4))+",0,0"]
  2323.    DK[Deek(S+4)] : DK[0] : DK[0]
  2324.    ' 26 
  2325.    FINDCONT[OBX(A),OBZ(A)]
  2326.    P=Param
  2327.    '   MYPRINT[" dc.w "+ Fn MY$(P)+","+ Fn MY$(P)+",0"] 
  2328.    DK[P] : DK[P] : DK[0]
  2329.    '   MYPRINT[" ds.w 16"]
  2330.    For QQ=0 To 14 : DK[0] : Next 
  2331.    PK[WATT] : PK[TP]
  2332.    '   MYPRINT[" "] 
  2333. End If 
  2334. If Peek(S+1)=3
  2335.    
  2336.    ' calculate start height 
  2337.    TP=Peek(S+10)
  2338.    If TP=0
  2339.       H=ZH(Deek(S+6),0)
  2340.    Else 
  2341.       H=UZH(Deek(S+6),0)
  2342.    End If 
  2343.    H=(H-8)*2
  2344.    '   M$=M$+ Fn MY$(H) 
  2345.    '   MYPRINT[M$]
  2346.    DK[H]
  2347.    '   MYPRINT[" dc.b 64,64"] 
  2348.    PK[64] : PK[64]
  2349.    ' 8
  2350.    '   MYPRINT[" dc.l 0"] 
  2351.    LK[0]
  2352.    ' 12 
  2353.    '   MYPRINT[" dc.w "+ Fn MY$(Deek(S+6))] 
  2354.    DK[Deek(S+6)]
  2355.    ' 14 
  2356.    '   MYPRINT[" dc.b 32,32"] 
  2357.    PK[32] : PK[32]
  2358.    ' 16 
  2359.    '   MYPRINT[" dc.b 0,0,"+ Fn MY$(Deek(S+2))+",0"]
  2360.    PK[12] : PK[0] : PK[Deek(S+2)] : PK[0]
  2361.    ' 20 
  2362.    '   MYPRINT[" dc.w "+ Fn MY$(Deek(S+4))+",0,0"]
  2363.    DK[Deek(S+4)] : DK[0] : DK[0]
  2364.    ' 26 
  2365.    FINDCONT[OBX(A),OBZ(A)]
  2366.    P=Param
  2367.    '   MYPRINT[" dc.w "+ Fn MY$(P)+","+ Fn MY$(P)+",0"] 
  2368.    DK[P] : DK[P] : DK[0]
  2369.    '   MYPRINT[" ds.w 16"]
  2370.    For QQ=0 To 14 : DK[0] : Next 
  2371.    '   MYPRINT[" "] 
  2372.    PK[WATT] : PK[TP]
  2373. End If 
  2374. If Peek(S+1)=4
  2375.    
  2376.    ' calculate start height 
  2377.    TP=Peek(S+10)
  2378.    If TP=0
  2379.       H=ZH(Deek(S+6),0)
  2380.    Else 
  2381.       H=UZH(Deek(S+6),0)
  2382.    End If 
  2383.    H=(H-8)*2
  2384.    '   M$=M$+ Fn MY$(H) 
  2385.    '   MYPRINT[M$]
  2386.    DK[H]
  2387.    '   MYPRINT[" dc.b 64,64"] 
  2388.    PK[64] : PK[64]
  2389.    ' 8
  2390.    '   MYPRINT[" dc.l 0"] 
  2391.    LK[0]
  2392.    ' 12 
  2393.    '   MYPRINT[" dc.w "+ Fn MY$(Deek(S+6))] 
  2394.    DK[Deek(S+6)]
  2395.    ' 14 
  2396.    '   MYPRINT[" dc.b 32,32"] 
  2397.    PK[32] : PK[32]
  2398.    ' 16 
  2399.    '   MYPRINT[" dc.b 0,0,"+ Fn MY$(Deek(S+2))+",0"]
  2400.    PK[13] : PK[0] : PK[Deek(S+2)] : PK[0]
  2401.    ' 20 
  2402.    '   MYPRINT[" dc.w "+ Fn MY$(Deek(S+4))+",0,0"]
  2403.    DK[Deek(S+4)] : DK[0] : DK[0]
  2404.    ' 26 
  2405.    FINDCONT[OBX(A),OBZ(A)]
  2406.    P=Param
  2407.    '   MYPRINT[" dc.w "+ Fn MY$(P)+","+ Fn MY$(P)+",0"] 
  2408.    DK[P] : DK[P] : DK[0]
  2409.    '   MYPRINT[" ds.w 16"]
  2410.    For QQ=0 To 14 : DK[0] : Next 
  2411.    '   MYPRINT[" "] 
  2412.    PK[WATT] : PK[TP]
  2413. End If 
  2414. If Peek(S+1)=5
  2415.    
  2416.    ' calculate start height 
  2417.    TP=Peek(S+10)
  2418.    If TP=0
  2419.       H=ZH(Deek(S+6),0)
  2420.    Else 
  2421.       H=UZH(Deek(S+6),0)
  2422.    End If 
  2423.    H=(H-8)*2
  2424.    '   M$=M$+ Fn MY$(H) 
  2425.    '   MYPRINT[M$]
  2426.    DK[H]
  2427.    '   MYPRINT[" dc.b 64,64"] 
  2428.    PK[64] : PK[64]
  2429.    ' 8
  2430.    '   MYPRINT[" dc.l 0"] 
  2431.    LK[0]
  2432.    ' 12 
  2433.    '   MYPRINT[" dc.w "+ Fn MY$(Deek(S+6))] 
  2434.    DK[Deek(S+6)]
  2435.    ' 14 
  2436.    '   MYPRINT[" dc.b 32,32"] 
  2437.    PK[32] : PK[32]
  2438.    ' 16 
  2439.    '   MYPRINT[" dc.b 0,0,"+ Fn MY$(Deek(S+2))+",0"]
  2440.    PK[16] : PK[0] : PK[Deek(S+2)] : PK[0]
  2441.    ' 20 
  2442.    '   MYPRINT[" dc.w "+ Fn MY$(Deek(S+4))+",0,0"]
  2443.    DK[Deek(S+4)] : DK[0] : DK[0]
  2444.    ' 26 
  2445.    FINDCONT[OBX(A),OBZ(A)]
  2446.    P=Param
  2447.    '   MYPRINT[" dc.w "+ Fn MY$(P)+","+ Fn MY$(P)+",0"] 
  2448.    DK[P] : DK[P] : DK[0]
  2449.    '   MYPRINT[" ds.w 16"]
  2450.    For QQ=0 To 14 : DK[0] : Next 
  2451.    '   MYPRINT[" "] 
  2452.    PK[WATT] : PK[TP]
  2453. End If 
  2454. If Peek(S+1)=6
  2455.    
  2456.    ' calculate start height 
  2457.    TP=Peek(S+10)
  2458.    If TP=0
  2459.       H=ZH(Deek(S+6),0)
  2460.    Else 
  2461.       H=UZH(Deek(S+6),0)
  2462.    End If 
  2463.    H=(H-8)*2
  2464.    '   M$=M$+ Fn MY$(H) 
  2465.    '   MYPRINT[M$]
  2466.    DK[H]
  2467.    '   MYPRINT[" dc.b 64,64"] 
  2468.    PK[64] : PK[64]
  2469.    ' 8
  2470.    '   MYPRINT[" dc.l 0"] 
  2471.    LK[0]
  2472.    ' 12 
  2473.    '   MYPRINT[" dc.w "+ Fn MY$(Deek(S+6))] 
  2474.    DK[Deek(S+6)]
  2475.    ' 14 
  2476.    '   MYPRINT[" dc.b 32,32"] 
  2477.    PK[32] : PK[32]
  2478.    ' 16 
  2479.    '   MYPRINT[" dc.b 0,0,"+ Fn MY$(Deek(S+2))+",0"]
  2480.    PK[18] : PK[0] : PK[Deek(S+2)] : PK[0]
  2481.    ' 20 
  2482.    '   MYPRINT[" dc.w "+ Fn MY$(Deek(S+4))+",0,0"]
  2483.    DK[Deek(S+4)] : DK[0] : DK[0]
  2484.    ' 26 
  2485.    FINDCONT[OBX(A),OBZ(A)]
  2486.    P=Param
  2487.    '   MYPRINT[" dc.w "+ Fn MY$(P)+","+ Fn MY$(P)+",0"] 
  2488.    DK[P] : DK[P] : DK[0]
  2489.    '   MYPRINT[" ds.w 16"]
  2490.    For QQ=0 To 14 : DK[0] : Next 
  2491.    '   MYPRINT[" "] 
  2492.    PK[WATT] : PK[TP]
  2493. End If 
  2494. If Peek(S+1)=7
  2495.    
  2496.    ' calculate start height 
  2497.    TP=Peek(S+10)
  2498.    If TP=0
  2499.       H=ZH(Deek(S+6),0)
  2500.    Else 
  2501.       H=UZH(Deek(S+6),0)
  2502.    End If 
  2503.    H=(H-8)*2
  2504.    '   M$=M$+ Fn MY$(H) 
  2505.    '   MYPRINT[M$]
  2506.    DK[H]
  2507.    '   MYPRINT[" dc.b 64,64"] 
  2508.    PK[64] : PK[64]
  2509.    ' 8
  2510.    '   MYPRINT[" dc.l 0"] 
  2511.    LK[0]
  2512.    ' 12 
  2513.    '   MYPRINT[" dc.w "+ Fn MY$(Deek(S+6))] 
  2514.    DK[Deek(S+6)]
  2515.    ' 14 
  2516.    '   MYPRINT[" dc.b 32,32"] 
  2517.    PK[32] : PK[32]
  2518.    ' 16 
  2519.    '   MYPRINT[" dc.b 0,0,"+ Fn MY$(Deek(S+2))+",0"]
  2520.    PK[19] : PK[0] : PK[Deek(S+2)] : PK[0]
  2521.    ' 20 
  2522.    '   MYPRINT[" dc.w "+ Fn MY$(Deek(S+4))+",0,0"]
  2523.    DK[Deek(S+4)] : DK[0] : DK[0]
  2524.    ' 26 
  2525.    FINDCONT[OBX(A),OBZ(A)]
  2526.    P=Param
  2527.    '   MYPRINT[" dc.w "+ Fn MY$(P)+","+ Fn MY$(P)+",0"] 
  2528.    DK[P] : DK[P] : DK[0]
  2529.    '   MYPRINT[" ds.w 16"]
  2530.    For QQ=0 To 14 : DK[0] : Next 
  2531.    '   MYPRINT[" "] 
  2532.    PK[WATT] : PK[TP]
  2533. End If 
  2534. Return 
  2535. '
  2536. MARINESAVE:
  2537. ' calculate start height 
  2538. H=(ZH(Deek(S+6),0)-8)*2
  2539. 'M$=M$+ Fn MY$(H)
  2540. 'MYPRINT[M$] 
  2541. DK[H]
  2542. 'MYPRINT[" dc.b 64,64"]
  2543. PK[64] : PK[64]
  2544. ' 8
  2545. 'MYPRINT[" dc.l 0"]
  2546. LK[0]
  2547. ' 12 
  2548. 'MYPRINT[" dc.w "+ Fn MY$(Deek(S+6))]
  2549. DK[Deek(S+6)]
  2550. ' 14 
  2551. 'MYPRINT[" dc.b 32,32"]
  2552. PK[32] : PK[32]
  2553. ' 16 
  2554. 'MYPRINT[" dc.b 5,0,"+ Fn MY$(Deek(S+2))+",0"] 
  2555. PK[5] : PK[0] : PK[Deek(S+2)] : PK[0]
  2556. ' 20 
  2557. 'MYPRINT[" dc.w "+ Fn MY$(Deek(S+4))+",0,0"] 
  2558. DK[Deek(S+4)] : DK[0] : DK[0]
  2559. ' 26 
  2560. FINDCONT[OBX(A),OBZ(A)]
  2561. P=Param
  2562. 'MYPRINT[" dc.w "+ Fn MY$(P)+","+ Fn MY$(P)+",0"]
  2563. DK[P] : DK[P] : DK[0]
  2564. 'MYPRINT[" dc.w "+ Fn MY$(Deek(S+8))]
  2565. DK[Deek(S+8)]
  2566. 'MYPRINT[" ds.w 15"] 
  2567. For QQ=0 To 14 : DK[0] : Next 
  2568. 'MYPRINT[" "]
  2569. Return 
  2570. '
  2571. GLASSSAVE:
  2572. ' calculate start height 
  2573. H=(ZH(Deek(S+6),0)-8)*2-80
  2574. 'M$=M$+ Fn MY$(H)
  2575. 'MYPRINT[M$] 
  2576. DK[H]
  2577. 'MYPRINT[" dc.b 64,64"]
  2578. PK[64] : PK[64]
  2579. ' 8
  2580. 'MYPRINT[" dc.l -1"] 
  2581. LK[-1]
  2582. ' 12 
  2583. 'MYPRINT[" dc.w "+ Fn MY$(Deek(S+6))]
  2584. DK[Deek(S+6)]
  2585. ' 14 
  2586. 'MYPRINT[" dc.b 32,32"]
  2587. PK[32] : PK[32]
  2588. ' 16 
  2589. 'MYPRINT[" dc.b -1,-1,"+ Fn MY$(Deek(S+2))+",0"] 
  2590. PK[-1] : PK[-1] : PK[Deek(S+2)] : PK[0]
  2591. ' 20 
  2592. 'MYPRINT[" dc.w "+ Fn MY$(Deek(S+4))+",0,0"] 
  2593. DK[Deek(S+4)] : DK[0] : DK[0]
  2594. ' 26 
  2595. FINDCONT[OBX(A),OBZ(A)]
  2596. P=Param
  2597. 'MYPRINT[" dc.w "+ Fn MY$(P)+","+ Fn MY$(P)+",0"]
  2598. DK[P] : DK[P] : DK[0]
  2599. 'MYPRINT[" dc.w "+ Fn MY$(Deek(S+8))]
  2600. DK[Deek(S+8)]
  2601. 'MYPRINT[" ds.w 15"] 
  2602. For QQ=0 To 14 : DK[0] : Next 
  2603. 'MYPRINT[" "]
  2604. Return 
  2605. '
  2606. MEDISAVE:
  2607. '
  2608. MED_GRAPH=1*65536
  2609. '
  2610. TP=Peek(S+10)
  2611. If TP=0
  2612.    H=ZH(Deek(S+6),0)
  2613. Else 
  2614.    H=UZH(Deek(S+6),0)
  2615. End If 
  2616. H=H*2-16
  2617. 'M$=M$+ Fn MY$(H)
  2618. 'MYPRINT[M$] 
  2619. DK[H]
  2620. 'MYPRINT[" dc.b 32,32"]
  2621. PK[32] : PK[32]
  2622. 'MYPRINT[" dc.l MediKit_Graph"]
  2623. LK[MED_GRAPH]
  2624. 'MYPRINT[" dc.w "+ Fn MY$(Deek(S+6))]
  2625. DK[Deek(S+6)]
  2626. 'MYPRINT[" dc.b 16,16"]
  2627. PK[16] : PK[16]
  2628. 'MYPRINT[" dc.b 1,"+ Fn MY$(Peek(S+1))]
  2629. PK[1] : PK[Peek(S+1)]
  2630. 'MYPRINT[" dc.w "+ Fn MY$(Deek(S+2))]
  2631. DK[Deek(S+2)]
  2632. 'MYPRINT[" dc.w 0,0,0,0,0,0"]
  2633. 'MYPRINT[" ds.w 16"] 
  2634. For QQ=1 To 21 : DK[0] : Next 
  2635. PK[WATT] : PK[TP]
  2636. Return 
  2637.  
  2638. AMMOSAVE:
  2639. '
  2640. AMMO_GRAPH=1*65536+3
  2641. '
  2642. TP=Peek(S+10)
  2643. If TP=0
  2644.    H=ZH(Deek(S+6),0)
  2645. Else 
  2646.    H=UZH(Deek(S+6),0)
  2647. End If 
  2648. H=H*2-16
  2649. 'M$=M$+ Fn MY$(H)
  2650. 'MYPRINT[M$] 
  2651. DK[H]
  2652. 'MYPRINT[" dc.b 32,32"]
  2653. PK[32] : PK[32]
  2654. 'MYPRINT[" dc.l MediKit_Graph"]
  2655. LK[AMMO_GRAPH+Deek(S+2)]
  2656. 'MYPRINT[" dc.w "+ Fn MY$(Deek(S+6))]
  2657. DK[Deek(S+6)]
  2658. 'MYPRINT[" dc.b 16,16"]
  2659. PK[16] : PK[16]
  2660. 'MYPRINT[" dc.b 1,"+ Fn MY$(Peek(S+1))]
  2661. PK[9] : PK[Peek(S+1)]
  2662. 'MYPRINT[" dc.w "+ Fn MY$(Deek(S+2))]
  2663. DK[Deek(S+2)]
  2664. 'MYPRINT[" dc.w 0,0,0,0,0,0"]
  2665. 'MYPRINT[" ds.w 16"] 
  2666. For QQ=1 To 21 : DK[0] : Next 
  2667. PK[WATT] : PK[TP]
  2668. Return 
  2669. '
  2670. KEYSAVE:
  2671. KEYGRAPH(0)=5*65536
  2672. KEYGRAPH(1)=5*65536+1
  2673. KEYGRAPH(2)=5*65536+2
  2674. KEYGRAPH(3)=5*65536+3
  2675. TP=Peek(S+10)
  2676. If TP=0
  2677.    H=ZH(Deek(S+6),0)
  2678. Else 
  2679.    H=UZH(Deek(S+6),0)
  2680. End If 
  2681. H=(H-32)*2+48
  2682. 'M$=M$+ Fn MY$(H)
  2683. 'MYPRINT[M$] 
  2684. DK[H]
  2685. 'MYPRINT[" dc.b 32,32"]
  2686. PK[32] : PK[32]
  2687. CO=Peek(S+1)
  2688. 'MYPRINT[" dc.l KeyGraph"+ Fn MY$(CO)] 
  2689. LK[KEYGRAPH(CO)]
  2690. 'MYPRINT[" dc.w "+ Fn MY$(Deek(S+6))]
  2691. DK[Deek(S+6)]
  2692. 'MYPRINT[" dc.b 16,16"]
  2693. PK[16] : PK[16]
  2694. 'MYPRINT[" dc.b 4,"+ Fn MY$(2^CO)] 
  2695. PK[4] : PK[2^CO]
  2696. 'MYPRINT[" dc.w 0,0,0,0,0,0,0"]
  2697. 'MYPRINT[" ds.w 16"] 
  2698. For QQ=1 To 22 : DK[0] : Next 
  2699. PK[WATT] : PK[TP]
  2700. Return 
  2701. '
  2702. DDECOSAVE:
  2703. TP=Peek(S+10)
  2704.  
  2705. DT=Deek(S+2)
  2706.  
  2707. ' LAMP 
  2708. If DT=0
  2709.    If TP=0
  2710.       H=ZH(Deek(S+6),0)
  2711.    Else 
  2712.       H=UZH(Deek(S+6),0)
  2713.    End If 
  2714.    H=H*2
  2715.    H=H-30*2
  2716.    T=12*65536
  2717.    DK[H]
  2718.    PK[15] : PK[60]
  2719.    LK[T]
  2720.    DK[Deek(S+6)]
  2721.    PK[7] : PK[31]
  2722. End If 
  2723.  
  2724. 'EXIT SIGN 
  2725. If DT=1
  2726.    If TP=0
  2727.       H=ZH(Deek(S+6),1)
  2728.    Else 
  2729.       H=UZH(Deek(S+6),1)
  2730.    End If 
  2731.    H=H*2
  2732.    T=$20000
  2733.    DK[H]
  2734.    PK[-1] : PK[-1]
  2735.    LK[T]
  2736.    DK[Deek(S+6)]
  2737.    PK[8] : PK[32]
  2738. End If 
  2739.  
  2740. If DT=2
  2741.    If TP=0
  2742.       H=ZH(Deek(S+6),0)
  2743.    Else 
  2744.       H=UZH(Deek(S+6),0)
  2745.    End If 
  2746.    H=H*2
  2747.    H=H-(30+32)*2
  2748.    T=-18
  2749.    DK[H]
  2750.    PK[31] : PK[63]
  2751.    DK[T] : DK[0]
  2752.    DK[Deek(S+6)]
  2753.    PK[15] : PK[31]
  2754. End If 
  2755.  
  2756. PK[-1] : PK[0] : PK[Deek(S+2)] : PK[0]
  2757. For QQ=1 To 5 : DK[0] : Next 
  2758. DK[Deek(S+8)]
  2759. For QQ=7 To 21
  2760. DK[0] : Next 
  2761. PK[WATT] : PK[TP]
  2762.  
  2763.  
  2764. Return 
  2765. '
  2766.  
  2767. FLHASAVE:
  2768. TP=Peek(S+10)
  2769. If TP=0
  2770.    H=ZH(Deek(S+6),0)
  2771. Else 
  2772.    H=UZH(Deek(S+6),0)
  2773. End If 
  2774.  
  2775. H=H*2
  2776. M$=M$+ Fn MY$(H)
  2777. 'MYPRINT[M$] 
  2778. DK[H]
  2779. 'MYPRINT[" dc.b -1,-1"]
  2780. PK[-1] : PK[-1]
  2781. K=Peek(S+1)
  2782. 'MYPRINT[" dc.l "+VECT$(K)+"_des"] 
  2783. DK[K] : DK[0]
  2784. 'MYPRINT[" dc.w "+ Fn MY$(Deek(S+6))]
  2785. DK[Deek(S+6)]
  2786. 'MYPRINT[" dc.b 16,16"]
  2787. PK[16] : PK[16]
  2788. 'MYPRINT[" dc.b 255,255"]
  2789. If Peek(S+1)=0
  2790.    PK[6] : PK[-1]
  2791. Else 
  2792.    If Peek(S+1)=9
  2793.       PK[20] : PK[-1]
  2794.    Else 
  2795.       PK[-1] : PK[-1]
  2796.    End If 
  2797. End If 
  2798. PK[100] : PK[0]
  2799. 'MYPRINT[" dc.w 0,0,0,0,0"]
  2800.  
  2801. 'MYPRINT[" ds.w 16"] 
  2802. For QQ=1 To 5 : DK[0] : Next 
  2803. ANG=Deek(S+8) : ANG=(ANG*8192)/360
  2804. ANG=ANG and 8190
  2805. DK[ANG]
  2806. For QQ=1 To 15 : DK[0] : Next 
  2807. PK[WATT] : PK[TP]
  2808.  
  2809. Doke ST+34,Deek(S+12)
  2810.  
  2811. Return 
  2812. '
  2813. BIGGUNSAVE:
  2814. '
  2815. BIGGUN_GRAPH=65536
  2816. '
  2817. GT=Peek(S+1)
  2818. TP=Peek(S+10)
  2819. If TP=0
  2820.    H=ZH(Deek(S+6),0)
  2821. Else 
  2822.    H=UZH(Deek(S+6),0)
  2823. End If 
  2824. H=H*2+48
  2825. H=H-BIGGUNDIM(GT,1)*4
  2826. T=BIGGUNGRAPH(GT)
  2827.  
  2828. 'M$=M$+ Fn MY$(H)
  2829. 'MYPRINT[M$] 
  2830. DK[H]
  2831. 'MYPRINT[" dc.b 64,32"]
  2832. PK[BIGGUNDIM(GT,0)*2] : PK[BIGGUNDIM(GT,1)*2]
  2833. 'MYPRINT[" dc.l BigGun_Graph"] 
  2834. LK[BIGGUN_GRAPH+T]
  2835. 'MYPRINT[" dc.w "+ Fn MY$(Deek(S+6))]
  2836. DK[Deek(S+6)]
  2837. 'MYPRINT[" dc.b 32,16"]
  2838. PK[BIGGUNDIM(GT,0)] : PK[BIGGUNDIM(GT,1)]
  2839. 'MYPRINT[" dc.b 3,0"]
  2840. PK[3] : PK[GT]
  2841. 'MYPRINT[" dc.w 0,0,0,0,0,0,0"]
  2842. 'MYPRINT[" ds.w 16"] 
  2843. For QQ=1 To 22 : DK[0] : Next 
  2844. PK[WATT] : PK[TP]
  2845. Return 
  2846. '
  2847. LEVELLOAD:
  2848. Screen 0
  2849. Ink 0 : Bar TXP*8,8*4 To 640,80
  2850. Curs Off 
  2851. Locate TXP,4 : Print "Enter file name to load level:"
  2852. Locate TXP,5 : Input "Filename: ";F$
  2853. If F$="" Then Return 
  2854.  
  2855. Curs Off 
  2856. Bar TXP*8,8*4 To 640,80
  2857. Locate TXP,4 : Print "Loading level data..."
  2858. Bload "ab3:levels/level_"+F$+"/twolev.dat",Start(15)
  2859. MP=Start(15)
  2860. NCPT=Leek(MP)
  2861. Add MP,4
  2862. If NCPT>=0
  2863.    For A=0 To NCPT
  2864.       CPTX(A)=Leek(MP) : CPTY(A)=Leek(MP+4)
  2865.       CPTZ(A)=Deek(MP+8) : CPTUL(A)=Deek(MP+10)
  2866.       Add MP,12
  2867.    Next 
  2868. End If 
  2869. For A=0 To 20
  2870.    DC(A)=Deek(MP)
  2871.    DRT(A)=Deek(MP+2)
  2872.    DLT(A)=Deek(MP+4)
  2873.    For Q=0 To 6
  2874.       OPS(A,Q)=Deek(MP+6+Q*2)
  2875.    Next 
  2876.    Add MP,20
  2877. Next 
  2878. For A=0 To 20
  2879.    LIFTC(A)=Deek(MP) and %111111111111
  2880.    LSP(A)=Deek(MP+2)
  2881.    LRT(A)=Deek(MP+4)
  2882.    LLT(A)=Deek(MP+6)
  2883.    For Q=0 To 6
  2884.       LOPS(A,Q)=Deek(MP+8+Q*2)
  2885.    Next 
  2886.    Add MP,22
  2887. Next 
  2888. '**********************************************
  2889. '* TAKE OUT FOR OTHER LEVEL  
  2890. '**********************************************
  2891. For A=0 To 7
  2892.    SWWL(A,0)=Deek(MP)
  2893.    SWWL(A,1)=Deek(MP+2)
  2894.    If SWWL(A,0)=65535 Then SWWL(A,0)=-1
  2895.    If SWWL(A,1)=65535 Then SWWL(A,1)=-1
  2896.    Add MP,4
  2897. Next 
  2898. '****************************
  2899. NO=Deek(MP) : Add MP,2
  2900. If NO>0
  2901.    For A=0 To NO-1
  2902.       OBX(A)=Leek(MP) : OBZ(A)=Leek(MP+4) : Add MP,8
  2903.    Next 
  2904. End If 
  2905. NP=Deek(MP) : Add MP,2
  2906. If NP>-1
  2907.    For A=0 To NP
  2908.       PX(A)=Leek(MP)
  2909.       PY(A)=Leek(MP+4)
  2910.       'PBR(A)=Leek(MP+8) 
  2911.       'UPBR(A)=Leek(MP+12) 
  2912.       Add MP,8
  2913.    Next 
  2914. End If 
  2915. NZ=Deek(MP) : Add MP,2
  2916. If NZ>-1
  2917.    For A=0 To NZ
  2918.       
  2919.       TELZO(A)=Leek(MP) : Add MP,4
  2920.       TELX(A)=Leek(MP) : Add MP,4
  2921.       TELZ(A)=Leek(MP) : Add MP,4
  2922.       
  2923.       ZB(A)=Deek(MP) : Add MP,2
  2924.       UZB(A)=Deek(MP) : Add MP,2
  2925.       ZCPT(A)=Deek(MP) : Add MP,2
  2926.       UZCPT(A)=Deek(MP) : Add MP,2
  2927.       If ZB(A)>32767
  2928.          ZB(A)=ZB(A)-65536
  2929.       End If 
  2930.       ZP(A)=Deek(MP) : Add MP,2
  2931.       If ZP(A)>0
  2932.          USED(A)=1
  2933.       End If 
  2934.       For B=0 To ZP(A)
  2935.          ZO(A,B)=Deek(MP)
  2936.          WT(A,B)=Deek(MP+2)
  2937.          ZC(A,B)=Deek(MP+4)
  2938.          ZWG(A,B,0)=Deek(MP+6)
  2939.          ZWG(A,B,1)=Deek(MP+8)
  2940.          ZWG(A,B,2)=Deek(MP+10)
  2941.          ZWG(A,B,3)=Deek(MP+12)
  2942.          If ZWG(A,B,3)=0
  2943.             ZWG(A,B,3)=64
  2944.          End If 
  2945.          UZWG(A,B,0)=Deek(MP+14)
  2946.          UZWG(A,B,1)=Deek(MP+16)
  2947.          UZWG(A,B,2)=Deek(MP+18)
  2948.          UZWG(A,B,3)=Deek(MP+20)
  2949.          If UZWG(A,B,3)=0
  2950.             UZWG(A,B,3)=64
  2951.          End If 
  2952.          WD(A,B)=Deek(MP+22)
  2953.          WLI(A,B)=Deek(MP+24)
  2954.          WB(A,B)=Deek(MP+26)
  2955.          If WB(A,B)>32767
  2956.             WB(A,B)=WB(A,B)-65536
  2957.          End If 
  2958.          UWB(A,B)=Deek(MP+28)
  2959.          If UWB(A,B)>32767
  2960.             UWB(A,B)=UWB(A,B)-65536
  2961.          End If 
  2962.          
  2963.          For C=0 To 3
  2964.             ZPBR(A,B,C)=Deek(MP+30+C+C)
  2965.             If ZPBR(A,B,C)>32767
  2966.                ZPBR(A,B,C)=ZPBR(A,B,C)-65536
  2967.             End If 
  2968.          Next 
  2969.          
  2970.          Add MP,38
  2971.       Next 
  2972.       ZH(A,0)=Leek(MP) : Add MP,4
  2973.       ZH(A,1)=Leek(MP) : Add MP,4
  2974.       ZH(A,2)=Leek(MP) : Add MP,4
  2975.       ZH(A,3)=Leek(MP) : Add MP,4
  2976.       UZH(A,0)=Leek(MP) : Add MP,4
  2977.       UZH(A,1)=Leek(MP) : Add MP,4
  2978.       UZH(A,2)=Leek(MP) : Add MP,4
  2979.       UZH(A,3)=Leek(MP) : Add MP,4
  2980.       ZRG(A,0)=Peek(MP) : ZFG(A,0)=Peek(MP+1) : Add MP,2
  2981.       ZRG(A,1)=Peek(MP)-10 : ZFG(A,1)=Peek(MP+1)-10 : Add MP,2
  2982.       UZRG(A,0)=Peek(MP) : UZFG(A,0)=Peek(MP+1) : Add MP,2
  2983.       UZRG(A,1)=Peek(MP)-10 : UZFG(A,1)=Peek(MP+1)-10 : Add MP,2
  2984.       ZD(A)=Deek(MP) : Add MP,2
  2985.       ZLI(A)=Deek(MP) : Add MP,2
  2986.       RB(A)=Peek(MP) : Add MP,1
  2987.       FB(A)=Peek(MP) : Add MP,1
  2988.       S=Start(14)+(A*64*6)
  2989.       For B=0 To 63
  2990.          Doke S,Deek(MP)
  2991.          Doke S+2,Deek(MP+2)
  2992.          Doke S+4,Deek(MP+4)
  2993.          Add MP,6 : Add S,6
  2994.       Next 
  2995.    Next 
  2996. End If 
  2997. PLX=Leek(MP)
  2998. PLY=Leek(MP+4)
  2999. PLZ=Deek(MP+8)
  3000. Add MP,10
  3001. PLX2=Leek(MP)
  3002. PLY2=Leek(MP+4)
  3003. PLZ2=Deek(MP+8)
  3004. Add MP,10
  3005. For A=0 To 9
  3006.    LEVELTEXT$(A)=""
  3007.    For B=1 To 160
  3008.       LEVELTEXT$(A)=LEVELTEXT$(A)+Chr$(Peek(MP)) : Add MP,1
  3009.    Next 
  3010. Next 
  3011. EZONE=Deek(MP) : Add MP,2
  3012. For A=0 To NZ-1
  3013.    BSFX(A)=Leek(MP) : Add MP,4
  3014. Next 
  3015. For A=0 To NZ-1
  3016.    ECHO(A)=Leek(MP) : Add MP,4
  3017. Next 
  3018. Bload "ab3:levels/level_"+F$+"/twolev.obj",Start(12)
  3019. Bload "ab3:levels/level_"+F$+"/twolev.links",Start(11)
  3020.  
  3021. For A=0 To 99
  3022.    For B=0 To 99
  3023.       Q=Peek(Start(11)+A*100+B)
  3024.       W=Peek(Start(11)+B*100+A)
  3025.       If Q=1 and W=0
  3026.          Poke Start(11)+A*100+B,0
  3027.       End If 
  3028.       If Q=0 and W=1
  3029.          Poke Start(11)+B*100+A,0
  3030.       End If 
  3031.    Next 
  3032. Next 
  3033.  
  3034. Bar TXP*8,8*4 To 640,80
  3035. Gosub REDRAW
  3036. Return 
  3037. '
  3038. Procedure MYPRINT[M$]
  3039. End Proc
  3040. '
  3041. REDRAW:
  3042. Screen 2 : Extension   -1
  3043. If NP=-1 Then Return 
  3044. For QA=0 To NP : PTSHOW[PX(QA),PY(QA),2] : Next 
  3045. If NZ=-1 Then Return 
  3046. For QA=0 To NZ-1
  3047.    If USED(QA) Then ZOSHO[QA,4]
  3048. Next 
  3049. If USED(CZ) Then ZOSHO[CZ,10]
  3050.  
  3051. OUTLINE[CP]
  3052. If NO>0
  3053.    For QA=0 To NO-1
  3054.       OBJPUT[OBX(QA),OBZ(QA),2]
  3055.    Next 
  3056. End If 
  3057. If NCPT>=0
  3058.    For QA=0 To NCPT
  3059.       CPTPUT[CPTX(QA),CPTY(QA),8-CPTUL(QA)*2]
  3060.    Next 
  3061. End If 
  3062. If NCPT>0
  3063.    For QA=0 To NCPT-1
  3064.       For QB=QA+1 To NCPT
  3065.          CONNECTED[QA,QB,P1]
  3066.       Next 
  3067.    Next 
  3068. End If 
  3069.  
  3070. PTSHOW[PLX,PLY,-1]
  3071.  
  3072. Return 
  3073. '
  3074. PICKBUTTON:
  3075. M=Mouse Click
  3076. If X>=16*6 Then Gosub MENCLICK : Return 
  3077. If M=0 Then Return 
  3078. '
  3079. Screen 0 : Ink 0 : Bar 32*6,0 To 640,48
  3080.  
  3081. If OP=4 Then Gosub TIDYDEFWALL
  3082. If OP=1 Then Gosub TIDYDEFZONE
  3083. If OP=9 or OP=12 or OP=15 or OP=18 Then Gosub TIDYDEFHEIGHT
  3084.  
  3085. If OP=11 Then Gosub TIDYPLACEPLAYER
  3086. If OP=7 Then Gosub TIDYDEFORDER
  3087. If OP=2 Then Gosub TIDYOBJ
  3088. If OP=14 Then Gosub TIDYDEFDOOR
  3089. If OP=17 Then Gosub TIDYDEFLIFT
  3090. If OP>=21 and OP<27 Then Gosub TIDYDEFGRAPH
  3091. 'If OP=21 Then Gosub TIDYPATHDEF 
  3092. 'If OP=22 Then Gosub TIDYPATHDEF 
  3093. '
  3094. If OP=36 Then Gosub TIDYDEFDOOR
  3095. 'If OP=37 Then Gosub TIDYDEFDOOR 
  3096.  
  3097. X=X/16 : Y=(Y-200)/16
  3098. X=X
  3099. If Y<0 Then Return 
  3100. If Y>47 Then Return 
  3101. SHINEBOX[OP,0]
  3102. OP=((EBX+X)*3)+Y : SHINEBOX[OP,3]
  3103. If OP=1 Then Gosub INITDEFZONE
  3104. If OP=7 Then Gosub INITDEFORDER
  3105. If OP=2 Then Gosub INITOBJ
  3106. If OP=14 Then Gosub INITDEFDOOR
  3107. If OP=17 Then Gosub INITDEFLIFT
  3108. If OP>20 and OP<27 Then Gosub INITDEFGRAPH
  3109. If OP=10 or OP=13 or OP=16 or OP=19 Then PBR=0 : PAN=0 : PDTA=0 : Gosub BRIGHTSLIDE
  3110. 'If OP=21 Then Gosub INITPATHDEF 
  3111.  
  3112. If OP=23 Then ZFG=0 : ZFGS=0 : OZFG=1 : ZFGS=1
  3113. If OP=22 Then ZWG=0 : LZWG=1 : ZWGC=0 : LWCHUNK=1
  3114. If OP=21 Then ZRG=0 : ZRGS=0 : OZRG=1 : ZRGS=1
  3115.  
  3116. If OP=24 Then ZRG=0 : ZRGS=0 : OZRG=1 : ZRGS=1
  3117. If OP=25 Then ZWG=0 : LZWG=1 : ZWGC=0 : LWCHUNK=1
  3118. If OP=26 Then ZFG=0 : ZFGS=0 : OZFG=1 : ZFGS=1
  3119.  
  3120. If OP=31 Then P1=-1 : P2=-1
  3121.  
  3122. If OP=36 Then Gosub INITDEFBACKSFX
  3123. 'If OP=37 Then Gosub ECHOSLIDE 
  3124.  
  3125. Paper 0 : Pen 1
  3126. S=Screen : Screen 0
  3127. Paper 0 : Pen 1
  3128. Locate TXP,0 : Print BUT$(OP)
  3129. Screen S
  3130. Return 
  3131. '
  3132. MENCLICK:
  3133.  
  3134. If OP=2 Then Gosub SETOBJPARAM
  3135.  
  3136. If OP=14 Then Gosub DEFDOORCOND
  3137. If OP=17 Then Gosub DEFLIFTCOND
  3138. If OP=36 Then Gosub SFXTOGGLE
  3139. 'If OP=21 Then Gosub PATHCOMPICK 
  3140. If OP=10 or OP=13 or OP=16 or OP=19 Then Gosub SETPOINTBRIGHT
  3141. 'If OP=37 Then Gosub SETECHOLEN
  3142. Return 
  3143.  
  3144. '
  3145. INITDEFBACKSFX:
  3146. S=Screen
  3147. Screen 0
  3148. Locate 40,1
  3149. Pen 1
  3150. Print "0123456789ABCDEF"
  3151. Locate 40,2
  3152. For B=0 To 15
  3153.    If Btst(B,BSFX)
  3154.       Print "*";
  3155.    Else 
  3156.       Print " ";
  3157.    End If 
  3158. Next 
  3159. Locate 40,3
  3160. Pen 1
  3161. Print "0123456789ABCDEF"
  3162. Locate 40,4
  3163. For B=0 To 15
  3164.    If Btst(B+16,BSFX)
  3165.       Print "*";
  3166.    Else 
  3167.       Print " ";
  3168.    End If 
  3169. Next 
  3170. Screen S
  3171.  
  3172. Return 
  3173.  
  3174. DEFBACKSFX:
  3175.  
  3176. Sprite 1,X Hard(2,X),Y Hard(2,Y),3
  3177. M=Mouse Click : If M=0 Then Return 
  3178. X=(X*MU)+XO : Y=(Y*MU)+YO
  3179. ZOSHO[CZ,4]
  3180. ZOGET[X,Y] : P=Param : If P>=0 Then CZ=P
  3181. ZOSHO[CZ,10]
  3182. If CZ<0 Then Return 
  3183. If M=1
  3184.    BSFX(CZ)=BSFX
  3185. End If 
  3186. If M=2
  3187.    BSFX=BSFX(CZ)
  3188.    Gosub INITDEFBACKSFX
  3189. End If 
  3190. Return 
  3191.  
  3192. DEFECHO:
  3193.  
  3194. Sprite 1,X Hard(2,X),Y Hard(2,Y),3
  3195. M=Mouse Click : If M=0 Then Return 
  3196. X=(X*MU)+XO : Y=(Y*MU)+YO
  3197. ZOSHO[CZ,4]
  3198. ZOGET[X,Y] : P=Param : If P>=0 Then CZ=P
  3199. ZOSHO[CZ,10]
  3200. If CZ<0 Then Return 
  3201. If M=1
  3202.    ECHO(CZ)=ECHOLEN
  3203. End If 
  3204. If M=2
  3205.    ECHOLEN=ECHO(CZ)
  3206.    Gosub ECHOSLIDE
  3207. End If 
  3208. Return 
  3209.  
  3210. SFXTOGGLE:
  3211.  
  3212. X=X-160
  3213. CX=X/4 : CY=(Y-200)/8
  3214. If M<>0
  3215.    If CX<16 and CX>=0
  3216.       
  3217.       If CY>2
  3218.          Add CX,16
  3219.       End If 
  3220.       
  3221.       Bchg CX,BSFX
  3222.       Gosub INITDEFBACKSFX
  3223.    End If 
  3224. End If 
  3225.  
  3226. Return 
  3227.  
  3228.  
  3229.  
  3230. SETOBJPARAM:
  3231. X=X-100
  3232. If X<0 Then Return 
  3233. If M=0 Then Return 
  3234. Gosub PARSET
  3235.  
  3236. Return 
  3237.  
  3238. PARSET:
  3239.  
  3240. CX=X/4 : CY=(Y-200)/8
  3241.  
  3242. If CY=1
  3243.    OT=1-OT
  3244.    Gosub INITOBJ
  3245. End If 
  3246.  
  3247. If CY=2
  3248.    If M=1
  3249.       If OT=0
  3250.          ALTO=(ALTO+1) mod 20
  3251.       Else 
  3252.          OBTO=(OBTO+1) mod 30
  3253.       End If 
  3254.    Else 
  3255.       If OT=0
  3256.          ALTO=(ALTO+19) mod 20
  3257.       Else 
  3258.          OBTO=(OBTO+29) mod 30
  3259.       End If 
  3260.    End If 
  3261. End If 
  3262.  
  3263. If CY=3
  3264.    CX=CX-12
  3265.    If CX>=0 and CX<16
  3266.       Bchg CX,DLOCKED
  3267.    Else 
  3268.       Locate TXP+30,3 : Input "Text: ";TXT
  3269.    End If 
  3270. End If 
  3271.  
  3272. If CY=4
  3273.    CX=CX-12
  3274.    If CX>=0 and CX<16
  3275.       Bchg CX,LLOCKED
  3276.    Else 
  3277.       If OT=0
  3278.          Locate TXP+30,4 : Input "Team: ";TEAM
  3279.       Else 
  3280.          Locate TXP+30,4 : Input "Start Frame: ";STRTANIM
  3281.       End If 
  3282.    End If 
  3283. End If 
  3284.  
  3285. If CY=5
  3286.    If CX<27
  3287.       PERMCALC=255-PERMCALC
  3288.    Else 
  3289.       UPORLO=255-UPORLO
  3290.    End If 
  3291. End If 
  3292.  
  3293. Gosub OBJPARAMSHOW
  3294.  
  3295. Return 
  3296.  
  3297. OBJPARAMSET:
  3298. Return 
  3299.  
  3300. OBJPARAMSHOW:
  3301.  
  3302. 'If OT=0 Then Gosub ALIENPARAM 
  3303. 'If OT=1 Then Gosub OBJPARAMPUT
  3304. '
  3305. 'Return  
  3306.  
  3307. 'ALIENPARAM: 
  3308.  
  3309. Screen 0
  3310. Paper 0 : Pen 1
  3311.  
  3312. Ink 0
  3313. Bar TXP*8,16 To 640,48
  3314.  
  3315. Locate TXP,2 : Print "Type: ";
  3316. If OT=0
  3317.    Print ALNAME$(ALTO);"            "
  3318. Else 
  3319.    Print OBNAME$(OBTO);"            "
  3320. End If 
  3321. Locate TXP,3 : Print "DOORS HELD: ";
  3322. For A=0 To 15
  3323.    If Btst(A,DLOCKED) Then Pen 1 Else Pen 2
  3324.    Print Chr$(A+65);
  3325. Next 
  3326. Pen 1
  3327. Locate TXP,4 : Print "LIFTS HELD: ";
  3328. For A=0 To 15
  3329.    If Btst(A,LLOCKED) Then Pen 1 Else Pen 2
  3330.    Print Chr$(A+65);
  3331. Next 
  3332. Locate TXP,5 : Pen 1
  3333. Print "Permanent Calculation: ";
  3334. Pen 4
  3335. If PERMCALC=0 Then Print "No " Else Print "Yes"
  3336.  
  3337. Locate TXP+27,5 : Pen 1
  3338. Print "Start in Up/Lo Rooms: ";
  3339. Pen 4
  3340. If UPORLO=0 Then Print "Lower" Else Print "Upper"
  3341.  
  3342. Locate TXP+30,4 : Pen 1
  3343. If OT=0
  3344.    Print "Team: ";
  3345.    Pen 4
  3346.    Print TEAM;"  ";
  3347. Else 
  3348.    Print "Start Frame: ";
  3349.    Pen 4
  3350.    Print STRTANIM;"  ";
  3351. End If 
  3352.  
  3353. Locate TXP+30,2 : Pen 1
  3354. If OT=0
  3355.    Print "Init Targ Cpt: ";
  3356.    Pen 4
  3357.    Print CONTPT;"  "
  3358. Else 
  3359.    Print "          ";
  3360. End If 
  3361.  
  3362.  
  3363. Locate TXP+30,3 : Pen 1
  3364. Print "Text:";
  3365. Pen 4
  3366. Print TXT;
  3367.  
  3368. Return 
  3369.  
  3370. OBJPARAMPUT:
  3371. Return 
  3372.  
  3373. '
  3374. SETPOINTBRIGHT:
  3375. X=X-160
  3376. If X<0 Then Return 
  3377. Y=Y-200
  3378. Y=Y/8
  3379. If X>81 Then Return 
  3380. If Y mod 2=0 Then Return 
  3381. If Mouse Key=0 Then Return 
  3382. If Y=1
  3383.    PBR=(X*40)/80
  3384.    Add PBR,-20
  3385. End If 
  3386. If Y=3
  3387.    PAN=(X*15)/80
  3388. End If 
  3389. If Y=5
  3390.    PDTA=(X*15)/80
  3391. End If 
  3392. Gosub BRIGHTSLIDE
  3393. Return 
  3394. '
  3395. SETECHOLEN:
  3396. X=X-160
  3397. If X<0 Then Return 
  3398. Y=Y-200
  3399. Y=Y/8
  3400. If X>81 Then Return 
  3401. If Y mod 2=0 Then Return 
  3402. If Mouse Key=0 Then Return 
  3403. If Y=1
  3404.    ECHOLEN=(X*50)/80
  3405.    Add PBR,-20
  3406. End If 
  3407. If Y=3
  3408.    ECHOVOL=(X*255)/80
  3409. End If 
  3410. 'If Y=5
  3411. '   PDTA=(X*15)/80 
  3412. 'End If  
  3413. Gosub ECHOSLIDE
  3414. Return 
  3415. '
  3416. BRIGHTSLIDE:
  3417. Screen 0
  3418. Hslider 320,8 To 480,15,40,PBR+20,1
  3419. Hslider 320,24 To 480,31,15,PAN,1
  3420. Hslider 320,40 To 480,47,15,PDTA,1
  3421. Locate 60,1 : Print "Bright ";PBR;"   "
  3422. Locate 60,3 : Print "Anim   ";PAN;"   "
  3423. Locate 60,5 : Print "Dist   ";PDTA;"   "
  3424. Return 
  3425. '
  3426. ECHOSLIDE:
  3427. Screen 0
  3428. Hslider 320,8 To 480,15,50,ECHOLEN,1
  3429. Hslider 320,24 To 480,31,255,ECHOVOL,1
  3430. 'Hslider 320,40 To 480,47,15,PDTA,1
  3431. Locate 60,1 : Print "Echo Time   ";ECHOLEN;"   "
  3432. Locate 60,3 : Print "Echo Volume ";ECHOVOL;"   "
  3433. 'Locate 60,5 : Print "Dist   ";PDTA;"   "
  3434. Return 
  3435. '
  3436. INITSWITCHDEF:
  3437. PSN
  3438. Return 
  3439. '  
  3440. Procedure PSN
  3441.    Screen 0
  3442.    Locate 40,0 : Print "Switch Number:";SWN
  3443.    Locate 40,1
  3444.    If SWITCHTYPE(SWN)=0
  3445.       Print "Switch"
  3446.    End If 
  3447.    If SWITCHTYPE(SWN)=1
  3448.       Print "Button"
  3449.    End If 
  3450.    
  3451. End Proc
  3452. '
  3453. PATHCOMPICK:
  3454. X=X/16
  3455. X=X-10
  3456. If X<0 Then Return 
  3457. Y=(Y-200)/16
  3458. If A$="z" and PCOM>0 Then Add PCOM,-1 : Gosub PMCOMSHOW : Gosub PFCOMSHOW
  3459. If A$="x" and PCOM<30 Then Add PCOM,1 : Gosub PMCOMSHOW : Gosub PFCOMSHOW
  3460. If M<>0
  3461.    If Y=0
  3462.       Goto SETPMCOM
  3463.    End If 
  3464.    If Y=3
  3465.       Goto SETPFCOM
  3466.    End If 
  3467. End If 
  3468. Return 
  3469. '
  3470. SETPMCOM:
  3471. PMCOM(PCOM,0)=X
  3472. Gosub PMCOMSHOW
  3473. Return 
  3474. '
  3475. SETPFCOM:
  3476. PFCOM(PCOM,0)=X
  3477. Gosub PFCOMSHOW
  3478. Return 
  3479. '
  3480. PMCOMSHOW:
  3481. S=PCOM-3
  3482. X=320
  3483. For A=0 To 6
  3484.    If S<0 or S>30
  3485.       Screen 0
  3486.       Ink 0 : Bar X+1,17 To X+30,30
  3487.       Ink 1 : Bar X+8,20 To X+24,28
  3488.    Else 
  3489.       F=320+PMCOM(S,0)*32
  3490.       Screen Copy 0,F+1,256-63,F+31,256-49 To 0,X+1,17
  3491.    End If 
  3492.    Add X,32
  3493.    Add S,1
  3494. Next 
  3495. Return 
  3496. '
  3497. PFCOMSHOW:
  3498. S=PCOM-3
  3499. X=320
  3500. For A=0 To 6
  3501.    If S<0 or S>30
  3502.       Screen 0
  3503.       Ink 0 : Bar X+1,33 To X+30,46
  3504.       Ink 1 : Bar X+8,36 To X+24,44
  3505.    Else 
  3506.       F=320+PFCOM(S,0)*32
  3507.       Screen Copy 0,F+1,256-15,F+31,255 To 0,X+1,33
  3508.    End If 
  3509.    Add X,32
  3510.    Add S,1
  3511. Next 
  3512. Return 
  3513. '
  3514. INITPATHDEF:
  3515. Screen Copy 0,0,256-64,320,256 To 0,320,0
  3516. Ink 3
  3517. Box 320+32*3,16 To 320+32*3+31,47
  3518. Return 
  3519. '
  3520. TIDYPATHDEF:
  3521. Screen 0
  3522. Ink 0
  3523. Bar 320,0 To 640,64
  3524. Return 
  3525. '
  3526. DEFDOORCOND:
  3527. If M=0 Then Return 
  3528. X=X-16*6
  3529. If X<0 Then Return 
  3530. Y=Y-200
  3531. Y=Y/8
  3532. Y=Y-2
  3533. 'If Y>=0 and Y<2 
  3534. '   X=X/8
  3535. '   Bchg X,DC(NDO) 
  3536. '   PDC[NDO] 
  3537. 'End If
  3538.  
  3539.  
  3540. If Y>=2
  3541.    If X>0 and X<80
  3542.       Add DRT(NDO),1
  3543.       If DR$(DRT(NDO))="" : DRT(NDO)=0 : End If 
  3544.       PDC[NDO]
  3545.    Else 
  3546.       Add DLT(NDO),1
  3547.       If DL$(DLT(NDO))="" : DLT(NDO)=0 : End If 
  3548.       PDC[NDO]
  3549.    End If 
  3550. Else 
  3551.    If Y=-1
  3552.       Locate 40,1 : Input "Stays open for (50=1sec):";OPS(NDO,2)
  3553.    Else 
  3554.       If Y=0
  3555.          If X<72
  3556.             Locate 24,2 : Input "Opening Speed:";OPS(NDO,0)
  3557.             PDC[NDO]
  3558.          Else 
  3559.             If X<144
  3560.                Locate 42,2 : Input "Opening SFX:";OPS(NDO,3)
  3561.                PDC[NDO]
  3562.             Else 
  3563.                Locate 60,2 : Input "Open SFX:";OPS(NDO,5)
  3564.                PDC[NDO]
  3565.             End If 
  3566.          End If 
  3567.       Else 
  3568.          If X<72
  3569.             Locate 24,3 : Input "Closing Speed:";OPS(NDO,1)
  3570.             PDC[NDO]
  3571.          Else 
  3572.             If X<144
  3573.                Locate 42,3 : Input "Closing SFX:";OPS(NDO,4)
  3574.                PDC[NDO]
  3575.             Else 
  3576.                Locate 60,3 : Input "Closed SFX:";OPS(NDO,6)
  3577.                PDC[NDO]
  3578.             End If 
  3579.          End If 
  3580.       End If 
  3581.    End If 
  3582. End If 
  3583. Return 
  3584. '
  3585. DEFLIFTCOND:
  3586. If M=0 Then Return 
  3587. X=X-16*6
  3588. If X<0 Then Return 
  3589. Y=Y-200
  3590. Y=Y/8
  3591. Y=Y-2
  3592. 'If Y>=0 and Y<2 
  3593. '   X=X/8
  3594. '   Bchg X,LIFTC(NL) 
  3595. '   PLC[NL]
  3596. 'End If  
  3597. If Y=0
  3598.    If X<72
  3599.       Locate 24,2 : Input "Raise Speed:";LOPS(NL,0)
  3600.       PLC[NL]
  3601.    Else 
  3602.       If X<144
  3603.          Locate 42,2 : Input "Raise SFX:";LOPS(NL,3)
  3604.          PLC[NL]
  3605.       Else 
  3606.          Locate 60,2 : Input "At Top SFX:";LOPS(NL,5)
  3607.          PLC[NL]
  3608.       End If 
  3609.    End If 
  3610. Else 
  3611.    If Y=1
  3612.       If X<72
  3613.          Locate 24,3 : Input "Lower Speed:";LOPS(NL,1)
  3614.          PLC[NL]
  3615.       Else 
  3616.          If X<144
  3617.             Locate 42,3 : Input "Lower SFX:";LOPS(NL,4)
  3618.             PLC[NL]
  3619.          Else 
  3620.             Locate 60,3 : Input "At Bot. SFX:";LOPS(NL,6)
  3621.             PLC[NL]
  3622.          End If 
  3623.       End If 
  3624.    End If 
  3625. End If 
  3626. If Y>=2
  3627.    If X>64 and X<144
  3628.       Add LRT(NL),1
  3629.       If LR$(LRT(NL))="" : LRT(NL)=0 : End If 
  3630.       PLC[NL]
  3631.    Else 
  3632.       Add LLT(NL),1
  3633.       If LL$(LLT(NL))="" : LLT(NL)=0 : End If 
  3634.       PLC[NL]
  3635.    End If 
  3636. End If 
  3637. Return 
  3638. '
  3639. INITOBJ:
  3640. TYPEOBJ[OT]
  3641. Gosub OBJPARAMSHOW
  3642. Return 
  3643. '
  3644. TIDYOBJ:
  3645. Screen 0 : Locate TXP,1 : Print "                        "
  3646. Return 
  3647. '
  3648. INITDEFDOOR:
  3649. ZOSHO[CZ,10]
  3650. Screen 0 : Locate TXP,1 : PND[ND]
  3651. Locate TXP,2
  3652. PDC[ND]
  3653. Return 
  3654. '
  3655. INITDEFLIFT:
  3656. ZOSHO[CZ,10]
  3657. Screen 0 : Locate TXP,1 : PNL[NL]
  3658. Locate TXP,2
  3659. PLC[NL]
  3660. Return 
  3661. '
  3662. TIDYDEFDOOR:
  3663. ZOSHO[CZ,4]
  3664. Screen 0 : Ink 0 : Bar TXP*8,8 To 640,80
  3665. Return 
  3666. TIDYDEFLIFT:
  3667. ZOSHO[CZ,4]
  3668. Screen 0 : Ink 0 : Bar TXP*8,8 To 640,80
  3669. Return 
  3670. '
  3671. DEFORDER:
  3672. Return 
  3673. '
  3674. TIDYDEFORDER:
  3675. Return 
  3676. '
  3677. INITDEFGRAPH:
  3678. ZOSHO[CZ,10]
  3679. Return 
  3680. '
  3681. TIDYDEFGRAPH:
  3682. ZOSHO[CZ,4]
  3683. Screen Hide 3
  3684. Screen Hide 4
  3685. Return 
  3686. '
  3687. TIDYDEFZONE:
  3688. ZOSHO[CZ,0]
  3689. ZP(CZ)=0
  3690. Return 
  3691. '
  3692. TIDYPLACEPLAYER:
  3693. ZOSHO[PZ,4]
  3694. Screen 0
  3695. Ink 0
  3696. Bar TXP*8,2*8 To 640,3*8
  3697. Return 
  3698. '
  3699. TIDYDEFHEIGHT:
  3700. ZOSHO[CZ,4]
  3701. Screen 0
  3702. Ink 0
  3703. Bar TXP*8,2*8 To 640,3*8
  3704. Return 
  3705. '
  3706. TIDYDEFBRIGHT:
  3707. ZOSHO[CZ,4]
  3708. Screen 0
  3709. Ink 0
  3710. Bar TXP*8,2*8 To 640,3*8
  3711. Return 
  3712. '
  3713. INITCONNECTCONT:
  3714. P1=-1 : P2=-1
  3715. Return 
  3716. '
  3717. TIDYDEFWALL:
  3718. ZOSHO[CZ,4]
  3719. Return 
  3720. '
  3721. TIDYDEFCORNER:
  3722. ZOSHO[CZ,4]
  3723. Return 
  3724. '
  3725. INITDEFZONE:
  3726. 6
  3727. CZ=-1
  3728. For A=0 To NZ-1
  3729.    If USED(A)=0 Then CZ=A : A=NZ
  3730. Next 
  3731. If CZ<0
  3732.    CZ=NZ : ZP(CZ)=0
  3733. End If 
  3734. Return 
  3735. '
  3736. MAPEDIT:
  3737. If OP=0 Then Gosub PTADD
  3738. If OP=6 Then Gosub PTMOVE
  3739.  
  3740. If OP=1 Then Gosub DEFZONE
  3741. If OP=4 Then Gosub DEFWALL
  3742. If OP=7 Then Gosub DEFORDER
  3743.  
  3744. If OP=15 Then Gosub DEFROOFHEIGHT
  3745. If OP=18 Then Gosub DEFHEIGHT
  3746. If OP=9 Then Gosub DEFUPPERROOFHEIGHT
  3747. If OP=12 Then Gosub DEFUPPERFLOORHEIGHT
  3748.  
  3749. 'If OP=8 Then Gosub DEFBRIGHT
  3750.  
  3751. If OP=21 Then Gosub DEFROOFGRAPH
  3752. If OP=22 Then Gosub DEFWALLGRAPH
  3753. If OP=23 Then Gosub DEFFLOORGRAPH
  3754. If OP=24 Then Gosub DEFUPPERROOFGRAPH
  3755. If OP=25 Then Gosub DEFUPPERWALLGRAPH
  3756. If OP=26 Then Gosub DEFUPPERFLOORGRAPH
  3757.  
  3758. If OP=2 Then Gosub OBJADD
  3759. If OP=5 Then Gosub OBJMOVE
  3760. If OP=8 Then Gosub OBJDEL
  3761.  
  3762. If OP=11 Then Gosub PLACEPLAYER
  3763. If OP=14 Then Gosub DEFDOOR
  3764. If OP=17 Then Gosub DEFLIFT
  3765. If OP=20 Then Gosub DEFTELEPORT
  3766.  
  3767. If OP=10 Then Gosub DEFUPPERROOFBRIGHT
  3768. If OP=13 Then Gosub DEFUPPERFLOORBRIGHT
  3769. If OP=16 Then Gosub DEFLOWERROOFBRIGHT
  3770. If OP=19 Then Gosub DEFLOWERFLOORBRIGHT
  3771.  
  3772. If OP=27 Then Gosub DEFWATERHEIGHT
  3773. If OP=30 Then Gosub DEFWATERANIM
  3774.  
  3775. If OP=33 Then Gosub DEFUPPERWALLBRIGHT
  3776. If OP=34 Then Gosub DEFLOWERWALLBRIGHT
  3777.  
  3778. If OP=28 Then Gosub PLACECONTPT
  3779. If OP=31 Then Gosub CONNECTCONT
  3780. If OP=29 Then Gosub CPTNEARTOZONE
  3781. If OP=32 Then Gosub CPTNEARTOUPPERZONE
  3782. If OP=35 Then Gosub CPTMOVE
  3783.  
  3784. If OP=36 Then Gosub DEFBACKSFX
  3785. 'If OP=37 Then Gosub DEFECHO 
  3786.  
  3787. Return 
  3788. '
  3789. DEFUPPERWALLBRIGHT:
  3790.  
  3791. Sprite 1,X Hard(2,X),Y Hard(2,Y),3
  3792. If A$="c"
  3793.    REQUEST["New wall brightness offset"] : P=Param
  3794.    UWB(CZ,CPP)=P
  3795. End If 
  3796.  
  3797. M=Mouse Click
  3798. If M=0 Then Return 
  3799. X=(X*MU)+XO : Y=(Y*MU)+YO
  3800. If M=2
  3801.    ZOGET[X,Y] : P=Param
  3802.    If P>-1
  3803.       If P<>CZ
  3804.          ZOSHO[CZ,4]
  3805.          CZ=P
  3806.          ZOSHO[CZ,10]
  3807.       End If 
  3808.    End If 
  3809. End If 
  3810.  
  3811. If M=1
  3812.    FINDNEARZONE[CZ,X,Y]
  3813.    P=Param
  3814.    For A=0 To ZP(CZ)-1
  3815.       If ZO(CZ,A)=P
  3816.          Screen 0
  3817.          Locate 40,1 : Print "Brightness Offset";UWB(CZ,A) : CPP=A
  3818.       End If 
  3819.    Next 
  3820. End If 
  3821.  
  3822. Return 
  3823.  
  3824. '
  3825. DEFLOWERWALLBRIGHT:
  3826. Sprite 1,X Hard(2,X),Y Hard(2,Y),3
  3827. If A$="c"
  3828.    REQUEST["New wall brightness offset"] : P=Param
  3829.    WB(CZ,CPP)=P
  3830. End If 
  3831.  
  3832. M=Mouse Click
  3833. If M=0 Then Return 
  3834. X=(X*MU)+XO : Y=(Y*MU)+YO
  3835. If M=2
  3836.    ZOGET[X,Y] : P=Param
  3837.    If P>-1
  3838.       If P<>CZ
  3839.          ZOSHO[CZ,4]
  3840.          CZ=P
  3841.          ZOSHO[CZ,10]
  3842.       End If 
  3843.    End If 
  3844. End If 
  3845.  
  3846. If M=1
  3847.    FINDNEARZONE[CZ,X,Y]
  3848.    P=Param
  3849.    For A=0 To ZP(CZ)-1
  3850.       If ZO(CZ,A)=P
  3851.          Screen 0
  3852.          Locate 40,1 : Print "Brightness Offset";WB(CZ,A) : CPP=A
  3853.       End If 
  3854.    Next 
  3855. End If 
  3856. Return 
  3857. '
  3858. Procedure PNWA[NWA]
  3859. End Proc
  3860. '
  3861. Procedure PWAC[NWA]
  3862. End Proc
  3863. '
  3864. DEFWATERANIM:
  3865. If A$="," and NWA>0 Then NWA=NWA-1 : PNWA[NWA] : PWAC[NWA]
  3866. If A$="." and NWA<20 Then NWA=NWA+1 : PNWA[NWA] : PWAC[NWA]
  3867. If A$="h" and ZWA(CZ)<>0
  3868.    '   Gosub TIDYDEFWA
  3869.    REQUEST["Height of water at top of motion: "]
  3870.    P=Param : WATH(NWA)=P
  3871.    '   Gosub INITDEFWA
  3872. End If 
  3873. If A$="t"
  3874.    WASP(NWA)=1 : PWAC[NWA]
  3875. End If 
  3876. If A$="b"
  3877.    WASP(NWA)=0 : PLC[NWA]
  3878. End If 
  3879. If A$="w" and CZ>-1
  3880.    If ZWA(CZ)=0
  3881.       ZWA(CZ)=NWA+1
  3882.       WABH(NWA)=ZH(CZ,2)
  3883.    Else 
  3884.       ZWA(CZ)=0
  3885.    End If 
  3886.    Gosub REDRAW
  3887. End If 
  3888. Sprite 1,X Hard(2,X),Y Hard(2,Y),3
  3889. M=Mouse Click
  3890. If M=0 Then Return 
  3891. X=(X*MU)+XO : Y=(Y*MU)+YO
  3892. If M=2
  3893.    ZOGET[X,Y] : P=Param
  3894.    If P>-1
  3895.       If P<>CZ
  3896.          ZOSHO[CZ,4]
  3897.          CZ=P
  3898.          ZOSHO[CZ,10]
  3899.       End If 
  3900.    End If 
  3901. End If 
  3902.  
  3903. Return 
  3904. '
  3905. DEFSWITCH:
  3906. If A$="z" and SWN>0 Then Add SWN,-1 : PSN
  3907. If A$="x" and SWN<7 Then Add SWN,1 : PSN
  3908. If A$="t" Then SWITCHTYPE(SWN)=1-SWITCHTYPE(SWN) : PSN
  3909. If A$="d" Then SWWL(SWN,0)=-1 : SWWL(SWN,1)=-1
  3910. M=Mouse Click
  3911. X=(X*MU)+XO : Y=(Y*MU)+YO
  3912. If M=2
  3913.    ZOSHO[CZ,4]
  3914.    ZOGET[X,Y]
  3915.    CZ=Param
  3916.    ZOSHO[CZ,10]
  3917. End If 
  3918. If M=1 and CZ>=0
  3919.    FINDNEARZONE[CZ,X,Y]
  3920.    P=Param
  3921.    For A=0 To ZP(CZ)
  3922.       If ZO(CZ,A)=P
  3923.          SWWL(SWN,0)=CZ : SWWL(SWN,1)=A : A=100
  3924.       End If 
  3925.    Next 
  3926.    Gosub REDRAW
  3927. End If 
  3928. Return 
  3929. '
  3930. DEFTELEPORT:
  3931. M=Mouse Click
  3932. X=(X*MU)+XO : Y=(Y*MU)+YO
  3933. If M=2
  3934.    ZOSHO[CZ,4]
  3935.    ZOGET[X,Y]
  3936.    CZ=Param
  3937.    ZOSHO[CZ,10]
  3938. End If 
  3939. If M=1 and CZ>=0
  3940.    ZOGET[X,Y] : P=Param
  3941.    If P>=0
  3942.       TELZO(CZ)=P : TELX(CZ)=X : TELZ(CZ)=Y
  3943.    Else 
  3944.       TELZO(CZ)=-1
  3945.    End If 
  3946. End If 
  3947. Return 
  3948.  
  3949. Return 
  3950. '  
  3951. Procedure WALLGET[Z,X,Y]
  3952.    P=-1
  3953.    D=650000
  3954.    If ZP(Z)>0
  3955.       For A=0 To ZP(Z)-1
  3956.          FX=PX(ZO(Z,A)) : FY=PY(ZO(Z,A))
  3957.          TX=PX(ZO(Z,A+1)) : TY=PY(ZO(Z,A+1))
  3958.          TX=TX-FX : TY=TY-FY
  3959.          PX=X-FX : PY=Y-FY
  3960.          TD=Abs(TY*PX-PY*TX)
  3961.          If TD<D
  3962.             D=TD : P=A
  3963.          End If 
  3964.       Next 
  3965.    End If 
  3966. End Proc[P]
  3967. '
  3968. DEFPCON:
  3969. If A$="z" and PCOM>0 Then Add PCOM,-1 : Gosub PMCOMSHOW : Gosub PFCOMSHOW
  3970. If A$="x" and PCOM<30 Then Add PCOM,1 : Gosub PMCOMSHOW : Gosub PFCOMSHOW
  3971. If A$="p" Then Gosub MAKEPATH
  3972. HIGHCOORDS[PMCOM(PCOM,1),PMCOM(PCOM,2),2,4]
  3973. HIGHCOORDS[PFCOM(PCOM,1),PFCOM(PCOM,2),3,21]
  3974. Sprite 1,X Hard(2,X),Y Hard(2,Y),3
  3975. M=Mouse Click
  3976. X=(X*MU)+XO : Y=(Y*MU)+YO
  3977. If M=1
  3978.    PMCOM(PCOM,1)=X
  3979.    PMCOM(PCOM,2)=Y
  3980. End If 
  3981. If M=2
  3982.    PFCOM(PCOM,1)=X
  3983.    PFCOM(PCOM,2)=Y
  3984. End If 
  3985. Return 
  3986. '  
  3987. MAKEPATH:
  3988. MP=Start(15)
  3989. PC=0
  3990. LX=PMCOM(0,1) : LZ=PMCOM(0,2)
  3991. While PMCOM(PC,0)<>-1
  3992.    NPC=PMCOM(PC+1,0)
  3993.    If PMCOM(PC,0)=0
  3994.       DMX(PC)=0
  3995.       DMZ(PC)=0
  3996.    End If 
  3997.    If PMCOM(PC,0)=1
  3998.       DMX(PC)=PMCOM(PC,1)-LX
  3999.       DMZ(PC)=PMCOM(PC,2)-LZ
  4000.    End If 
  4001.    If PMCOM(PC,0)=2
  4002.       If NPC=-1 or NPC=0 or NPC=3
  4003.          DMX(PC)=0
  4004.          DMZ(PC)=0
  4005.       End If 
  4006.       If NPC=1
  4007.          DMX(PC)=PMCOM(PC+1,1)-PMCOM(PC,1)
  4008.          DMZ(PC)=PMCOM(PC+1,2)-PMCOM(PC,2)
  4009.       End If 
  4010.       If NPC=2
  4011.          DMX(PC)=PMCOM(PC+1,1)-PMCOM(PC-1,1)
  4012.          DMZ(PC)=PMCOM(PC+1,2)-PMCOM(PC-1,2)
  4013.       End If 
  4014.    End If 
  4015.    If PMCOM(PC,0)=3
  4016.       DMX(PC)=0 : DMZ(PC)=0
  4017.       PMCOM(PC,1)=PMCOM(PC-1,1)
  4018.       PMCOM(PC,2)=PMCOM(PC-1,2)
  4019.    End If 
  4020.    LX=PMCOM(PC,1)
  4021.    LZ=PMCOM(PC,2)
  4022.    Add PC,1
  4023. Wend 
  4024. PC=0
  4025. XP=0 : ZP=0 : YP=0 : ANG=0
  4026. While PMCOM(PC,0)<>-1
  4027.    DX#=PFCOM(PC,1)-PMCOM(PC,1)
  4028.    DY#=PFCOM(PC,2)-PMCOM(PC,2)
  4029.    L#=Sqr(DX#^2+DY#^2)
  4030.    Degree 
  4031.    If Abs(DX#)<Abs(DY#)
  4032.       NANG#=Acos(DX#/L#)
  4033.       If DY#<0
  4034.          NANG#=360.0-NANG#
  4035.       End If 
  4036.    Else 
  4037.       NANG#=Acos(DY#/L#)
  4038.       If DX#>0
  4039.          NANG#=360.0-NANG#
  4040.       End If 
  4041.       NANG#=NANG#+90.0
  4042.    End If 
  4043.    NANG=(4096.0*(NANG#+90))/360.0
  4044.    NANG=(NANG) and 4095
  4045.    If PMCOM(PC,0)=0
  4046.       ' Place player here
  4047.       XP=PMCOM(PC,1)
  4048.       ZP=PMCOM(PC,2)
  4049.       If PFCOM(PC,0)=0 or PFCOM(PC,0)=1
  4050.          ANG=NANG
  4051.       End If 
  4052.       If PFCOM(PC,0)=2 or PFCOM(PC,0)=3
  4053.       End If 
  4054.       Doke MP,XP
  4055.       Doke MP+2,-ZP
  4056.       Doke MP+4,NANG
  4057.       Add MP,8
  4058.    End If 
  4059.    If PMCOM(PC,0)=1
  4060.       DX=PMCOM(PC,1)-XP
  4061.       DZ=PMCOM(PC,2)-ZP
  4062.       DANG=NANG-ANG
  4063.       If DANG>2048
  4064.          DANG=DANG-4096
  4065.       End If 
  4066.       If DANG<-2048
  4067.          DANG=4096-DANG
  4068.       End If 
  4069.       For A=0 To 63
  4070.          X=XP+(DX*A)/64
  4071.          Z=ZP+(DZ*A)/64
  4072.          Doke MP,X
  4073.          Doke MP+2,-Z
  4074.          Doke MP+4,ANG+(DANG*A)/64
  4075.          Add MP,8
  4076.       Next 
  4077.       ANG=NANG
  4078.       XP=PMCOM(PC,1)
  4079.       ZP=PMCOM(PC,2)
  4080.    End If 
  4081.    If PMCOM(PC,0)=2
  4082.       DANG=NANG-ANG
  4083.       If DANG>2048
  4084.          DANG=DANG-4096
  4085.       End If 
  4086.       If DANG<-2048
  4087.          DANG=DANG+4096
  4088.       End If 
  4089.       FX=DMX(PC-1) : FZ=DMZ(PC-1)
  4090.       DX=PMCOM(PC,1)-PMCOM(PC-1,1)
  4091.       DZ=PMCOM(PC,2)-PMCOM(PC-1,2)
  4092.       L=Sqr(DX^2+DZ^2)
  4093.       TX=DMX(PC)
  4094.       TZ=DMZ(PC)
  4095.       D=Sqr(TX^2+TZ^2)
  4096.       If D<>0
  4097.          TX=(TX*L)/D
  4098.          TZ=(TZ*L)/D
  4099.       End If 
  4100.       Degree 
  4101.       STX=PMCOM(PC-1,1)
  4102.       STZ=PMCOM(PC-1,2)
  4103.       ENX=PMCOM(PC,1)
  4104.       ENZ=PMCOM(PC,2)
  4105.       For A=0 To 63
  4106.          AN=(A*90)/64
  4107.          Wait Vbl 
  4108.          B=90-AN
  4109.          X1#=STX+(FX*Cos(B))/2.0
  4110.          Z1#=STZ+(FZ*Cos(B))/2.0
  4111.          X2#=ENX-(TX*Cos(AN))/2.0
  4112.          Z2#=ENZ-(TZ*Cos(AN))/2.0
  4113.          XM#=(X1#+X2#)/2
  4114.          ZM#=(Z1#+Z2#)/2
  4115.          C=(AN-45)*2
  4116.          X2#=X2#-XM#
  4117.          Z2#=Z2#-ZM#
  4118.          X=X1#+X2#*(1+Sin(C))
  4119.          Z=Z1#+Z2#*(1+Sin(C))
  4120.          Doke MP,X
  4121.          Doke MP+2,-Z
  4122.          Doke MP+4,ANG+DANG*(1.0+Sin(AN*2-90))/2
  4123.          Add MP,8
  4124.       Next 
  4125.       ANG=NANG
  4126.    End If 
  4127.    If PMCOM(PC,0)=3
  4128.       DANG=NANG-ANG
  4129.       If DANG>2048
  4130.          DANG=DANG-4096
  4131.       End If 
  4132.       If DANG<-2048
  4133.          DANG=4096-DANG
  4134.       End If 
  4135.       For A=0 To 63
  4136.          AN=(A*180)/64
  4137.          Doke MP,XP
  4138.          Doke MP+2,-ZP
  4139.          Doke MP+4,ANG+DANG*(1.0+Sin(AN-90))/2
  4140.          Add MP,8
  4141.       Next 
  4142.       ANG=NANG
  4143.    End If 
  4144.    Add PC,1
  4145. Wend 
  4146. Bsave "ab3:includes/testpath",Start(15) To MP
  4147. Return 
  4148. FX=TX : FY=TY
  4149. DX=X(N+1)-X(N)
  4150. DY=Y(N+1)-Y(N)
  4151. L=Sqr(DX^2+DY^2)
  4152. TX=X(N+2)-X(N)
  4153. TY=Y(N+2)-Y(N)
  4154. D=Sqr(TX^2+TY^2)
  4155. TX=(TX*L)/D
  4156. TY=(TY*L)/D
  4157. Degree 
  4158. For A=0 To 90
  4159.    Wait Vbl 
  4160.    B=90-A
  4161.    X1#=X(N)+(FX*Cos(90-A))/2.0
  4162.    Y1#=Y(N)+(FY*Cos(90-A))/2.0
  4163.    X2#=X(N+1)-(TX*Cos(A))/2.0
  4164.    Y2#=Y(N+1)-(TY*Cos(A))/2.0
  4165.    XM#=(X1#+X2#)/2
  4166.    YM#=(Y1#+Y2#)/2
  4167.    C=(A-45)*2
  4168.    X2#=X2#-XM#
  4169.    Y2#=Y2#-YM#
  4170.    X=X1#+X2#*(1+Sin(C))
  4171.    Y=Y1#+Y2#*(1+Sin(C))
  4172.    Plot X,Y,1
  4173.    X Mouse=X Hard(0,X)
  4174.    Y Mouse=Y Hard(0,Y)
  4175. Next 
  4176. Return 
  4177. '
  4178. CPTNEARTOZONE:
  4179. M=Mouse Click
  4180. X=(X*MU)+XO : Y=(Y*MU)+YO
  4181.  
  4182. If A$="A"
  4183.    
  4184.    N=Start(11)
  4185.    
  4186.    For A=0 To NZ-1
  4187.       For B=0 To ZP(A)-1
  4188.          ZZ(A,B)=-1
  4189.          For C=0 To NZ-1
  4190.             For D=0 To ZP(C)-1
  4191.                If ZO(A,B)=ZO(C,D+1) and ZO(A,B+1)=ZO(C,D)
  4192.                   'MYPRINT[" dc.l ZoneDat"+ Fn MY$(C)+",ZoneDat"+ Fn MY$(A)] 
  4193.                   ZZ(A,B)=C
  4194.                   D=ZP(C) : C=NZ
  4195.                End If 
  4196.             Next 
  4197.          Next 
  4198.       Next 
  4199.    Next 
  4200.    
  4201.    
  4202.    
  4203.    
  4204.    Screen 2
  4205.    For AZ=0 To NZ-1
  4206.       TX=0 : TY=0
  4207.       For B=0 To ZP(AZ)-1
  4208.          TX=TX+PX(ZO(AZ,B))
  4209.          TY=TY+PY(ZO(AZ,B))
  4210.       Next 
  4211.       TX=TX/ZP(AZ)
  4212.       TY=TY/ZP(AZ)
  4213.       VX=(TX-XO)/MU : VY=(TY-YO)/MU
  4214.       Extension   VX,VY,10
  4215.       
  4216.       DDD=100000000
  4217.       
  4218.       For A=0 To NCPT
  4219.          
  4220.          X1=CPTX(A) : X2=TX
  4221.          Y1=CPTY(A) : Y2=TY
  4222.          DX=X2-X1 : DY=Y2-Y1
  4223.          
  4224.          ND=DX^2+DY^2
  4225.          If ND<DDD
  4226.             
  4227.             Z1=CPTZ(A) : Z2=AZ
  4228.             If Z1<>Z2
  4229.                Repeat 
  4230.                   DL=DX*(PY(ZO(Z1,0))-Y1)-DY*(PX(ZO(Z1,0))-X1)
  4231.                   For C=1 To ZP(Z1)
  4232.                      ' find exit from this zone...
  4233.                      DR=DX*(PY(ZO(Z1,C))-Y1)-DY*(PX(ZO(Z1,C))-X1)
  4234.                      If DL<0 and DR>=0
  4235.                         T=C
  4236.                         C=100
  4237.                      End If 
  4238.                      DL=DR
  4239.                   Next 
  4240.                   
  4241.                   JOINCOORDS[PX(ZO(Z1,T)),PY(ZO(Z1,T)),PX(ZO(Z1,T-1)),PY(ZO(Z1,T-1)),15]
  4242.                   Z1=ZZ(Z1,T-1)
  4243.                   
  4244.                Until Z1=Z2 or Z1<0
  4245.                
  4246.             End If 
  4247.             If Z1=Z2
  4248.                PQ=A
  4249.                DDD=ND
  4250.             End If 
  4251.             
  4252.          End If 
  4253.       Next 
  4254.       
  4255.       ZCPT(AZ)=PQ
  4256.    Next 
  4257.    
  4258. End If 
  4259. If M=0 Then Return 
  4260. If M=2
  4261.    ZOGET[X,Y]
  4262.    P=Param
  4263.    If P>=0
  4264.       ZOSHO[CZ,4]
  4265.       CZ=P
  4266.       ZOSHO[CZ,10]
  4267.    End If 
  4268.    If ZCPT(CZ)>-1 and ZCPT(CZ)<=NCPT
  4269.       HIGHCONT[ZCPT(CZ)]
  4270.    End If 
  4271. End If 
  4272. If M=1
  4273.    FINDCONT[X,Y]
  4274.    P=Param
  4275.    If P>-1
  4276.       ZCPT(CZ)=P
  4277.       HIGHCONT[ZCPT(CZ)]
  4278.    End If 
  4279. End If 
  4280.  
  4281. Return 
  4282. '
  4283. CPTNEARTOUPPERZONE:
  4284. M=Mouse Click
  4285. If M=0 Then Return 
  4286. X=(X*MU)+XO : Y=(Y*MU)+YO
  4287. If M=2
  4288.    ZOGET[X,Y]
  4289.    P=Param
  4290.    If P>=0
  4291.       ZOSHO[CZ,4]
  4292.       CZ=P
  4293.       ZOSHO[CZ,10]
  4294.    End If 
  4295.    If UZCPT(CZ)>-1 and UZCPT(CZ)<=NCPT
  4296.       HIGHCONT[UZCPT(CZ)]
  4297.    End If 
  4298. End If 
  4299. If M=1
  4300.    FINDCONT[X,Y]
  4301.    P=Param
  4302.    If P>-1
  4303.       UZCPT(CZ)=P
  4304.       HIGHCONT[UZCPT(CZ)]
  4305.    End If 
  4306. End If 
  4307. Return 
  4308. '
  4309. PLACECONTPT:
  4310. Sprite 1,X Hard(2,X),Y Hard(2,Y),3
  4311. M=Mouse Click
  4312. If M=0 Then Return 
  4313. X=(X*MU)+XO : Y=(Y*MU)+YO
  4314. ZOGET[X,Y]
  4315. Z=Param
  4316. If Z<0 Then Return 
  4317. Add NCPT,1
  4318. CPTX(NCPT)=X
  4319. CPTY(NCPT)=Y
  4320. CPTZ(NCPT)=Z
  4321. If M=1 Then CPTUL(NCPT)=0 Else CPTUL(NCPT)=1
  4322. CPTPUT[X,Y,8-CPTUL(NCPT)*2]
  4323. Return 
  4324. '
  4325. CPTMOVE:
  4326. Sprite 1,X Hard(2,X),Y Hard(2,Y),3
  4327. M=Mouse Click
  4328. X=(X*MU)+XO : Y=(Y*MU)+YO
  4329. If A$="g"
  4330.    FINDCONT[X,Y] : P1=Param
  4331. End If 
  4332. If M=0 Then Return 
  4333. ZOGET[X,Y]
  4334. Z=Param
  4335. If Z<0 Then Return 
  4336. CPTX(P1)=X
  4337. CPTY(P1)=Y
  4338. CPTZ(P1)=Z
  4339. If M=1 Then CPTUL(P1)=0 Else CPTUL(P1)=1
  4340. Gosub REDRAW
  4341. Return 
  4342. '
  4343. CONNECTCONT:
  4344. Sprite 1,X Hard(2,X),Y Hard(2,Y),3
  4345. M=Mouse Click
  4346.  
  4347. If A$="V"
  4348.    Gosub AUTOLINK
  4349. End If 
  4350.  
  4351. If M=0 Then Return 
  4352. X=(X*MU)+XO : Y=(Y*MU)+YO
  4353. FINDCONT[X,Y]
  4354. If P1>=0 Then Goto 2345
  4355. P1=Param
  4356. For B=0 To NCPT-1
  4357.    If B<>P1 Then CONNECTED[P1,B,P1]
  4358. Next 
  4359. Return 
  4360. 2345
  4361. P2=Param
  4362. If P2=-1 Then Return 
  4363. If P1=P2 Then Return 
  4364. N=Start(11)
  4365. Q=Peek(N+P1*100+P2)
  4366. W=Peek(N+P2*100+P1)
  4367.  
  4368. 'Poke N+P2*100+P1,A  
  4369. If Q or W
  4370.    
  4371.    If Q=1 and W=1
  4372.       JOINCOORDS[CPTX(P1),CPTY(P1),CPTX(P2),CPTY(P2),0]
  4373.    End If 
  4374.    If Q=2 and W=2
  4375.       JOINCOORDS[CPTX(P1),CPTY(P1),CPTX(P2),CPTY(P2),0]
  4376.    End If 
  4377.    If Q=1 and W=2
  4378.       
  4379.       JOINCOORDS[CPTX(P1),CPTY(P1),CPTX(P2),CPTY(P2),0]
  4380.       XD=CPTX(P2)-CPTX(P1)
  4381.       YD=CPTY(P2)-CPTY(P1)
  4382.       LD=Sqr(XD^2+YD^2)
  4383.       XD=(XD*30)/LD
  4384.       YD=(YD*30)/LD
  4385.       
  4386.       
  4387.       JOINCOORDS[CPTX(P2)-XD,CPTY(P2)-YD,CPTX(P2)-XD*2-YD/2,CPTY(P2)-YD*2+XD/2,0]
  4388.       JOINCOORDS[CPTX(P2)-XD,CPTY(P2)-YD,CPTX(P2)-XD*2+YD/2,CPTY(P2)-YD*2-XD/2,0]
  4389.    End If 
  4390.    If Q=2 and W=1
  4391.       XD=CPTX(P2)-CPTX(P1)
  4392.       YD=CPTY(P2)-CPTY(P1)
  4393.       LD=Sqr(XD^2+YD^2)
  4394.       XD=(XD*30)/LD
  4395.       YD=(YD*30)/LD
  4396.       JOINCOORDS[CPTX(P1),CPTY(P1),CPTX(P2),CPTY(P2),0]
  4397.       
  4398.       JOINCOORDS[CPTX(P1)+XD,CPTY(P1)+YD,CPTX(P1)+XD*2-YD/2,CPTY(P1)+YD*2+XD/2,0]
  4399.       JOINCOORDS[CPTX(P1)+XD,CPTY(P1)+YD,CPTX(P1)+XD*2+YD/2,CPTY(P1)+YD*2-XD/2,0]
  4400.    End If 
  4401. End If 
  4402.  
  4403. If M=1
  4404.    If Peek(N+P1*100+P2)<>1
  4405.       Poke N+P1*100+P2,1
  4406.       If Peek(N+P2*100+P1)=0
  4407.          Poke N+P2*100+P1,2
  4408.       End If 
  4409.    Else 
  4410.       Poke N+P1*100+P2,0
  4411.       If Peek(N+P2*100+P1)=1
  4412.          Poke N+P1*100+P2,2
  4413.       Else 
  4414.          Poke N+P2*100+P1,0
  4415.       End If 
  4416.    End If 
  4417. Else 
  4418.    If Peek(N+P1*100+P2)=2
  4419.       Poke N+P1*100+P2,0
  4420.       Poke N+P2*100+P1,0
  4421.    Else 
  4422.       Poke N+P1*100+P2,2
  4423.       Poke N+P2*100+P1,2
  4424.    End If 
  4425. End If 
  4426.  
  4427. Q=Peek(N+P1*100+P2)
  4428. W=Peek(N+P2*100+P1)
  4429.  
  4430. 'Poke N+P2*100+P1,A  
  4431. If Q or W
  4432.    
  4433.    If Q=1 and W=1
  4434.       JOINCOORDS[CPTX(P1),CPTY(P1),CPTX(P2),CPTY(P2),12]
  4435.    End If 
  4436.    If Q=2 and W=2
  4437.       JOINCOORDS[CPTX(P1),CPTY(P1),CPTX(P2),CPTY(P2),15]
  4438.    End If 
  4439.    If Q=1 and W=2
  4440.       
  4441.       JOINCOORDS[CPTX(P1),CPTY(P1),CPTX(P2),CPTY(P2),13]
  4442.       XD=CPTX(P2)-CPTX(P1)
  4443.       YD=CPTY(P2)-CPTY(P1)
  4444.       LD=Sqr(XD^2+YD^2)
  4445.       XD=(XD*30)/LD
  4446.       YD=(YD*30)/LD
  4447.       
  4448.       
  4449.       JOINCOORDS[CPTX(P2)-XD,CPTY(P2)-YD,CPTX(P2)-XD*2-YD/2,CPTY(P2)-YD*2+XD/2,13]
  4450.       JOINCOORDS[CPTX(P2)-XD,CPTY(P2)-YD,CPTX(P2)-XD*2+YD/2,CPTY(P2)-YD*2-XD/2,13]
  4451.    End If 
  4452.    If Q=2 and W=1
  4453.       XD=CPTX(P2)-CPTX(P1)
  4454.       YD=CPTY(P2)-CPTY(P1)
  4455.       LD=Sqr(XD^2+YD^2)
  4456.       XD=(XD*30)/LD
  4457.       YD=(YD*30)/LD
  4458.       JOINCOORDS[CPTX(P1),CPTY(P1),CPTX(P2),CPTY(P2),13]
  4459.       
  4460.       JOINCOORDS[CPTX(P1)+XD,CPTY(P1)+YD,CPTX(P1)+XD*2-YD/2,CPTY(P1)+YD*2+XD/2,13]
  4461.       JOINCOORDS[CPTX(P1)+XD,CPTY(P1)+YD,CPTX(P1)+XD*2+YD/2,CPTY(P1)+YD*2-XD/2,13]
  4462.    End If 
  4463. End If 
  4464.  
  4465.  
  4466. P1=-1
  4467. P2=-1
  4468. Return 
  4469.  
  4470. '
  4471. AUTOLINK:
  4472. ' link up all control points visually
  4473.  
  4474. N=Start(11)
  4475. If NCPT>0
  4476.    
  4477.    For A=0 To NZ-1
  4478.       For B=0 To ZP(A)-1
  4479.          ZZ(A,B)=-1
  4480.          For C=0 To NZ-1
  4481.             For D=0 To ZP(C)-1
  4482.                If ZO(A,B)=ZO(C,D+1) and ZO(A,B+1)=ZO(C,D)
  4483.                   'MYPRINT[" dc.l ZoneDat"+ Fn MY$(C)+",ZoneDat"+ Fn MY$(A)] 
  4484.                   ZZ(A,B)=C
  4485.                   D=ZP(C) : C=NZ
  4486.                End If 
  4487.             Next 
  4488.          Next 
  4489.       Next 
  4490.    Next 
  4491.    
  4492.    
  4493.    For A=0 To NCPT-1
  4494.       For B=A+1 To NCPT
  4495.          
  4496.          If Peek(N+A*100+B)<>1 and Peek(N+B*100+A)<>1
  4497.             Poke N+A*100+B,0
  4498.             Poke N+B*100+A,0
  4499.             ' check for link...  
  4500.             
  4501.             PHYS=1
  4502.             
  4503.             X1=CPTX(A) : X2=CPTX(B)
  4504.             Y1=CPTY(A) : Y2=CPTY(B)
  4505.             DX=X2-X1 : DY=Y2-Y1
  4506.             Z1=CPTZ(A) : Z2=CPTZ(B)
  4507.             
  4508.             Repeat 
  4509.                DL=DX*(PY(ZO(Z1,0))-Y1)-DY*(PX(ZO(Z1,0))-X1)
  4510.                For C=1 To ZP(Z1)
  4511.                   ' find exit from this zone...
  4512.                   DR=DX*(PY(ZO(Z1,C))-Y1)-DY*(PX(ZO(Z1,C))-X1)
  4513.                   If DL<=0 and DR>=0
  4514.                      T=C
  4515.                      C=100
  4516.                   End If 
  4517.                   DL=DR
  4518.                Next 
  4519.                
  4520.                JOINCOORDS[PX(ZO(Z1,T)),PY(ZO(Z1,T)),PX(ZO(Z1,T-1)),PY(ZO(Z1,T-1)),15]
  4521.                Z1=ZZ(Z1,T-1)
  4522.                
  4523.             Until Z1=Z2 or Z1<0
  4524.             If Z1=Z2
  4525.                Poke N+A*100+B,2 : Poke(N+B*100+A),2
  4526.             End If 
  4527.          End If 
  4528.       Next 
  4529.    Next 
  4530.    Gosub REDRAW
  4531. End If 
  4532. Return 
  4533.  
  4534. '
  4535. Procedure FINDCONT[X,Y]
  4536.    P=-1
  4537.    If NCPT<0 Then Goto 342
  4538.    SD=100000000
  4539.    For A=0 To NCPT
  4540.       D=(CPTX(A)-X)^2+(CPTY(A)-Y)^2
  4541.       If D<SD Then P=A : SD=D
  4542.    Next 
  4543.    342
  4544. End Proc[P]
  4545. '
  4546. OBJDEL:
  4547. Sprite 1,X Hard(2,X),Y Hard(2,Y),3
  4548. M=Mouse Click
  4549. If M=0 Then Return 
  4550. X=(X*MU)+XO : Y=(Y*MU)+YO
  4551. FINDOBJ[X,Y]
  4552. P=Param
  4553. If P>=0
  4554.    If P<=(NO-1)
  4555.       S=Start(12)+P*32
  4556.       D=Start(12)+NO*32-32
  4557.       For A=0 To 31 : Poke S+A,Peek(D+A) : Next 
  4558.       OBJPUT[OBX(P),OBZ(P),0]
  4559.       OBX(P)=OBX(NO-1) : OBZ(P)=OBZ(NO-1)
  4560.    End If 
  4561.    NO=NO-1
  4562.    For A=0 To 31
  4563.       Poke Start(12)+NO*32+A,0
  4564.    Next 
  4565. End If 
  4566. Return 
  4567. '    
  4568. OBJMOVE:
  4569. Sprite 1,X Hard(2,X),Y Hard(2,Y),3
  4570. M=Mouse Click
  4571. If M=0 Then Return 
  4572. X=(X*MU)+XO : Y=(Y*MU)+YO
  4573.  
  4574. If M=2
  4575.    FINDOBJ[X,Y]
  4576.    COBJ=Param
  4577. End If 
  4578.  
  4579. If M=1
  4580.    If COBJ>=0
  4581.       ZOGET[X,Y] : P=Param
  4582.       OBX(COBJ)=X : OBZ(COBJ)=Y
  4583.       S=Start(12)+COBJ*32
  4584.       Doke S+6,P
  4585.       Gosub REDRAW
  4586.       ZOSHO[P,10]
  4587.    End If 
  4588. End If 
  4589. Return 
  4590.  
  4591.  
  4592. Procedure PND[ND]
  4593.    Screen 0
  4594.    Locate TXP,1 : Print "Door Num: ";Chr$(ND+65)
  4595. End Proc
  4596. '
  4597. Procedure PNL[NL]
  4598.    Screen 0
  4599.    Locate TXP,1 : Print "Lift Num: ";Chr$(NL+65)
  4600. End Proc
  4601. '
  4602. Procedure PDC[ND]
  4603.    Screen 0
  4604.    '   Screen Copy 0,0,16*6,320,16*7+2 To 0,320,8 
  4605.    '   Ink 0 : Bar 320,26 To 640,32 
  4606.    '   For A=0 To 11
  4607.    '      X=320+A*16
  4608.    '      Ink 1 
  4609.    '      If Btst(A,DC(ND)) 
  4610.    '         Bar X+1,27 To X+14,30
  4611.    '      Else  
  4612.    '         Box X+1,27 To X+14,30
  4613.    '      End If  
  4614.    '   Next 
  4615.    Locate 40,4 : Print "Raise Conditions"
  4616.    Locate 60,4 : Print "Lower Conditions"
  4617.    Locate 40,5 : Print DR$(DRT(ND))
  4618.    Locate 60,5 : Print DL$(DLT(ND))
  4619.    Locate 40,1 : Print "Stays open for (50=1sec):";OPS(ND,2)
  4620.    Locate 24,2 : Print "Opening Speed:";OPS(ND,0)
  4621.    Locate 42,2 : Print "Opening SFX:";OPS(ND,3)
  4622.    Locate 60,2 : Print "Open SFX:";OPS(ND,5)
  4623.    Locate 24,3 : Print "Closing Speed:";OPS(ND,1)
  4624.    Locate 42,3 : Print "Closing SFX:";OPS(ND,4)
  4625.    Locate 60,3 : Print "Closed SFX:";OPS(ND,6)
  4626. End Proc
  4627. Procedure PLC[NL]
  4628.    Screen 0
  4629.    '   Screen Copy 0,0,16*6,320,16*7+2 To 0,320,8 
  4630.    '   Ink 0 : Bar 320,26 To 640,32 
  4631.    '   For A=0 To 11
  4632.    '      X=320+A*16
  4633.    '      Ink 1 
  4634.    '      If Btst(A,LIFTC(NL))
  4635.    '         Bar X+1,27 To X+14,30
  4636.    '      Else  
  4637.    '         Box X+1,27 To X+14,30
  4638.    '      End If  
  4639.    '   Next 
  4640.    Locate 40,4 : Print "Raise Conditions"
  4641.    Locate 60,4 : Print "Lower Conditions"
  4642.    Locate 40,5 : Print LR$(LRT(NL))
  4643.    Locate 60,5 : Print LL$(LLT(NL))
  4644.    Locate 24,2 : Print "Raise Speed:";LOPS(NL,0)
  4645.    Locate 42,2 : Print "Raise SFX:";LOPS(NL,3)
  4646.    Locate 60,2 : Print "At Top SFX:";LOPS(NL,5)
  4647.    Locate 24,3 : Print "Lower Speed:";LOPS(NL,1)
  4648.    Locate 42,3 : Print "Lower SFX:";LOPS(NL,4)
  4649.    Locate 60,3 : Print "At Bot. SFX:";LOPS(NL,6)
  4650.    Locate 65,1 : Print "Start Pos"
  4651.    Locate 65,3
  4652.    If LSP(NL)=0
  4653.       Print "Bottom"
  4654.    Else 
  4655.       Print "Top   "
  4656.    End If 
  4657. End Proc
  4658. '
  4659. DEFDOOR:
  4660. If A$="," and NDO>0 Then NDO=NDO-1 : PND[NDO] : PDC[NDO]
  4661. If A$="." and NDO<16 Then NDO=NDO+1 : PND[NDO] : PDC[NDO]
  4662. If A$="<" and NDO>0
  4663.    NDO=NDO-1
  4664.    DRT(NDO)=DRT(NDO+1)
  4665.    DLT(NDO)=DLT(NDO+1)
  4666.    OPS(NDO,2)=OPS(NDO+1,2)
  4667.    OPS(NDO,0)=OPS(NDO+1,0)
  4668.    OPS(NDO,3)=OPS(NDO+1,3)
  4669.    OPS(NDO,5)=OPS(NDO+1,5)
  4670.    OPS(NDO,1)=OPS(NDO+1,1)
  4671.    OPS(NDO,4)=OPS(NDO+1,4)
  4672.    OPS(NDO,6)=OPS(NDO+1,6)
  4673.    PND[NDO] : PDC[NDO]
  4674. End If 
  4675. If A$=">" and NDO<16
  4676.    NDO=NDO+1
  4677.    
  4678.    DRT(NDO)=DRT(NDO-1)
  4679.    DLT(NDO)=DLT(NDO-1)
  4680.    OPS(NDO,2)=OPS(NDO-1,2)
  4681.    OPS(NDO,0)=OPS(NDO-1,0)
  4682.    OPS(NDO,3)=OPS(NDO-1,3)
  4683.    OPS(NDO,5)=OPS(NDO-1,5)
  4684.    OPS(NDO,1)=OPS(NDO-1,1)
  4685.    OPS(NDO,4)=OPS(NDO-1,4)
  4686.    OPS(NDO,6)=OPS(NDO-1,6)
  4687.    PND[NDO] : PDC[NDO]
  4688. End If 
  4689. If A$="r" and CZ>-1
  4690.    If ZD(CZ)=0
  4691.       ZD(CZ)=NDO+1
  4692.    Else 
  4693.       ZD(CZ)=0
  4694.    End If 
  4695.    Gosub REDRAW
  4696. End If 
  4697. Sprite 1,X Hard(2,X),Y Hard(2,Y),3
  4698. M=Mouse Click
  4699. If M=0 Then Return 
  4700. X=(X*MU)+XO : Y=(Y*MU)+YO
  4701. If M=2
  4702.    ZOGET[X,Y] : P=Param
  4703.    If P>-1
  4704.       If P<>CZ
  4705.          ZOSHO[CZ,4]
  4706.          CZ=P
  4707.          ZOSHO[CZ,10]
  4708.       End If 
  4709.    End If 
  4710. End If 
  4711. If M=1
  4712.    FINDNEARZONE[CZ,X,Y] : P=Param
  4713.    For A=0 To ZP(CZ)-1
  4714.       If ZO(CZ,A)=P
  4715.          If WT(CZ,A)=0
  4716.             WT(CZ,A)=2
  4717.             WD(CZ,A)=NDO+1
  4718.          Else 
  4719.             WT(CZ,A)=0
  4720.             WD(CZ,A)=0
  4721.          End If 
  4722.          ZOSHO[CZ,10]
  4723.       End If 
  4724.    Next 
  4725. End If 
  4726. Return 
  4727.  
  4728. DEFLIFT:
  4729. If A$="," and NL>0 Then NL=NL-1 : PNL[NL] : PLC[NL]
  4730. If A$="." and NL<16 Then NL=NL+1 : PNL[NL] : PLC[NL]
  4731.  
  4732. If A$=">" and NL<16
  4733.    NL=NL+1
  4734.    LRT(NL)=LRT(NL-1)
  4735.    LLT(NL)=LLT(NL-1)
  4736.    For AA=0 To 6 : LOPS(NL,AA)=LOPS(NL-1,AA)
  4737.    Next 
  4738.    
  4739.    LSP(NL)=LSP(NL-1)
  4740.    PNL[NL] : PLC[NL]
  4741. End If 
  4742.  
  4743. If A$="<" and NL>0
  4744.    NL=NL-1
  4745.    LRT(NL)=LRT(NL+1)
  4746.    LLT(NL)=LLT(NL+1)
  4747.    For AA=0 To 6 : LOPS(NL,AA)=LOPS(NL+1,AA)
  4748.    Next 
  4749.    
  4750.    LSP(NL)=LSP(NL+1)
  4751.    PNL[NL] : PLC[NL]
  4752. End If 
  4753.  
  4754. If A$="h" and ZLI(CZ)<>0
  4755.    Gosub TIDYDEFLIFT
  4756.    REQUEST["Height of lift at top: "]
  4757.    P=Param : ZH(CZ,3)=P
  4758.    Gosub INITDEFLIFT
  4759. End If 
  4760. If A$="t"
  4761.    LSP(NL)=1 : PLC[NL]
  4762. End If 
  4763. If A$="b"
  4764.    LSP(NL)=0 : PLC[NL]
  4765. End If 
  4766. If A$="f" and CZ>-1
  4767.    If ZLI(CZ)=0
  4768.       ZLI(CZ)=NL+1
  4769.    Else 
  4770.       ZLI(CZ)=0
  4771.    End If 
  4772.    Gosub REDRAW
  4773. End If 
  4774. Sprite 1,X Hard(2,X),Y Hard(2,Y),3
  4775. M=Mouse Click
  4776. If M=0 Then Return 
  4777. X=(X*MU)+XO : Y=(Y*MU)+YO
  4778. If M=2
  4779.    ZOGET[X,Y] : P=Param
  4780.    If P>-1
  4781.       If P<>CZ
  4782.          ZOSHO[CZ,4]
  4783.          CZ=P
  4784.          ZOSHO[CZ,10]
  4785.       End If 
  4786.    End If 
  4787. End If 
  4788. If M=1
  4789.    FINDNEARZONE[CZ,X,Y] : P=Param
  4790.    For A=0 To ZP(CZ)-1
  4791.       If ZO(CZ,A)=P
  4792.          If WT(CZ,A)=0
  4793.             WT(CZ,A)=5
  4794.             WLI(CZ,A)=NL+1
  4795.          Else 
  4796.             WT(CZ,A)=0
  4797.             WLI(CZ,A)=0
  4798.          End If 
  4799.          ZOSHO[CZ,10]
  4800.       End If 
  4801.    Next 
  4802. End If 
  4803. Return 
  4804. '
  4805. DEFWALLGRAPH:
  4806. Sprite 1,X Hard(2,X),Y Hard(2,Y),3
  4807. M=Mouse Key
  4808. Gosub WGPUT
  4809. X=(X*MU)+XO : Y=(Y*MU)+YO
  4810. If M=2
  4811.    ZOGET[X,Y] : P=Param
  4812.    If P>-1
  4813.       If P<>CZ
  4814.          ZOSHO[CZ,4]
  4815.          CZ=P
  4816.          ZOSHO[CZ,10]
  4817.       End If 
  4818.    End If 
  4819. End If 
  4820. If M=1
  4821.    FINDNEARZONE[CZ,X,Y] : P=Param
  4822.    For A=0 To ZP(CZ)-1
  4823.       If ZO(CZ,A)=P
  4824.          ZWG(CZ,A,3)=WGW
  4825.          ZWG(CZ,A,0)=ZWG : ZWG(CZ,A,1)=ZWGL : ZWG(CZ,A,2)=ZWGC : A=200
  4826.       End If 
  4827.    Next 
  4828. End If 
  4829.  
  4830. If A$="f"
  4831.    For A=0 To ZP(CZ)-1
  4832.       ZWG(CZ,A,3)=WGW
  4833.       ZWG(CZ,A,0)=ZWG : ZWG(CZ,A,1)=ZWGL : ZWG(CZ,A,2)=ZWGC
  4834.    Next 
  4835. End If 
  4836.  
  4837. If A$="g"
  4838.    FINDNEARZONE[CZ,X,Y] : P=Param
  4839.    For A=0 To ZP(CZ)-1
  4840.       If ZO(CZ,A)=P
  4841.          WGW=ZWG(CZ,A,3)
  4842.          ZWG=ZWG(CZ,A,0) : ZWGL=ZWG(CZ,A,1) : ZWGC=ZWG(CZ,A,2)
  4843.          A=200
  4844.       End If 
  4845.    Next 
  4846. End If 
  4847.  
  4848. Return 
  4849. '
  4850. WGPUT:
  4851. If A$="q" and WGW>2 Then WGW=WGW/2
  4852. If A$="w" and WGW<256 Then WGW=WGW*2
  4853. If A$="," and ZWG>0 Then Add ZWG,-1
  4854. If A$="." Then Add ZWG,1
  4855. If A$="<" and ZWGC>0
  4856.    Add ZWGC,-1
  4857.    ZWG=0
  4858. End If 
  4859. If A$=">"
  4860.    Add ZWGC,1
  4861.    ZWG=0
  4862. End If 
  4863. If A$="+"
  4864.    If ZWGL=0
  4865.       ZWGL=1
  4866.    Else 
  4867.       ZWGL=0
  4868.    End If 
  4869. End If 
  4870. If A$="-"
  4871.    If ZWGL=0
  4872.       ZWGL=2
  4873.    Else 
  4874.       ZWGL=0
  4875.    End If 
  4876. End If 
  4877. If ZWGL=1 : Sprite 6,X Hard(0,0),Y Hard(0,0),30 : End If 
  4878. If ZWGL=2 : Sprite 6,X Hard(0,0),Y Hard(0,0),31 : End If 
  4879. If ZWGL=0 : Sprite 6,0,0,31 : End If 
  4880.  
  4881. If ZWGC<>LWCHUNK-200
  4882.    LWCHUNK=ZWGC+200
  4883.    Bload WCHUNK$(ZWGC),Start(15)
  4884.    Screen 3 : LG=-200
  4885.    For A=0 To 31
  4886.       C=Peek(Start(15)+A*2)
  4887.       C=PALR(C)*256+PALG(C)*16+PALB(C)
  4888.       Colour A,C
  4889.    Next 
  4890. End If 
  4891.  
  4892. If ZWG<>(LG-100) or(LWGW-100)<>WGW or(A$="v")
  4893.    If A$="v"
  4894.       STQ=1
  4895.    Else 
  4896.       STQ=2
  4897.    End If 
  4898.    LG=ZWG+100
  4899.    LS=ZWG
  4900.    LWGW=WGW+100
  4901.    WGH=WCY(ZGWC)
  4902.    XL=LS
  4903.    S=Screen
  4904.    Screen 3 : Cls 0
  4905.    '   Screen Copy 6,XL*16,YL*WGH,XL*16+WGW-1,YL*WGH+WGH-1 To 3,0,0 
  4906.    TW=Start(15)+64*32
  4907.    ZIP=XL*16
  4908.    For A=ZIP To ZIP+WGW-1 Step STQ
  4909.       F=TW+(A/3)*WCY(ZWGC)*2
  4910.       If A mod 3=0
  4911.          For B=0 To Min(64,WCY(ZWGC))-1 Step STQ
  4912.             C=Deek(F+B+B)
  4913.             Extension   A-ZIP,B,C and 31
  4914.          Next 
  4915.       End If 
  4916.       If A mod 3=1
  4917.          For B=0 To Min(64,WCY(ZWGC))-1 Step STQ
  4918.             C=Deek(F+B+B)/32
  4919.             Extension   A-ZIP,B,C and 31
  4920.          Next 
  4921.       End If 
  4922.       If A mod 3=2
  4923.          For B=0 To Min(64,WCY(ZWGC))-1 Step STQ
  4924.             C=Deek(F+B+B)/1024
  4925.             Extension   A-ZIP,B,C and 31
  4926.          Next 
  4927.       End If 
  4928.    Next 
  4929.    Screen S
  4930. End If 
  4931. Screen To Front 3
  4932. Screen Display 3,,200+40,,64
  4933. Screen Show 3
  4934. Return 
  4935. '
  4936. DEFFLOORGRAPH:
  4937. Sprite 1,X Hard(2,X),Y Hard(2,Y),3
  4938. M=Mouse Key
  4939. X=(X*MU)+XO : Y=(Y*MU)+YO
  4940. Gosub FGPUT
  4941. OZFG=ZFG : FBO=FB
  4942. If M=1
  4943.    ZOGET[X,Y] : P=Param
  4944.    If P>-1
  4945.       ZOSHO[CZ,4]
  4946.       CZ=P
  4947.       ZOSHO[CZ,10]
  4948.       ZFG(CZ,0)=ZFG : FB(CZ)=FB
  4949.       ZFG(CZ,1)=ZFGS
  4950.    End If 
  4951. End If 
  4952. If M=2
  4953.    ZOGET[X,Y] : P=Param
  4954.    If P>-1
  4955.       ZOSHO[CZ,4]
  4956.       CZ=P
  4957.       ZOSHO[CZ,10]
  4958.       ZFG=ZFG(CZ,0) : FB=FB(CZ)
  4959.       ZFGS=ZFG(CZ,1)
  4960.    End If 
  4961. End If 
  4962. Return 
  4963. '
  4964. DEFROOFGRAPH:
  4965. Sprite 1,X Hard(2,X),Y Hard(2,Y),3
  4966. M=Mouse Key
  4967. X=(X*MU)+XO : Y=(Y*MU)+YO
  4968. Gosub RGPUT
  4969. OZRG=ZRG : RBO=RB
  4970. If M=1
  4971.    ZOGET[X,Y] : P=Param
  4972.    If P>-1
  4973.       ZOSHO[CZ,4]
  4974.       CZ=P
  4975.       ZOSHO[CZ,10]
  4976.       ZRG(CZ,0)=ZRG : RB(CZ)=RB
  4977.       ZRG(CZ,1)=ZRGS
  4978.    End If 
  4979. End If 
  4980. If M=2
  4981.    ZOGET[X,Y] : P=Param
  4982.    If P>-1
  4983.       ZOSHO[CZ,4]
  4984.       CZ=P
  4985.       ZOSHO[CZ,10]
  4986.       ZRG=ZRG(CZ,0) : RB=RB(CZ)
  4987.       ZRGS=ZRG(CZ,1)
  4988.    End If 
  4989. End If 
  4990. Return 
  4991. '
  4992.  
  4993.  
  4994. DEFUPPERWALLGRAPH:
  4995. Sprite 1,X Hard(2,X),Y Hard(2,Y),3
  4996. M=Mouse Key
  4997. Gosub UWGPUT
  4998. If M=0 and A$<>"g" Then Return 
  4999. X=(X*MU)+XO : Y=(Y*MU)+YO
  5000. If M=2
  5001.    ZOGET[X,Y] : P=Param
  5002.    If P>-1
  5003.       If P<>CZ
  5004.          ZOSHO[CZ,4]
  5005.          CZ=P
  5006.          ZOSHO[CZ,10]
  5007.       End If 
  5008.    End If 
  5009. End If 
  5010. If M=1
  5011.    FINDNEARZONE[CZ,X,Y] : P=Param
  5012.    For A=0 To ZP(CZ)-1
  5013.       If ZO(CZ,A)=P
  5014.          UZWG(CZ,A,3)=WGW
  5015.          UZWG(CZ,A,0)=ZWG : UZWG(CZ,A,1)=ZWGL : UZWG(CZ,A,2)=ZWGC : A=200
  5016.       End If 
  5017.    Next 
  5018. End If 
  5019.  
  5020. If A$="g"
  5021.    FINDNEARZONE[CZ,X,Y] : P=Param
  5022.    For A=0 To ZP(CZ)-1
  5023.       If ZO(CZ,A)=P
  5024.          WGW=UZWG(CZ,A,3)
  5025.          ZWG=UZWG(CZ,A,0) : ZWGL=UZWG(CZ,A,1) : ZWGC=UZWG(CZ,A,2) : A=200
  5026.       End If 
  5027.    Next 
  5028. End If 
  5029.  
  5030. Return 
  5031. '
  5032. UWGPUT:
  5033. If A$="q" and WGW>2 Then WGW=WGW/2
  5034. If A$="w" and WGW<256 Then WGW=WGW*2
  5035. If A$="," and ZWG>0 Then Add ZWG,-1
  5036. If A$="." Then Add ZWG,1
  5037. If A$="<" and ZWGC>0
  5038.    Add ZWGC,-1
  5039.    ZWG=0
  5040. End If 
  5041. If A$=">"
  5042.    Add ZWGC,1
  5043.    ZWG=0
  5044. End If 
  5045. If A$="+"
  5046.    If ZWGL=0
  5047.       ZWGL=1
  5048.    Else 
  5049.       ZWGL=0
  5050.    End If 
  5051. End If 
  5052. If A$="-"
  5053.    If ZWGL=0
  5054.       ZWGL=2
  5055.    Else 
  5056.       ZWGL=0
  5057.    End If 
  5058. End If 
  5059. If ZWGL=1 : Sprite 6,X Hard(0,0),Y Hard(0,0),30 : End If 
  5060. If ZWGL=2 : Sprite 6,X Hard(0,0),Y Hard(0,0),31 : End If 
  5061. If ZWGL=0 : Sprite 6,0,0,31 : End If 
  5062.  
  5063. If ZWGC<>LWCHUNK-200
  5064.    LWCHUNK=ZWGC+200
  5065.    Bload WCHUNK$(ZWGC),Start(15)
  5066.    Screen 3 : LG=-200
  5067.    For A=0 To 31
  5068.       C=Peek(Start(15)+A*2)
  5069.       C=PALR(C)*256+PALG(C)*16+PALB(C)
  5070.       Colour A,C
  5071.    Next 
  5072. End If 
  5073.  
  5074. If ZWG<>(LG-100) or(LWGW-100)<>WGW or(A$="v")
  5075.    If A$="v"
  5076.       STQ=1
  5077.    Else 
  5078.       STQ=2
  5079.    End If 
  5080.    LG=ZWG+100
  5081.    LS=ZWG
  5082.    LWGW=WGW+100
  5083.    WGH=WCY(ZGWC)
  5084.    XL=LS
  5085.    YL=LS/20
  5086.    S=Screen
  5087.    Screen 3 : Cls 0
  5088.    '   Screen Copy 6,XL*16,YL*WGH,XL*16+WGW-1,YL*WGH+WGH-1 To 3,0,0 
  5089.    TW=Start(15)+64*32
  5090.    ZIP=XL*16
  5091.    For A=ZIP To ZIP+WGW-1 Step STQ
  5092.       F=TW+(A/3)*WCY(ZWGC)*2
  5093.       If A mod 3=0
  5094.          For B=0 To Min(64,WCY(ZWGC))-1 Step STQ
  5095.             C=Deek(F+B+B)
  5096.             Extension   A-ZIP,B,C and 31
  5097.          Next 
  5098.       End If 
  5099.       If A mod 3=1
  5100.          For B=0 To Min(64,WCY(ZWGC))-1 Step STQ
  5101.             C=Deek(F+B+B)/32
  5102.             Extension   A-ZIP,B,C and 31
  5103.          Next 
  5104.       End If 
  5105.       If A mod 3=2
  5106.          For B=0 To Min(64,WCY(ZWGC))-1 Step STQ
  5107.             C=Deek(F+B+B)/1024
  5108.             Extension   A-ZIP,B,C and 31
  5109.          Next 
  5110.       End If 
  5111.    Next 
  5112.    Screen S
  5113. End If 
  5114.  
  5115.  
  5116. Screen To Front 3
  5117. Screen Display 3,,200+40,,64
  5118. Screen Show 3
  5119. Return 
  5120. '
  5121.  
  5122.  
  5123.  
  5124. '
  5125. DEFUPPERFLOORGRAPH:
  5126. Sprite 1,X Hard(2,X),Y Hard(2,Y),3
  5127. M=Mouse Key
  5128. X=(X*MU)+XO : Y=(Y*MU)+YO
  5129. Gosub FGPUT
  5130. OZFG=ZFG : FBO=FB
  5131. If M=1
  5132.    ZOGET[X,Y] : P=Param
  5133.    If P>-1
  5134.       ZOSHO[CZ,4]
  5135.       CZ=P
  5136.       ZOSHO[CZ,10]
  5137.       UZFG(CZ,0)=ZFG : FB(CZ)=FB
  5138.       UZFG(CZ,1)=ZFGS
  5139.    End If 
  5140. End If 
  5141. If M=2
  5142.    ZOGET[X,Y] : P=Param
  5143.    If P>-1
  5144.       ZOSHO[CZ,4]
  5145.       CZ=P
  5146.       ZOSHO[CZ,10]
  5147.       ZFG=UZFG(CZ,0) : FB=FB(CZ)
  5148.       ZFGS=UZFG(CZ,1)
  5149.    End If 
  5150. End If 
  5151. Return 
  5152. '
  5153. DEFUPPERROOFGRAPH:
  5154. Sprite 1,X Hard(2,X),Y Hard(2,Y),3
  5155. M=Mouse Key
  5156. X=(X*MU)+XO : Y=(Y*MU)+YO
  5157. Gosub RGPUT
  5158. OZRG=ZRG : RBO=RB
  5159. If M=1
  5160.    ZOGET[X,Y] : P=Param
  5161.    If P>-1
  5162.       ZOSHO[CZ,4]
  5163.       CZ=P
  5164.       ZOSHO[CZ,10]
  5165.       UZRG(CZ,0)=ZRG : RB(CZ)=RB
  5166.       UZRG(CZ,1)=ZRGS
  5167.    End If 
  5168. End If 
  5169. If M=2
  5170.    ZOGET[X,Y] : P=Param
  5171.    If P>-1
  5172.       ZOSHO[CZ,4]
  5173.       CZ=P
  5174.       ZOSHO[CZ,10]
  5175.       ZRG=UZRG(CZ,0) : RB=RB(CZ)
  5176.       ZRGS=UZRG(CZ,1)
  5177.    End If 
  5178. End If 
  5179. Return 
  5180. '
  5181. RGDAT:
  5182. Screen Hide 3
  5183. Screen Show 4 : Screen To Front 4
  5184. Return 
  5185. '
  5186. RGPUT:
  5187. If A$="," Then ZRG=(ZRG+16) mod 17
  5188. If A$="." Then ZRG=(ZRG+1) mod 17
  5189. If A$="q" and ZRGS>-5 Then ZRGS=ZRGS-1
  5190. If A$="w" and ZRGS<2 Then ZRGS=ZRGS+1
  5191. If A$="b" Then RB=1-RB
  5192. If RB Then Sprite 6,X Hard(2,0),Y Hard(2,0),20 Else Sprite Off 6
  5193. If(OZRG<>ZRG) or RB<>RBO or(OZRGS<>ZRGS)
  5194.    OZRG=ZRG : RBO=RB : OZRGS=ZRGS
  5195.    If ZRG=16
  5196.       Screen Open 3,320,64,32,Lowres
  5197.       Locate 0,3 : Print "NONE (SKY)"
  5198.    Else 
  5199.       If RB=0
  5200.          Screen Open 3,320,64,64,Lowres
  5201.          Curs Off : Flash Off : Cls 0
  5202.          Paste Icon 0,0,ZRG+17
  5203.          MP=Start(10)+1024+ZRG*64
  5204.          For BQ=0 To 31 : Colour BQ,Deek(MP) : Add MP,2 : Next 
  5205.          Sprite Off 6
  5206.       Else 
  5207.          F$="ab3:graphics/floors/bump."+ Fn MY$(ZRG+1)
  5208.          Load Iff F$,3
  5209.          Sprite 6,X Hard(2,0),Y Hard(2,0),20
  5210.       End If 
  5211.    End If 
  5212.    Screen 3 : Locate 8,0 : Print ZRGS;"   "
  5213. End If 
  5214. Screen To Front 3
  5215. Screen Display 3,,200+40,,64
  5216. Screen Show 3
  5217. Return 
  5218. '
  5219. FGPUT:
  5220. If A$="," Then ZFG=(ZFG-1) and 15
  5221. If A$="." Then ZFG=(ZFG+1) and 15
  5222. If A$="b" Then FB=1-FB
  5223. If A$="q" and ZFGS>-5 Then ZFGS=ZFGS-1
  5224. If A$="w" and ZFGS<2 Then ZFGS=ZFGS+1
  5225. If(ZFG<>OZFG) or OFB<>FB or(OZFGS<>ZFGS)
  5226.    OZFG=ZFG : OFB=FB : OZFGS=ZFGS
  5227.    If FB(CZ)=0
  5228.       Screen Open 3,320,64,64,Lowres
  5229.       Curs Off : Flash Off : Cls 0
  5230.       Paste Icon 0,0,ZFG+17
  5231.       MP=Start(10)+1024+ZFG*64
  5232.       For BQ=0 To 31 : Colour BQ,Deek(MP) : Add MP,2 : Next 
  5233.       Sprite Off 6
  5234.    Else 
  5235.       F$="ab3:graphics/floors/bump."+ Fn MY$(ZFG+1)
  5236.       Load Iff F$,3
  5237.       Sprite 6,X Hard(2,0),Y Hard(2,0),20
  5238.    End If 
  5239.    Screen 3 : Locate 8,0 : Print ZFGS;"   "
  5240. End If 
  5241. Screen To Front 3
  5242. Screen Display 3,,200+40,,64
  5243. Screen Show 3
  5244. Return 
  5245. '
  5246. OBJADD:
  5247. Sprite 1,X Hard(2,X),Y Hard(2,Y),3
  5248. If A$="," and OT>0 Then OT=OT-1 : TYPEOBJ[OT] : Gosub OBJPARAMSHOW
  5249. If A$="." and OT<1 Then OT=OT+1 : TYPEOBJ[OT] : Gosub OBJPARAMSHOW
  5250.  
  5251. If A$="g"
  5252.    X=(X*MU)+XO : Y=(Y*MU)+YO
  5253.    DI=100000000
  5254.    For A=0 To NO-1
  5255.       DX=OBX(A)-X
  5256.       DY=OBZ(A)-Y
  5257.       D=DX^2+DY^2
  5258.       If D<DI
  5259.          DI=D : T=A
  5260.       End If 
  5261.    Next 
  5262.    
  5263.    
  5264.    S=Start(12)+T*32
  5265.    OT=Peek(S)
  5266.    
  5267.    If OT=0
  5268.       
  5269.       ALTO=Peek(S+2)
  5270.       DLOCKED=Deek(S+4)
  5271.       LLOCKED=Deek(S+8)
  5272.       UPORLO=Peek(S+10)
  5273.       PERMCALC=Peek(S+11)
  5274.       TEAM=Peek(S+12)
  5275.       If TEAM>32767
  5276.          TEAM=TEAM-65536
  5277.       End If 
  5278.       TXT=Deek(S+14)
  5279.       If TXT>32767
  5280.          TXT=TXT-65536
  5281.       End If 
  5282.       CONTPT=Deek(S+16)
  5283.       Gosub OBJPARAMSHOW
  5284.    Else 
  5285.       OBTO=Peek(S+2)
  5286.       DLOCKED=Deek(S+4)
  5287.       LLOCKED=Deek(S+8)
  5288.       UPORLO=Peek(S+10)
  5289.       PERMCALC=Peek(S+11)
  5290.       TXT=Deek(S+14)
  5291.       If TXT>32767
  5292.          TXT=TXT-65536
  5293.       End If 
  5294.       STRTANIM=Deek(S+18)
  5295.       Gosub OBJPARAMSHOW
  5296.    End If 
  5297. End If 
  5298.  
  5299. If A$="p"
  5300.    X=(X*MU)+XO : Y=(Y*MU)+YO
  5301.    DI=100000000
  5302.    For A=0 To NO-1
  5303.       DX=OBX(A)-X
  5304.       DY=OBZ(A)-Y
  5305.       D=DX^2+DY^2
  5306.       If D<DI
  5307.          DI=D : T=A
  5308.       End If 
  5309.    Next 
  5310.    
  5311.    
  5312.    S=Start(12)+T*32
  5313.    OT=Peek(S)
  5314.    
  5315.    If OT=0
  5316.       Poke S,0
  5317.       Poke S+2,ALTO
  5318.       Doke S+4,DLOCKED
  5319.       Doke S+8,LLOCKED
  5320.       Poke S+10,UPORLO
  5321.       Poke S+11,PERMCALC
  5322.       Poke S+12,TEAM
  5323.       Doke S+14,TXT
  5324.       Doke S+16,CONTPT
  5325.    Else 
  5326.       Poke S,1
  5327.       Poke S+2,OBTO
  5328.       Doke S+4,DLOCKED
  5329.       Doke S+8,LLOCKED
  5330.       Poke S+10,UPORLO
  5331.       Poke S+11,PERMCALC
  5332.       Doke S+14,TXT
  5333.       Doke S+18,STRTANIM
  5334.    End If 
  5335. End If 
  5336.  
  5337.  
  5338. M=Mouse Click
  5339. If M=0 Then Return 
  5340. If M=1
  5341.    X=(X*MU)+XO : Y=(Y*MU)+YO
  5342.    ZOSHO[CZ,4]
  5343.    ZOGET[X,Y]
  5344.    P=Param
  5345.    If P<0 : Return : End If 
  5346.    CZ=P
  5347.    ZOSHO[CZ,10]
  5348.    If OT=0 : Gosub ALIENPUT : End If 
  5349.    If OT=1 : Gosub THINGPUT : End If 
  5350.    'If OT=0 Then Gosub ENEMYPUT 
  5351.    'If OT=1 Then Gosub MEDIPUT
  5352.    'If OT=3 Then Gosub BIGGUNPUT
  5353.    'If OT=4 Then Gosub KEYPUT 
  5354.    'If OT=5 Then Gosub FLHAPUT
  5355.    'If OT=6 Then Gosub MARINEPUT
  5356.    'If OT=7 Then Gosub GLASSPUT 
  5357.    'If OT=2 Then Gosub AMMOPUT
  5358.    'If OT=8 Then Gosub BBARRELPUT 
  5359.    'If OT=9 Then Gosub DDECOPUT 
  5360.    'REQUEST["Lower(=0) or Upper(=1) level: "] 
  5361.    'P=Param 
  5362.    'REQUEST["Permanent Calculation (1=yes): "]
  5363.    'P2=Param
  5364.    'S=Start(12)+(NO-1)*32 
  5365.    'If P=0 Then Poke S+10,0 Else Poke S+10,-1 
  5366.    'If P2=0 Then Poke S+11,0 Else Poke S+11,-1
  5367.    OBJPUT[X,Y,2]
  5368. Else 
  5369.    X=(X*MU)+XO : Y=(Y*MU)+YO
  5370.    FINDCONT[X,Y]
  5371.    CONTPT=Param
  5372.    Gosub OBJPARAMSHOW
  5373. End If 
  5374. Return 
  5375.  
  5376. '
  5377. ALIENPUT:
  5378. S=Start(12)+NO*32
  5379. Poke S,0
  5380. Poke S+2,ALTO
  5381. Doke S+4,DLOCKED
  5382. Doke S+6,CZ
  5383. Doke S+8,LLOCKED
  5384. Poke S+10,UPORLO
  5385. Poke S+11,PERMCALC
  5386. Poke S+12,TEAM
  5387. Doke S+14,TXT
  5388. Doke S+16,CONTPT
  5389. OBX(NO)=X : OBZ(NO)=Y
  5390. Add NO,1
  5391. Return 
  5392.  
  5393. THINGPUT:
  5394. S=Start(12)+NO*32
  5395. Poke S,1
  5396. Poke S+2,OBTO
  5397. Doke S+4,DLOCKED
  5398. Doke S+6,CZ
  5399. Doke S+8,LLOCKED
  5400. Poke S+10,UPORLO
  5401. Poke S+11,PERMCALC
  5402. Doke S+14,TXT
  5403. Doke S+18,STRTANIM
  5404.  
  5405. If LOCKTOWALL(OBTO)<>0
  5406.    D=100000000 : T=-1
  5407.    For A=0 To ZP(CZ)-1
  5408.       FX=PX(ZO(CZ,A)) : FY=PY(ZO(CZ,A))
  5409.       TX=PX(ZO(CZ,A+1)) : TY=PY(ZO(CZ,A+1))
  5410.       TX=TX-FX : TY=TY-FY
  5411.       PX=X-FX : PY=Y-FY
  5412.       NDDD=PX*TY-PY*TX
  5413.       If Abs(NDDD)<Abs(D) : D=NDDD : T=A : End If 
  5414.    Next 
  5415.    FX=PX(ZO(CZ,T)) : FY=PY(ZO(CZ,T))
  5416.    TX=PX(ZO(CZ,T+1)) : TY=PY(ZO(CZ,T+1))
  5417.    TX=TX-FX : TY=TY-FY
  5418.    L#=Sqr(TX^2+TY^2)
  5419.    L=L#
  5420.    D=D/L
  5421.    X=X-(TY*D)/L
  5422.    Y=Y+(TX*D)/L
  5423.    TX#=TX
  5424.    TY#=TY
  5425.    Degree 
  5426.    If Abs(TX#)>L#
  5427.       TX#=L#*Sgn(TX#)
  5428.    End If 
  5429.    If Abs(TY#)>L#
  5430.       TY#=L#*Sgn(TY#)
  5431.    End If 
  5432.    ANC=Acos(-TX#/L#)
  5433.    ANG=ANC
  5434.    If TY>0 : ANG=360-ANG : End If 
  5435.    ANG=(ANG+360) mod 360
  5436.    Screen 2 : Locate 0,0
  5437.    Print ANG
  5438. End If 
  5439.  
  5440. Doke S+12,ANG
  5441.  
  5442. OBX(NO)=X : OBZ(NO)=Y
  5443. Add NO,1
  5444. Return 
  5445.  
  5446. '
  5447. DDECOPUT:
  5448. S=Start(12)+NO*32
  5449. Poke S,9
  5450. REQUEST["Decoration Item :"] : P=Param
  5451. Doke S+2,P
  5452. Doke S+6,CZ
  5453. REQUEST["Facing Angle :"] : P=Param
  5454. P=(P*8192)/360
  5455. P=P and $FFFE
  5456. Doke S+8,P
  5457. OBX(NO)=X : OBZ(NO)=Y
  5458. Add NO,1
  5459. Return 
  5460. '
  5461. Procedure SHVCT[VCT]
  5462.    Screen 0
  5463.    For A=0 To 3
  5464.       Locate 40,2+A
  5465.       B=A+VCT
  5466.       If B<=20
  5467.          Print VECT$(B)
  5468.       Else 
  5469.          Print "                          "
  5470.       End If 
  5471.    Next 
  5472. End Proc
  5473. '
  5474. FLHAPUT:
  5475. S=Start(12)+NO*32
  5476. VCT=0
  5477. SHVCT[VCT]
  5478. Repeat 
  5479.    A$=Inkey$
  5480.    Wait Vbl 
  5481.    Wait Vbl 
  5482.    Wait Vbl 
  5483.    If Key State($4C) and VCT>0 Then Add VCT,-1 : SHVCT[VCT]
  5484.    If Key State($4D) and VCT<20 Then Add VCT,1 : SHVCT[VCT]
  5485. Until A$=" "
  5486. P=VCT
  5487. Poke S+1,P
  5488. ANG=0
  5489. If(P>=4 and P<=10)
  5490.    D=100000000 : T=-1
  5491.    For A=0 To ZP(CZ)-1
  5492.       FX=PX(ZO(CZ,A)) : FY=PY(ZO(CZ,A))
  5493.       TX=PX(ZO(CZ,A+1)) : TY=PY(ZO(CZ,A+1))
  5494.       TX=TX-FX : TY=TY-FY
  5495.       PX=X-FX : PY=Y-FY
  5496.       NDDD=PX*TY-PY*TX
  5497.       If Abs(NDDD)<Abs(D) : D=NDDD : T=A : End If 
  5498.    Next 
  5499.    FX=PX(ZO(CZ,T)) : FY=PY(ZO(CZ,T))
  5500.    TX=PX(ZO(CZ,T+1)) : TY=PY(ZO(CZ,T+1))
  5501.    TX=TX-FX : TY=TY-FY
  5502.    L#=Sqr(TX^2+TY^2)
  5503.    L=L#
  5504.    D=D/L
  5505.    X=X-(TY*D)/L
  5506.    Y=Y+(TX*D)/L
  5507.    TX#=TX
  5508.    TY#=TY
  5509.    Degree 
  5510.    If Abs(TX#)>L#
  5511.       TX#=L#*Sgn(TX#)
  5512.    End If 
  5513.    If Abs(TY#)>L#
  5514.       TY#=L#*Sgn(TY#)
  5515.    End If 
  5516.    ANC=Acos(-TX#/L#)
  5517.    ANG=ANC
  5518.    If TY>0 : ANG=360-ANG : End If 
  5519.    ANG=ANG+360
  5520.    Screen 2 : Locate 0,0
  5521.    Print ANG
  5522. End If 
  5523. Poke S,5
  5524. Doke S+6,CZ
  5525. Doke S+8,ANG
  5526. If P=9
  5527.    REQUEST["Time between flames"] : P=Param
  5528.    Doke S+12,P
  5529. End If 
  5530. OBX(NO)=X : OBZ(NO)=Y
  5531. Add NO,1
  5532. Return 
  5533. '  
  5534. ENEMYPUT:
  5535. S=Start(12)+NO*32
  5536. Poke S,0
  5537. ' For nasties need to store: which zone they're in,  
  5538. ' how many lives they have, how fast they can move 
  5539. ' and so on. 
  5540. REQUEST["Enter enemy type:"]
  5541. P=Param : Poke S+1,P
  5542. REQUEST["Enter number of hits to kill:"]
  5543. P=Param : Doke S+2,P
  5544. REQUEST["Team number (-1=solo):"]
  5545. P=Param : Doke S+4,P
  5546. Doke S+6,CZ
  5547. OBX(NO)=X : OBZ(NO)=Y
  5548. Add NO,1
  5549. Return 
  5550. '
  5551. MARINEPUT:
  5552. S=Start(12)+NO*32
  5553. Poke S,6
  5554. ' For nasties need to store: which zone they're in,  
  5555. ' how many lives they have, how fast they can move 
  5556. ' and so on. 
  5557. Poke S+1,0
  5558. REQUEST["Enter number of hits to kill:"]
  5559. P=Param : Doke S+2,P
  5560. REQUEST["Enter MAX movement speed:"]
  5561. P=Param : Doke S+4,P
  5562. REQUEST["Enter Leadership value:"]
  5563. P=Param : Doke S+8,P
  5564. Doke S+6,CZ
  5565. OBX(NO)=X : OBZ(NO)=Y
  5566. Add NO,1
  5567. Return 
  5568. '
  5569. BIGGUNPUT:
  5570. REQUEST["Which gun? "]
  5571. P=Param
  5572. S=Start(12)+NO*32
  5573. Poke S,3
  5574. Poke S+1,P
  5575. Doke S+6,CZ
  5576. OBX(NO)=X : OBZ(NO)=Y
  5577. Add NO,1
  5578. Return 
  5579. '
  5580. GLASSPUT:
  5581. S=Start(12)+NO*32
  5582. Poke S,7
  5583. Poke S+1,0
  5584. Doke S+6,CZ
  5585. OBX(NO)=X : OBZ(NO)=Y
  5586. Add NO,1
  5587. Return 
  5588. '
  5589. MEDIPUT:
  5590. S=Start(12)+NO*32
  5591. Poke S,1
  5592. Poke S+1,0
  5593. REQUEST["Enter healing factor:"]
  5594. P=Param : Doke S+2,P
  5595. Doke S+6,CZ
  5596. OBX(NO)=X : OBZ(NO)=Y
  5597. Add NO,1
  5598. Return 
  5599. '
  5600. BBARRELPUT:
  5601. S=Start(12)+NO*32
  5602. Poke S,8
  5603. Poke S+1,0
  5604. REQUEST["Enter Hits to Explode:"]
  5605. P=Param : Doke S+2,P
  5606. Doke S+6,CZ
  5607. OBX(NO)=X : OBZ(NO)=Y
  5608. Add NO,1
  5609. Return 
  5610. '
  5611. AMMOPUT:
  5612. S=Start(12)+NO*32
  5613. Poke S,2
  5614. Poke S+1,0
  5615. REQUEST["Enter gun type:"]
  5616. P=Param : Doke S+2,P
  5617. Doke S+6,CZ
  5618. OBX(NO)=X : OBZ(NO)=Y
  5619. Add NO,1
  5620. Return 
  5621. '
  5622. KEYPUT:
  5623. S=Start(12)+NO*32
  5624. Poke S,4
  5625. REQUEST["Enter Colour (0=Green 1=Red 2=Yellow 3=Blue):"]
  5626. P=Param : Poke S+1,P
  5627. Doke S+6,CZ
  5628. OBX(NO)=X : OBZ(NO)=Y
  5629. Add NO,1
  5630. Return 
  5631. '
  5632. Procedure REQUEST[R$]
  5633.    Screen 0 : Locate TXP,3 : Print R$
  5634.    Locate TXP,4 : Input V
  5635.    Curs Off 
  5636.    Locate TXP,3 : Print Space$(Len(R$))
  5637.    Locate TXP,4 : Print Space$(40)
  5638. End Proc[V]
  5639. '
  5640. Procedure MESSAGE[R$]
  5641.    Screen 0 : Locate TXP,4 : Print R$;
  5642. End Proc
  5643. '
  5644. Procedure OBJPUT[X,Y,C]
  5645.    Screen 2
  5646.    X=(X-XO)/MU : Y=(Y-YO)/MU
  5647.    If Y>0
  5648.       Extension   X,Y,3,C
  5649.       Ink C
  5650.       Extension   X-2,Y To X+2,Y
  5651.       Extension   X,Y-2 To X,Y+2
  5652.    End If 
  5653. End Proc
  5654. '  
  5655. Procedure TYPEOBJ[O]
  5656.    Screen 0 : Pen 1
  5657.    Locate TXP,1 : Print "Object Type: ";OB$(OT)
  5658. End Proc
  5659. '
  5660. DEFCORNER:
  5661. Sprite 1,X Hard(2,X),Y Hard(2,Y),3
  5662. If A$="," and CZ>0 Then ZOSHO[CZ,4] : CZ=CZ-1 : ZOSHO[CZ,10]
  5663. If A$="." and CZ<NZ-1 Then ZOSHO[CZ,4] : CZ=CZ+1 : ZOSHO[CZ,10]
  5664. M=Mouse Click : If M=0 Then Return 
  5665. X=(X*MU)+XO : Y=(Y*MU)+YO
  5666. If M=2 : 
  5667.    ZOSHO[CZ,4]
  5668.    ZOGET[X,Y]
  5669.    P=Param
  5670.    If P>=0
  5671.       CZ=P
  5672.    End If 
  5673.    ZOSHO[CZ,10]
  5674.    Goto 19
  5675. End If 
  5676. FINDNEAR[X,Y] : P=Param
  5677. For A=0 To ZP(CZ)-1
  5678.    If ZO(CZ,A)=P Then ZC(CZ,A)=1-ZC(CZ,A) : CORNER[P,ZC(CZ,A)*3]
  5679. Next 
  5680. 19
  5681. Return 
  5682. '
  5683. Procedure CORNER[P,C]
  5684.    X=PX(P) : Y=PY(P)
  5685.    X=(X-XO)/MU : Y=(Y-YO)/MU
  5686.    Screen 2
  5687.    Extension   X,Y,3,C
  5688. End Proc
  5689. '
  5690. '
  5691. INITDEFORDER:
  5692.  
  5693. Extension   
  5694.  
  5695. COUNTER=0
  5696. ' Make a list of which zones are connected to which. 
  5697. Screen 0 : Locate 40,1 : Print "Name for clip file"
  5698. Locate 40,2 : Input ">:";F$
  5699. F$="ab3:levels/level_"+F$+"/twolev.clips"
  5700. 'Screen Open 4,640,256,2,Hires 
  5701. 'Colour 1,$FFF 
  5702. For A=0 To NP : PW(A)=0 : PCW(A,0)=-1 : PCW(A,1)=-1 : Next 
  5703. For A=0 To NZ-1
  5704.    If ZP(A)>0
  5705.       For B=0 To ZP(A)-1
  5706.          If WT(A,B)=1
  5707.             PCW(ZO(A,B),1)=ZO(A,B+1)
  5708.             PCW(ZO(A,B+1),0)=ZO(A,B)
  5709.          End If 
  5710.          If BWT(WT(A,B))=1
  5711.             For C=0 To NZ-1
  5712.                For D=0 To ZP(C)-1
  5713.                   If ZO(A,B)=ZO(C,D+1) and ZO(A,B+1)=ZO(C,D)
  5714.                      ZZ(A,B)=C
  5715.                      D=ZP(C) : C=NZ
  5716.                   End If 
  5717.                Next 
  5718.             Next 
  5719.          Else 
  5720.             PW(ZO(A,B))=1
  5721.          End If 
  5722.       Next 
  5723.    End If 
  5724. Next 
  5725. MP=Start(15)
  5726. ' Need to go through every zone to see what we can see!
  5727. If NZ=0 Then Extension   : Return 
  5728. For F=0 To NZ-1
  5729.    '
  5730.    N$=Str$((F*100)/(NZ))-" "
  5731.    Screen 2 : Locate 0,0 : Print "Done: ";N$;"%"
  5732.    ' ZOFILL[F,2,3]
  5733.    ' Clear visible list 
  5734.    For A=0 To NZ-1
  5735.       ZU(A)=0
  5736.       'For B=0 To 30 
  5737.       '   LP(A,B)=-1 : RP(A,B)=-1
  5738.       'Next  
  5739.       VCPL(A)=0 : VCPR(A)=0
  5740.    Next 
  5741.    T=Start(14)+F*64*6
  5742.    ZU(F)=1
  5743.    ' Flag to see if we have added any new zones this time round.
  5744.    NZU=1
  5745.    P=1
  5746.    NZIL=0
  5747.    While NZU=1
  5748.       NZU=0
  5749.       TMPNZIL=NZIL
  5750.       For A=0 To NZ-1
  5751.          If ZU(A)=P
  5752.             For C=0 To ZP(A)-1
  5753.                NWT=WT(A,(C+1) mod ZP(A))
  5754.                If WT(A,C)<>1
  5755.                   Z=ZZ(A,C)
  5756.                   If ZU(Z)=0
  5757.                      ' We are not going back on ourselves here so 
  5758.                      ' maybe add this zone on end of list.
  5759.                      ' Now check to see if this new zone we have
  5760.                      ' added is visible.
  5761.                      If P+1>1
  5762.                         '                        Gosub REDRAW
  5763.                         Gosub LRBORD
  5764.                         '                        Wait Key  
  5765.                         FLB=FL : TLB=TL : FRB=FR : TRB=TR
  5766.                         FL=ZO(F,FL)
  5767.                         TL=ZO(Z,TL)
  5768.                         FR=ZO(F,FR)
  5769.                         TR=ZO(Z,TR)
  5770.                         X(0)=PX(FL) : Y(0)=PY(FL)
  5771.                         X(1)=PX(TL) : Y(1)=PY(TL)
  5772.                         X(2)=PX(TR) : Y(2)=PY(TR)
  5773.                         X(3)=PX(FR) : Y(3)=PY(FR)
  5774.                         X(4)=PX(FL) : Y(4)=PY(FL)
  5775.                         ' the above now hold the pts between which we have to check. 
  5776.                         'Now see what zones are inbetween! 
  5777.                         Gosub BETPTS
  5778.                         B=0
  5779.                         INVIS=0
  5780.                         NWALLS=1
  5781.                         While B<=NP and INVIS=0
  5782.                            CP=B
  5783.                            If CP<>FL and CP<>FR
  5784.                               If PU(CP)=-3
  5785.                                  'PU(CP)=NWALLS 
  5786.                                  CCP=PCW(CP,0)
  5787.                                  OFL=0 : OFR=0
  5788.                                  CHA=1
  5789.                                  If TL=TR and PW(TR)<>0 : PU(TL)=-2 : End If 
  5790.                                  If FL=FR and PW(FR)<>0 : PU(FL)=-4 : End If 
  5791.                                  While CHA=1
  5792.                                     CHA=0
  5793.                                     If PU(CCP)=-3 or PU(CCP)=0
  5794.                                        PU(CCP)=NWALLS : CHA=1
  5795.                                     End If 
  5796.                                     If PU(CCP)<-3
  5797.                                        OFL=-1
  5798.                                     End If 
  5799.                                     If PU(CCP)>-3 and PU(CCP)<0
  5800.                                        OFL=1
  5801.                                     End If 
  5802.                                     CCP=PCW(CCP,0)
  5803.                                  Wend 
  5804.                                  'Print OFL;OFR 
  5805.                                  CCP=CP
  5806.                                  If TL=TR and PW(TR)<>0 : PU(TL)=-4 : End If 
  5807.                                  If FL=FR and PW(FR)<>0 : PU(FL)=-2 : End If 
  5808.                                  CHA=1
  5809.                                  'Print "blah"
  5810.                                  While CHA=1
  5811.                                     'Print CCP 
  5812.                                     CHA=0
  5813.                                     If PU(CCP)=-3 or PU(CCP)=0
  5814.                                        PU(CCP)=NWALLS : CHA=1
  5815.                                     End If 
  5816.                                     If PU(CCP)<-3
  5817.                                        OFR=-1
  5818.                                     End If 
  5819.                                     If PU(CCP)>-3 and PU(CCP)<0
  5820.                                        OFR=1
  5821.                                     End If 
  5822.                                     CCP=PCW(CCP,1)
  5823.                                  Wend 
  5824.                                  '                CHA=1 
  5825.                                  '                While CHA=1 
  5826.                                  '                   CHA=0
  5827.                                  '                   For PP=0 To NZ-1 
  5828.                                  '                      L=ZP(PP)-1
  5829.                                  '                      For Q=0 To ZP(PP)-1 
  5830.                                  '                         If TL=TR : PU(TL)=-2 : End If  
  5831.                                  '                         If FL=FR : PU(FL)=-4 : End If  
  5832.                                  '                         If PU(ZO(PP,Q))=NWALLS 
  5833.                                  '                            If WT(PP,L)=1 
  5834.                                  '                               If PU(ZO(PP,L))=-3 or PU(ZO(PP,L))=0 
  5835.                                  '                                  PU(ZO(PP,L))=NWALLS 
  5836.                                  '                                  CHA=1 
  5837.                                  '                               End If 
  5838.                                  '                               If PU(ZO(PP,L))<-3 
  5839.                                  '                                  OFL=-1
  5840.                                  '                               End If 
  5841.                                  '                               If(PU(ZO(PP,L))>-3 and PU(ZO(PP,L))<0) 
  5842.                                  '                                  OFL=1 
  5843.                                  '                               End If 
  5844.                                  '                            End If  
  5845.                                  '                            If TL=TR : PU(TL)=-4 : End If 
  5846.                                  '                            If FL=FR : PU(FL)=-2 : End If 
  5847.                                  '                            If WT(PP,Q)=1 
  5848.                                  '                               If PU(ZO(PP,Q+1))=-3 or PU(ZO(PP,Q+1))=0 
  5849.                                  '                                  PU(ZO(PP,Q+1))=NWALLS 
  5850.                                  '                                  CHA=1 
  5851.                                  '                               End If 
  5852.                                  '                               If PU(ZO(PP,Q+1))<-3 
  5853.                                  '                                  OFR=-1
  5854.                                  '                               End If 
  5855.                                  '                                If(PU(ZO(PP,Q+1))>-3 and PU(ZO(PP,Q+1))<0)
  5856.                                  '                                  OFR=1 
  5857.                                  '                               End If 
  5858.                                  '                            End If  
  5859.                                  '                         End If 
  5860.                                  '                         L=(L+1) mod ZP(PP) 
  5861.                                  '                      Next  
  5862.                                  '                   Next 
  5863.                                  '                Wend  
  5864.                                  If(OFL=-1 and OFR=1) or(OFL=1 and OFR=-1)
  5865.                                     INVIS=1
  5866.                                  End If 
  5867.                                  SOW(NWALLS)=0
  5868.                                  If OFL=-1 and OFR=-1
  5869.                                     SOW(NWALLS)=-1
  5870.                                  End If 
  5871.                                  If OFL=1 and OFR=1
  5872.                                     SOW(NWALLS)=1
  5873.                                  End If 
  5874.                                  Add NWALLS,1
  5875.                               End If 
  5876.                            End If 
  5877.                            If FL=FR and PW(FR)<>0 : PU(FL)=-3 : End If 
  5878.                            If TL=TR and PW(TR)<>0 : PU(TL)=-3 : End If 
  5879.                            If PW(B)=1
  5880.                               If PU(B)=-4 and PU(PCW(B,1))=-2
  5881.                                  If FR=FL or TR=TL
  5882.                                     OL=0 : RO=0
  5883.                                     FX=PX(B)
  5884.                                     FY=PY(B)
  5885.                                     TX=PX(PCW(B,1))
  5886.                                     TY=PY(PCW(B,1))
  5887.                                     TX=TX-FX
  5888.                                     TY=TY-FY
  5889.                                     For ZEB=0 To ZP(F)-1
  5890.                                        PX=PX(ZO(F,ZEB))-FX
  5891.                                        PY=PY(ZO(F,ZEB))-FX
  5892.                                        D=PX*TY-TX*PY
  5893.                                        If D>0 : OL=1 : End If 
  5894.                                        If D<0 : RO=1 : End If 
  5895.                                     Next 
  5896.                                     If RO=0 or OL=0
  5897.                                        For ZEB=0 To ZP(F)-1
  5898.                                           PX=PX(ZO(F,ZEB))-FX
  5899.                                           PY=PY(ZO(F,ZEB))-FX
  5900.                                           D=PX*TY-TX*PY
  5901.                                           If D>0 : OL=1 : End If 
  5902.                                           If D<0 : RO=1 : End If 
  5903.                                        Next 
  5904.                                     End If 
  5905.                                     If RO=1 and OL=1
  5906.                                        INVIS=1
  5907.                                     End If 
  5908.                                  Else 
  5909.                                     INVIS=1
  5910.                                  End If 
  5911.                               End If 
  5912.                               If PU(B)=-2 and PU(PCW(B,1))=-4
  5913.                                  If FL=FR or TR=TL
  5914.                                     OL=0 : RO=0
  5915.                                     FX=PX(B)
  5916.                                     FY=PY(B)
  5917.                                     TX=PX(PCW(B,1))
  5918.                                     TY=PY(PCW(B,1))
  5919.                                     TX=TX-FX
  5920.                                     TY=TY-FY
  5921.                                     For ZEB=0 To ZP(F)-1
  5922.                                        PX=PX(ZO(F,ZEB))-FX
  5923.                                        PY=PY(ZO(F,ZEB))-FX
  5924.                                        D=PX*TY-TX*PY
  5925.                                        If D>0 : OL=1 : End If 
  5926.                                        If D<0 : RO=1 : End If 
  5927.                                     Next 
  5928.                                     If RO=0 or OL=0
  5929.                                        For ZEB=0 To ZP(F)-1
  5930.                                           PX=PX(ZO(F,ZEB))-FX
  5931.                                           PY=PY(ZO(F,ZEB))-FX
  5932.                                           D=PX*TY-TX*PY
  5933.                                           If D>0 : OL=1 : End If 
  5934.                                           If D<0 : RO=1 : End If 
  5935.                                        Next 
  5936.                                     End If 
  5937.                                     If RO=1 and OL=1
  5938.                                        INVIS=1
  5939.                                     End If 
  5940.                                  Else 
  5941.                                     INVIS=1
  5942.                                  End If 
  5943.                               End If 
  5944.                            End If 
  5945.                            Add B,1
  5946.                         Wend 
  5947.                         If INVIS=0
  5948.                            VCPL(Z)=0 : VCPR(Z)=0
  5949.                            If NWALLS>1
  5950.                               For BQ=1 To NWALLS-1
  5951.                                  If SOW(BQ)=-1
  5952.                                     ' all leftclip points
  5953.                                     For W=0 To NP
  5954.                                        If PU(W)=BQ
  5955.                                           PU(W)=-10
  5956.                                           LP(Z,VCPL(Z))=W : Add VCPL(Z),1
  5957.                                        End If 
  5958.                                     Next 
  5959.                                  End If 
  5960.                                  If SOW(BQ)=1
  5961.                                     ' all rightclip points 
  5962.                                     For W=0 To NP
  5963.                                        If PU(W)=BQ
  5964.                                           PU(W)=-20
  5965.                                           RP(Z,VCPR(Z))=W : Add VCPR(Z),1
  5966.                                        End If 
  5967.                                     Next 
  5968.                                  End If 
  5969.                               Next 
  5970.                               ' Now process left and right clip points to
  5971.                               ' exclude unnecessary ones.  
  5972.                               ' First eliminate all but most clockwise r clip
  5973.                               ' pt on target zone. 
  5974.                               Gosub RIGHTONEONLY
  5975.                               Gosub LEFTONEONLY
  5976.                               If LCPOTZ>0 and RCPOTZ>0 and TL<>TR
  5977.                                  ' get rid of any clips farther away. 
  5978.                                  FX=PX(LCPOTZ) : FY=PY(LCPOTZ)
  5979.                                  TX=PX(RCPOTZ)-FX : TY=PY(RCPOTZ)-FY
  5980.                                  If VCPL(Z)>1
  5981.                                     For BQ=0 To VCPL(Z)-1
  5982.                                        PPP=LP(Z,BQ)
  5983.                                        If PPP<>LCPOTZ and PPP<>RCPOTZ
  5984.                                           PX=PX(PPP)-FY : PY=PY(PPP)-FY
  5985.                                           D=PY*TX-PX*TY
  5986.                                           If D<=0
  5987.                                              LP(Z,BQ)=-1
  5988.                                           End If 
  5989.                                        End If 
  5990.                                     Next 
  5991.                                     TPT=0
  5992.                                     For BQ=0 To VCPL(Z)-1
  5993.                                        If LP(Z,BQ)<>-1
  5994.                                           LP(Z,TPT)=LP(Z,BQ)
  5995.                                           Add TPT,1
  5996.                                        End If 
  5997.                                     Next 
  5998.                                     VCPL(Z)=TPT
  5999.                                  End If 
  6000.                                  If VCPR(Z)>1
  6001.                                     For BQ=0 To VCPR(Z)-1
  6002.                                        PPP=RP(Z,BQ)
  6003.                                        If PPP<>LCPOTZ and PPP<>RCPOTZ
  6004.                                           PX=PX(PPP)-FY : PY=PY(PPP)-FY
  6005.                                           D=PY*TX-PX*TY
  6006.                                           If D<=0
  6007.                                              RP(Z,BQ)=-1
  6008.                                           End If 
  6009.                                        End If 
  6010.                                     Next 
  6011.                                     TPT=0
  6012.                                     For BQ=0 To VCPR(Z)-1
  6013.                                        If RP(Z,BQ)<>-1
  6014.                                           RP(Z,TPT)=RP(Z,BQ)
  6015.                                           Add TPT,1
  6016.                                        End If 
  6017.                                     Next 
  6018.                                     VCPR(Z)=TPT
  6019.                                  End If 
  6020.                               End If 
  6021.                               If VCPL(Z)>0
  6022.                                  BLFL=-1
  6023.                                  FX=PX(FL) : FY=PY(FL)
  6024.                                  TX=PX(TL)-FX : TY=PY(TL)-FY
  6025.                                  For BQ=0 To VCPL(Z)-1
  6026.                                     PX=PX(LP(Z,BQ))-FX : PY=PY(LP(Z,BQ))-FY
  6027.                                     D=PY*TX-PX*TY
  6028.                                     If D>0 or(TX=0 and TY=0)
  6029.                                        BLFL=BQ
  6030.                                        TX=PX : TY=PY
  6031.                                     End If 
  6032.                                  Next 
  6033.                                  BLFR=-1
  6034.                                  FX=PX(FR) : FY=PY(FR)
  6035.                                  TX=PX(FL)-FX : TY=PY(FL)-FY
  6036.                                  For BQ=0 To VCPL(Z)-1
  6037.                                     PX=PX(LP(Z,BQ))-FX : PY=PY(LP(Z,BQ))-FY
  6038.                                     D=PY*TX-PX*TY
  6039.                                     If D>0 or(TX=0 and TY=0)
  6040.                                        BLFR=BQ
  6041.                                        TX=PX : TY=PY
  6042.                                     End If 
  6043.                                  Next 
  6044.                                  If BLFL=BLFR
  6045.                                     ' only one clip point needed.
  6046.                                     LP(Z,0)=LP(Z,BLFL)
  6047.                                     VCPL(Z)=1
  6048.                                  End If 
  6049.                               End If 
  6050.                               '         Wait Key 
  6051.                               If VCPR(Z)>0
  6052.                                  BRFL=-1
  6053.                                  FX=PX(FL) : FY=PY(FL)
  6054.                                  TX=PX(FR)-FX : TY=PY(FR)-FY
  6055.                                  For BQ=0 To VCPR(Z)-1
  6056.                                     PX=PX(RP(Z,BQ))-FX : PY=PY(RP(Z,BQ))-FY
  6057.                                     D=PY*TX-PX*TY
  6058.                                     If D<0
  6059.                                        BRFL=BQ
  6060.                                        TX=PX : TY=PY
  6061.                                     End If 
  6062.                                  Next 
  6063.                                  BRFR=-1
  6064.                                  FX=PX(FR) : FY=PY(FR)
  6065.                                  TX=PX(TR)-FX : TY=PY(TR)-FY
  6066.                                  For BQ=0 To VCPR(Z)-1
  6067.                                     PX=PX(RP(Z,BQ))-FX : PY=PY(RP(Z,BQ))-FY
  6068.                                     D=PY*TX-PX*TY
  6069.                                     If D<=0
  6070.                                        BRFR=BQ
  6071.                                        TX=PX : TY=PY
  6072.                                     End If 
  6073.                                  Next 
  6074.                                  If BRFL=BRFR
  6075.                                     ' only one clip point needed.
  6076.                                     RP(Z,0)=RP(Z,BRFL)
  6077.                                     VCPR(Z)=1
  6078.                                  End If 
  6079.                               End If 
  6080.                               ' *****************************************************
  6081.                               ' Another waste of time bug fix. 
  6082.                               ' Picking pairs of leftclips, is 
  6083.                               ' the target zone completely on one
  6084.                               ' side of the line joining them? 
  6085.                               Gosub ELIMINLEFT
  6086.                               Gosub ELIMINRIGHT
  6087.                               If VCPL(Z)>0 and VCPR(Z)>0
  6088.                                  Doke Start(9)+50,ZP(F)-1
  6089.                                  Doke Start(9)+52,ZP(Z)-1
  6090.                                  Loke Start(9)+12,Varptr(LP(Z,0))
  6091.                                  Loke Start(9)+16,Varptr(RP(Z,0))
  6092.                                  Doke Start(9)+20,VCPL(Z)-1
  6093.                                  Doke Start(9)+22,VCPR(Z)-1
  6094.                                  Loke Start(9)+42,Varptr(ZO(F,0))
  6095.                                  Loke Start(9)+46,Varptr(ZO(Z,0))
  6096.                                  Doke Start(9)+40,2
  6097.                                  Call Start(9)+54
  6098.                                  INVIS=Deek(Start(9)+40)
  6099.                                  'For LPQ=0 To VCPL(Z)-1
  6100.                                  '   For RPQ=0 To VCPR(Z)-1 
  6101.                                  '      FX=PX(LP(Z,LPQ)) : FY=PY(LP(Z,LPQ)) 
  6102.                                  '      TX=PX(RP(Z,RPQ)) : TY=PY(RP(Z,RPQ)) 
  6103.                                  '      TX=TX-FX : TY=TY-FY 
  6104.                                  '      ' Is the source zone completely on  
  6105.                                  '      ' the left side of the line?  
  6106.                                  '      OL=1
  6107.                                  '      For BQ=0 To ZP(F)-1 
  6108.                                  '         PX=PX(ZO(F,BQ)) : PY=PY(ZO(F,BQ))
  6109.                                  '         PX=PX-FX : PY=PY-FY
  6110.                                  '         D=PY*TX-PX*TY
  6111.                                  '         If D>0 
  6112.                                  '            OL=0
  6113.                                  '         End If 
  6114.                                  '      Next  
  6115.                                  '      If OL=1 
  6116.                                  '         INVIS=1
  6117.                                  '      End If  
  6118.                                  '      ' Is the target zone completely on  
  6119.                                  '      ' the right side of the line?   
  6120.                                  '      RO=1
  6121.                                  '      For BQ=0 To ZP(Z)-1 
  6122.                                  '         PX=PX(ZO(Z,BQ)) : PY=PY(ZO(Z,BQ))
  6123.                                  '         PX=PX-FX : PY=PY-FY
  6124.                                  '         D=PY*TX-PX*TY
  6125.                                  '         If D<0 
  6126.                                  '            RO=0
  6127.                                  '         End If 
  6128.                                  '      Next  
  6129.                                  '      If RO=1 
  6130.                                  '         INVIS=1
  6131.                                  '      End If  
  6132.                                  '   Next 
  6133.                                  'Next  
  6134.                                  If INVIS=0
  6135.                                     ZU(Z)=P+1 : NZU=1
  6136.                                     Gosub CALCORDER
  6137.                                  End If 
  6138.                               Else 
  6139.                                  ZU(Z)=P+1 : NZU=1
  6140.                                  Gosub CALCORDER
  6141.                               End If 
  6142.                               ' *******************************************************************
  6143.                            Else 
  6144.                               Gosub CALCORDER
  6145.                               ZU(Z)=P+1 : NZU=1
  6146.                            End If 
  6147.                         End If 
  6148.                      Else 
  6149.                         ZU(Z)=P+1 : NZU=1
  6150.                      End If 
  6151.                   End If 
  6152.                End If 
  6153.             Next 
  6154.          End If 
  6155.       Next 
  6156.       Add P,1
  6157.    Wend 
  6158.    'Locate 0,1 : Print COUNTER
  6159.    '
  6160.    For A=0 To 63
  6161.       Loke T+A*6,$FFFFFFFF
  6162.       Doke T+A*6+2,$FFFF
  6163.    Next 
  6164.    TMP=P
  6165.    '
  6166.    For A=0 To NZ-1
  6167.       If ZU(A)>0
  6168.          'ZOFILL[A,4,5] 
  6169.          For B=0 To ZP(A)-1
  6170.             PU(ZO(A,B))=-100
  6171.          Next 
  6172.       End If 
  6173.    Next 
  6174.    'Wait Key : Gosub REDRAW 
  6175.    For A=0 To NZ-1
  6176.       If ZU(A)>0
  6177.          If VCPL(A)>0
  6178.             For B=0 To VCPL(A)-1
  6179.                If LP(A,B)>0
  6180.                   If PU(LP(A,B))<>-100
  6181.                      LP(A,B)=-1
  6182.                   End If 
  6183.                End If 
  6184.             Next 
  6185.          End If 
  6186.          If VCPR(A)>0
  6187.             For B=0 To VCPR(A)-1
  6188.                If RP(A,B)>0
  6189.                   If PU(RP(A,B))<>-100
  6190.                      RP(A,B)=-1
  6191.                   End If 
  6192.                End If 
  6193.             Next 
  6194.          End If 
  6195.       End If 
  6196.    Next 
  6197.    '
  6198.    CV=0
  6199.    '   Gosub REDRAW 
  6200.    For P=2 To TMP
  6201.       For A=0 To NZ-1
  6202.          If ZU(A)=P
  6203.             'zOFILL[A,3,3] 
  6204.             Doke T,A
  6205.             Loke T+2,CORD(A)
  6206.             'MYPRINT["ZoneClip"+ Fn MY$(F)+"to"+ Fn MY$(CV)] 
  6207.             Add CV,1
  6208.             D=0
  6209.             While D<VCPL(A)
  6210.                If LP(A,D)<>-1
  6211.                   'M$=M$+ Fn MY$(LP(A,D))+","+ Fn MY$(PCW(LP(A,D),1))+","
  6212.                   DK[LP(A,D)]
  6213.                End If 
  6214.                'MYPRINT[M$] 
  6215.                Add D,1
  6216.             Wend 
  6217.             DK[-1]
  6218.             D=0
  6219.             While D<VCPR(A)
  6220.                If(RP(A,D)<>-1)
  6221.                   'M$=M$+ Fn MY$(RP(A,D))+","+ Fn MY$(PCW(RP(A,D),0))
  6222.                   DK[RP(A,D)]
  6223.                End If 
  6224.                'MYPRINT[M$] 
  6225.                Add D,1
  6226.             Wend 
  6227.             DK[-2]
  6228.             'MYPRINT[" dc.l 0,0"]
  6229.             Add T,6
  6230.          End If 
  6231.       Next 
  6232.    Next 
  6233.    If T-Start(14)>Length(14)
  6234.       Print F : Wait Key 
  6235.       Bell 
  6236.       End 
  6237.    End If 
  6238.    '
  6239. Next 
  6240. For A=0 To NP
  6241.    DK[PCW(A,0)] : DK[PCW(A,1)]
  6242. Next 
  6243. Bsave F$,Start(15) To MP
  6244. Print MP-Start(15)
  6245.  
  6246. 'Screen Close 4
  6247.  
  6248. Extension   
  6249.  
  6250. Return 
  6251. '
  6252. ELIMINLEFT:
  6253. 'Inc COUNTER 
  6254. If VCPL(Z)>1
  6255.    Loke Start(9)+46,Varptr(ZO(Z,0))
  6256.    Doke Start(9)+52,ZP(Z)-1
  6257.    Doke Start(9)+20,VCPL(Z)
  6258.    Loke Start(9)+12,Varptr(LP(Z,0))
  6259.    Doke Start(9)+40,3
  6260.    Call Start(9)+54
  6261.    'For SS=0 To VCPL(Z)-1 
  6262.    'Print LP(Z,SS) : Next 
  6263.    'For SLP=0 To VCPL(Z)-2
  6264.    '   FP=LP(Z,SLP) 
  6265.    '   If FP<>-1
  6266.    '      For ELP=SLP+1 To VCPL(Z)-1
  6267.    '         TP=LP(Z,ELP) 
  6268.    '         If TP<>-1
  6269.    '            FX=PX(FP) : FY=PY(FP) : TX=PX(TP) : TY=PY(TP) 
  6270.    '            TX=TX-FX : TY=TY-FY 
  6271.    '            POL=0 : POR=0 
  6272.    '            For TZC=0 To ZP(Z)-1
  6273.    '               TZP=ZO(Z,TZC)
  6274.    '               PX=PX(TZP)-FX
  6275.    '               PY=PY(TZP)-FY
  6276.    '               D=PY*TX-PX*TY
  6277.    '               If D>0 
  6278.    '                  POR=1 
  6279.    '               Else 
  6280.    '                  If D<0
  6281.    '                     POL=1
  6282.    '                  End If  
  6283.    '               End If 
  6284.    '            Next  
  6285.    '            If POL=1 and POR=0
  6286.    '               LP(Z,SLP)=-1 
  6287.    '            End If  
  6288.    '            If POL=0 and POR=1
  6289.    '               LP(Z,ELP)=-1 
  6290.    '            End If  
  6291.    '         End If 
  6292.    '      Next  
  6293.    '   End If 
  6294.    'Next  
  6295.    'PIB=0 
  6296.    'For TT=0 To VCPL(Z)-1 
  6297.    '   If LP(Z,TT)<>-1
  6298.    '      LP(Z,PIB)=LP(Z,TT)
  6299.    '      Add PIB,1 
  6300.    '   End If 
  6301.    'Next  
  6302.    'VCPL(Z)=PIB 
  6303.    VCPL(Z)=Deek(Start(9)+40)
  6304. End If 
  6305. Return 
  6306. '  
  6307. ELIMINRIGHT:
  6308. If VCPR(Z)>1
  6309.    Loke Start(9)+46,Varptr(ZO(Z,0))
  6310.    Doke Start(9)+52,ZP(Z)-1
  6311.    Doke Start(9)+20,VCPR(Z)-1
  6312.    Loke Start(9)+12,Varptr(RP(Z,0))
  6313.    Doke Start(9)+40,4
  6314.    Call Start(9)+54
  6315.    'For SRP=0 To VCPR(Z)-2
  6316.    '   FP=RP(Z,SRP) 
  6317.    '   If FP<>-1
  6318.    '      For ERP=SRP+1 To VCPR(Z)-1
  6319.    '         TP=RP(Z,ERP) 
  6320.    '         If TP<>-1
  6321.    '            FX=PX(FP) : FY=PY(FP) : TX=PX(TP) : TY=PY(TP) 
  6322.    '            TX=TX-FX : TY=TY-FY 
  6323.    '            POL=0 : POR=0 
  6324.    '            For TZC=0 To ZP(Z)-1
  6325.    '               TZP=ZO(Z,TZC)
  6326.    '               PX=PX(TZP)-FX
  6327.    '               PY=PY(TZP)-FY
  6328.    '               D=PY*TX-PX*TY
  6329.    '               If D>0 
  6330.    '                  POR=1 
  6331.    '               Else 
  6332.    '                  If D<0
  6333.    '                     POL=1
  6334.    '                  End If  
  6335.    '               End If 
  6336.    '            Next  
  6337.    '            If POL=1 and POR=0
  6338.    '               RP(Z,ERP)=-1 
  6339.    '            End If  
  6340.    '            If POL=0 and POR=1
  6341.    '               RP(Z,SRP)=-1 
  6342.    '            End If  
  6343.    '         End If 
  6344.    '      Next  
  6345.    '   End If 
  6346.    'Next  
  6347.    'PIB=0 
  6348.    'For TT=0 To VCPR(Z)-1 
  6349.    '   If RP(Z,TT)<>-1
  6350.    '      RP(Z,PIB)=RP(Z,TT)
  6351.    '      Add PIB,1 
  6352.    '   End If 
  6353.    'Next  
  6354.    VCPR(Z)=Deek(Start(9)+40)
  6355. End If 
  6356. Return 
  6357. '
  6358. CALCORDER:
  6359. Doke Start(9)+40,1
  6360. Loke Start(9)+42,Varptr(ZO(F,0))
  6361. Loke Start(9)+46,Varptr(ZO(Z,0))
  6362. Loke Start(9)+12,Varptr(WT(Z,0))
  6363. Doke Start(9)+50,ZP(F)-1
  6364. Doke Start(9)+52,ZP(Z)-1
  6365. Call Start(9)+54
  6366. CORD(Z)=Leek(Start(9)+50)
  6367. 'Print CORD
  6368. 'CORD=0
  6369. 'BTS=1 
  6370. 'For QQ=0 To ZP(Z)-1 
  6371. '   If WT(Z,QQ)<>1 
  6372. '      FX=PX(ZO(Z,QQ)) 
  6373. '      FY=PY(ZO(Z,QQ)) 
  6374. '      TX=PX(ZO(Z,QQ+1))-FX
  6375. '      TY=PY(ZO(Z,QQ+1))-FY : SOL=0 : SOR=0
  6376. '      For QQQ=0 To ZP(F)-1
  6377. '         PX=PX(ZO(F,QQQ))-FX : PY=PY(ZO(F,QQQ))-FY
  6378. '         D=PY*TX-PX*TY
  6379. '         If D<0 
  6380. '            SOL=1 
  6381. '         End If 
  6382. '         If D>0 
  6383. '            SOR=1 
  6384. '         End If   
  6385. '      Next  
  6386. '      '      Wait Key   
  6387. '      If SOL=1 and SOR=0
  6388. '         Bset BTS,CORD
  6389. '         '            ZOFILL[ZZ(Z,QQ),11,12]
  6390. '      End If  
  6391. '      If SOL=0 and SOR=1
  6392. '         Bset BTS,CORD
  6393. '         Bset BTS+1,CORD
  6394. '         '               ZOFILL[ZZ(Z,QQ),3,4] 
  6395. '      End If  
  6396. '   End If 
  6397. '   Add BTS,3
  6398. '   CORD(Z)=CORD 
  6399. 'Next  
  6400. 'Print CORD : End  
  6401. Return 
  6402. '
  6403. CHKBET:
  6404. Return 
  6405. '
  6406. RIGHTONEONLY:
  6407. RCPOTZ=-1
  6408. If VCPR(Z)>0
  6409.    BQ=TLB
  6410.    PU(FR)=-20
  6411.    If PU(ZO(Z,BQ))<>-20
  6412.       BQ=(BQ+ZP(Z)-1) mod ZP(Z)
  6413.       While PU(ZO(Z,BQ))<>-20 and BQ<>TRB
  6414.          BQ=(BQ+ZP(Z)-1) mod ZP(Z)
  6415.       Wend 
  6416.    End If 
  6417.    If PU(ZO(Z,BQ))=-20
  6418.       RCPOTZ=ZO(Z,BQ)
  6419.       BQW=(BQ+1) mod ZP(Z)
  6420.       While BQW<>BQ
  6421.          If PU(ZO(Z,BQW))=-20
  6422.             For AAA=0 To VCPR(Z)-1
  6423.                If RP(Z,AAA)=ZO(Z,BQW)
  6424.                   RP(Z,AAA)=-1
  6425.                End If 
  6426.             Next 
  6427.          End If 
  6428.          BQW=(BQW+1) mod ZP(Z)
  6429.       Wend 
  6430.       TPT=0
  6431.       For BQ=0 To VCPR(Z)-1
  6432.          If RP(Z,BQ)<>-1
  6433.             RP(Z,TPT)=RP(Z,BQ)
  6434.             Add TPT,1
  6435.          End If 
  6436.       Next 
  6437.       VCPR(Z)=TPT
  6438.    End If 
  6439. End If 
  6440. Return 
  6441. '
  6442. LEFTONEONLY:
  6443. LCPOTZ=-1
  6444. If VCPL(Z)>0
  6445.    BQ=TRB
  6446.    PU(FL)=-10
  6447.    If PU(ZO(Z,BQ))<>-10
  6448.       BQ=(BQ+1) mod ZP(Z)
  6449.       While(PU(ZO(Z,BQ))<>-10) and(BQ<>TLB)
  6450.          BQ=(BQ+1) mod ZP(Z)
  6451.       Wend 
  6452.    End If 
  6453.    If PU(ZO(Z,BQ))=-10
  6454.       LCPOTZ=ZO(Z,BQ)
  6455.       BQW=(BQ+1) mod ZP(Z)
  6456.       While BQW<>BQ
  6457.          If PU(ZO(Z,BQW))=-10
  6458.             For AAA=0 To VCPL(Z)-1
  6459.                If LP(Z,AAA)=ZO(Z,BQW)
  6460.                   LP(Z,AAA)=-1
  6461.                End If 
  6462.             Next 
  6463.          End If 
  6464.          BQW=(BQW+1) mod ZP(Z)
  6465.       Wend 
  6466.       TPT=0
  6467.       For BQ=0 To VCPL(Z)-1
  6468.          If LP(Z,BQ)<>-1
  6469.             LP(Z,TPT)=LP(Z,BQ)
  6470.             Add TPT,1
  6471.          End If 
  6472.       Next 
  6473.       VCPL(Z)=TPT
  6474.    End If 
  6475. End If 
  6476. Return 
  6477. '  
  6478. BETPTS:
  6479. Loke Start(9),Varptr(D(0,0))
  6480. Loke Start(9)+4,Varptr(PX(0))
  6481. Loke Start(9)+8,Varptr(PY(0))
  6482. Doke Start(9)+12,X(0)
  6483. Doke Start(9)+14,Y(0)
  6484. Doke Start(9)+16,X(1)
  6485. Doke Start(9)+18,Y(1)
  6486. Doke Start(9)+20,X(2)
  6487. Doke Start(9)+22,Y(2)
  6488. Doke Start(9)+24,X(3)
  6489. Doke Start(9)+26,Y(3)
  6490. Doke Start(9)+28,NP
  6491. Loke Start(9)+30,Varptr(PW(0))
  6492. Loke Start(9)+34,Varptr(PU(0))
  6493. If FL<>FR and TL<>TR
  6494.    Doke Start(9)+38,0
  6495. End If 
  6496. If FL=FR and TL<>TR
  6497.    Doke Start(9)+38,1
  6498. End If 
  6499. If FL<>FR and TL=TR
  6500.    Doke Start(9)+38,2
  6501. End If 
  6502. Doke Start(9)+40,0
  6503. Call Start(9)+54
  6504. 'For B=0 To NP 
  6505. '   If PW(B)=1 
  6506. '      'For J=0 To 3 
  6507. '      '   DX=X(J+1)-X(J) : DY=Y(J+1)-Y(J) 
  6508. '      '   PX=PX(B)-X(J) : PY=PY(B)-Y(J) 
  6509. '      '   D(B,J)=DX*PY-DY*PX  
  6510. '      'Next   
  6511. '      PU(B)=0 
  6512. '      If FL<>FR and TL<>TR
  6513. '         If D(B,0)>0 and D(B,1)>0 and D(B,2)>0 and D(B,3)>0 
  6514. '            PU(B)=-3
  6515. '         End If 
  6516. '         If D(B,0)<=0 
  6517. '            PU(B)=-4
  6518. '            If D(B,1)<=0 or D(B,3)<=0 
  6519. '               PU(B)=-5 
  6520. '            End If  
  6521. '         End If 
  6522. '         If D(B,2)<=0 
  6523. '            PU(B)=-2
  6524. '            If D(B,1)<=0 or D(B,3)<=0 
  6525. '              PU(B)=-1
  6526. '            End If  
  6527. '         End If 
  6528. '      End If  
  6529. '      If FL=FR and TL<>TR 
  6530. '         If D(B,0)>0 and D(B,1)>0 and D(B,2)>0
  6531. '            PU(B)=-3
  6532. '         End If 
  6533. '         If D(B,0)<=0 
  6534. '            PU(B)=-4
  6535. '            If D(B,1)<=0 or D(B,2)<=0 
  6536. '               PU(B)=0
  6537. '            End If  
  6538. '         End If 
  6539. '         If D(B,2)<=0 
  6540. '            PU(B)=-2
  6541. '            If D(B,1)<=0 or D(B,0)<=0 
  6542. '               PU(B)=0
  6543. '            End If  
  6544. '         End If 
  6545. '      End If  
  6546. '      If FL<>FR and TL=TR 
  6547. '         If D(B,0)>0 and D(B,3)>0 and D(B,2)>0
  6548. '            PU(B)=-3
  6549. '         End If 
  6550. '         If D(B,0)<=0 
  6551. '            PU(B)=-4  
  6552. '            If D(B,3)<=0 or D(B,2)<=0 
  6553. '               PU(B)=0
  6554. '            End If  
  6555. '         End If 
  6556. '         If D(B,2)<=0 
  6557. '            PU(B)=-2
  6558. '            If D(B,3)<=0 or D(B,0)<=0 
  6559. '               PU(B)=0
  6560. '            End If  
  6561. '         End If 
  6562. '      End If  
  6563. '   End If 
  6564. '   '            OUTLINE[B]
  6565. 'Next  
  6566. 'For B=0 To NP : Print PU(B) : Next  
  6567. 'End 
  6568. 'BQ=(FLB+1) mod ZP(F)
  6569. 'While BQ<>FRB 
  6570. '   If PW(ZO(F,BQ))=1
  6571. '      PU(ZO(F,BQ))=-3 
  6572. '   End If 
  6573. '   BQ=(BQ+1) mod ZP(F)
  6574. 'Wend  
  6575. 'BQ=(TRB+1) mod ZP(Z)
  6576. 'While BQ<>TLB 
  6577. '   If PW(ZO(Z,BQ))=1
  6578. '      PU(ZO(Z,BQ))=-3 
  6579. '   End If 
  6580. '   BQ=(BQ+1) mod ZP(Z)
  6581. 'Wend  
  6582. PU(FL)=-5 : PU(TL)=-5 : PU(TR)=-1 : PU(FR)=-1
  6583. Return 
  6584. '
  6585. LRBORD:
  6586. ' Find the two bordering lines joining the two zones.
  6587. FL=0 : TL=0 : FR=0 : TR=0
  6588. If ZO(F,FL)=ZO(Z,TL) Then FL=FL+1
  6589. If ZO(F,FR)=ZO(Z,TR) Then FR=FR+1
  6590. CHANGED=1
  6591. While CHANGED=1
  6592.    CHANGED=0
  6593.    NL=(TL+ZP(Z)-1) mod ZP(Z)
  6594.    D=0
  6595.    X=PX(ZO(F,FL)) : Y=PY(ZO(F,FL))
  6596.    DX=PX(ZO(Z,TL)) : DY=PY(ZO(Z,TL))
  6597.    DX=DX-X : DY=DY-Y : TMPTL=TL
  6598.    While NL<>TMPTL
  6599.       PX=PX(ZO(Z,NL))-X : PY=PY(ZO(Z,NL))-Y
  6600.       ND=DY*PX-DX*PY
  6601.       If ND>0
  6602.          DX=PX : DY=PY : TL=NL : CHANGED=1
  6603.       End If 
  6604.       NL=(NL+ZP(Z)-1) mod ZP(Z)
  6605.    Wend 
  6606.    '
  6607.    NL=(FL+1) mod ZP(F)
  6608.    D=0
  6609.    X=PX(ZO(F,FL)) : Y=PY(ZO(F,FL))
  6610.    DX=PX(ZO(Z,TL)) : DY=PY(ZO(Z,TL))
  6611.    X=X-DX : Y=Y-DY : TMPFL=FL
  6612.    While NL<>TMPFL
  6613.       PX=PX(ZO(F,NL))-DX : PY=PY(ZO(F,NL))-DY
  6614.       ND=X*PY-Y*PX
  6615.       If ND>0
  6616.          X=PX : Y=PY : FL=NL : CHANGED=1
  6617.       End If 
  6618.       NL=(NL+1) mod ZP(F)
  6619.    Wend 
  6620. Wend 
  6621. 'JOINCOORDS[PX(ZO(F,FL)),PY(ZO(F,FL)),PX(ZO(Z,TL)),PY(ZO(Z,TL)),7] 
  6622. '
  6623. CHANGED=1
  6624. While CHANGED=1
  6625.    CHANGED=0
  6626.    NR=(TR+1) mod ZP(Z)
  6627.    D=0
  6628.    X=PX(ZO(F,FR)) : Y=PY(ZO(F,FR))
  6629.    DX=PX(ZO(Z,TR)) : DY=PY(ZO(Z,TR))
  6630.    DX=DX-X : DY=DY-Y : TMPTR=TR
  6631.    While NR<>TMPTR
  6632.       PX=PX(ZO(Z,NR))-X : PY=PY(ZO(Z,NR))-Y
  6633.       ND=DY*PX-DX*PY
  6634.       If ND<0
  6635.          DX=PX : DY=PY : TR=NR : CHANGED=1
  6636.       End If 
  6637.       NR=(NR+1) mod ZP(Z)
  6638.    Wend 
  6639.    '
  6640.    NR=(FR+ZP(F)-1) mod ZP(F)
  6641.    D=0
  6642.    X=PX(ZO(F,FR)) : Y=PY(ZO(F,FR))
  6643.    DX=PX(ZO(Z,TR)) : DY=PY(ZO(Z,TR))
  6644.    X=X-DX : Y=Y-DY : TMPFR=FR
  6645.    While NR<>TMPFR
  6646.       PX=PX(ZO(F,NR))-DX : PY=PY(ZO(F,NR))-DY
  6647.       ND=X*PY-Y*PX
  6648.       If ND<0
  6649.          X=PX : Y=PY : FR=NR : CHANGED=1
  6650.       End If 
  6651.       NR=(NR+ZP(F)-1) mod ZP(F)
  6652.    Wend 
  6653. Wend 
  6654. 'JOINCOORDS[PX(ZO(F,FR)),PY(ZO(F,FR)),PX(ZO(Z,TR)),PY(ZO(Z,TR)),7] 
  6655. Return 
  6656. '
  6657. LISTORDER:
  6658. Screen 0
  6659. Ink 0
  6660. Bar TXP*8,7 To 640,64
  6661. For A=0 To 27 : ZOPR[A] : Next 
  6662. ZOUT[ZOP,3]
  6663. Return 
  6664. '
  6665. Procedure ZOPR[A]
  6666.    X=A mod 11 : Y=A/11
  6667.    X=X*5+TXP : Y=Y+2
  6668.    Screen 0
  6669.    Locate X,Y
  6670.    P=Start(14)+(CZ*32+A)*4
  6671.    If Peek(P)<>255 Then M$="Z" Else M$=" "
  6672.    If Peek(P+1)<>255 Then M$=M$+"L" Else M$=M$+" "
  6673.    If Peek(P+2)<>255 Then M$=M$+"R" Else M$=M$+" "
  6674.    If Peek(P+3)<>255 Then M$=M$+"V" Else M$=M$+" "
  6675.    Print M$;
  6676. End Proc
  6677. '
  6678. PLACEPLAYER:
  6679. Sprite 1,X Hard(2,X),Y Hard(2,Y),3
  6680. M=Mouse Click
  6681. X=(X*MU)+XO : Y=(Y*MU)+YO
  6682.  
  6683. If A$="e"
  6684.    ZOSHO[PLZ,4]
  6685.    ZOGET[X,Y] : P=Param : If P>=0 : EZONE=P : End If 
  6686.    Gosub REDRAW
  6687.    ZOSHO[PLZ,10]
  6688. End If 
  6689. If M=0 Then Return 
  6690. If M=1
  6691.    ZOSHO[PLZ,4]
  6692.    ZOGET[X,Y] : P=Param : If P>=0 : PLZ=P : End If 
  6693.    PLX=X : PLY=Y : Gosub REDRAW
  6694.    ZOSHO[PLZ,10]
  6695. End If 
  6696. If M=2
  6697.    ZOSHO[PLZ2,4]
  6698.    ZOGET[X,Y] : P=Param : If P>=0 : PLZ2=P : End If 
  6699.    PLX2=X : PLY2=Y : Gosub REDRAW
  6700.    ZOSHO[PLZ2,10]
  6701. End If 
  6702. Return 
  6703. '
  6704. DEFGRAPH:
  6705. Return 
  6706. '
  6707. DEFHEIGHT:
  6708. Sprite 1,X Hard(2,X),Y Hard(2,Y),3
  6709. M=Mouse Click
  6710. X=(X*MU)+XO : Y=(Y*MU)+YO
  6711. If CZ<0 Then Return 
  6712. D=1 : If Key State($60) or Key State($61) Then D=8
  6713. If A$="-"
  6714.    Add FLH,-D
  6715.    Screen 0 : Locate TXP,2 : Print "Floor Height: ";FLH;"       "
  6716. End If 
  6717. If A$="+"
  6718.    Add FLH,D
  6719.    Screen 0 : Locate TXP,2 : Print "Floor Height: ";FLH;"       "
  6720. End If 
  6721. If A$="w"
  6722.    Curs Off 
  6723.    Screen 0 : Locate TXP,2 : Print "Enter water height:"
  6724.    Locate TXP,4 : Input ":> ";WH
  6725.    ZH(CZ,2)=WH : ZOFILL[CZ,4,5]
  6726.    If NZ>1
  6727.       For A=0 To NZ-2
  6728.          For B=0 To ZP(A)-1
  6729.             If WT(A,B)<>1
  6730.                O=ZO(A,B) : P=ZO(A,B+1)
  6731.                For C=A+1 To NZ-1
  6732.                   For D=0 To ZP(C)-1
  6733.                      If O=ZO(C,D+1) and P=ZO(C,D)
  6734.                         ZZ(A,B)=C : ZZ(C,D)=A
  6735.                      End If 
  6736.                   Next 
  6737.                Next 
  6738.             End If 
  6739.          Next 
  6740.       Next 
  6741.       CHA=1
  6742.       While CHA=1
  6743.          CHA=0
  6744.          For A=0 To NZ
  6745.             If ZH(A,2)=WH
  6746.                For B=0 To ZP(A)-1
  6747.                   Z=ZZ(A,B)
  6748.                   If ZH(Z,2)<>WH and ZH(Z,0)>WH
  6749.                      ZH(Z,2)=WH : CHA=1 : ZOFILL[Z,4,5]
  6750.                   End If 
  6751.                Next 
  6752.             End If 
  6753.          Next 
  6754.       Wend 
  6755.    End If 
  6756. End If 
  6757. If M=0 Then Return 
  6758. ZOSHO[CZ,4]
  6759. ZOGET[X,Y] : P=Param : If P>=0 Then CZ=P
  6760. ZOSHO[CZ,10]
  6761. If M=1
  6762.    Screen 0 : Curs Off 
  6763.    ZH(CZ,0)=FLH
  6764.    Locate TXP,3 : Print "Water Height: ";ZH(CZ,2);"       "
  6765. End If 
  6766. If M=2
  6767.    Screen 0 : Curs Off : FLH=ZH(CZ,0)
  6768.    Locate TXP,2 : Print "Floor Height: ";ZH(CZ,0);"                    "
  6769.    Locate TXP,3 : Print "Water Height: ";ZH(CZ,2);"       "
  6770. End If 
  6771. Return 
  6772.  
  6773. DEFWATERHEIGHT:
  6774. Sprite 1,X Hard(2,X),Y Hard(2,Y),3
  6775. M=Mouse Click
  6776. X=(X*MU)+XO : Y=(Y*MU)+YO
  6777. If CZ<0 Then Return 
  6778. D=1 : If Key State($60) or Key State($61) Then D=8
  6779. If A$="-"
  6780.    Add WAH,-D
  6781.    Screen 0
  6782.    Locate TXP,2 : Print "Floor Height: ";ZH(CZ,0);"                    "
  6783.    Locate TXP,3 : Print "Water Height: ";WAH;"       "
  6784. End If 
  6785. If A$="+"
  6786.    Add WAH,D
  6787.    Screen 0
  6788.    Locate TXP,2 : Print "Floor Height: ";ZH(CZ,0);"                    "
  6789.    Locate TXP,3 : Print "Water Height: ";WAH;"       "
  6790. End If 
  6791. If A$="w"
  6792.    Curs Off 
  6793.    Screen 0 : Locate TXP,2 : Print "Enter water height:"
  6794.    Locate TXP,3 : Input ": ";WAH
  6795.    Locate TXP,2 : Print "Floor Height: ";ZH(CZ,0);"                    "
  6796.    Locate TXP,3 : Print "Water Height: ";WAH;"       "
  6797. End If 
  6798. If M=0 Then Return 
  6799. ZOSHO[CZ,4]
  6800. ZOGET[X,Y] : P=Param : If P>=0 Then CZ=P
  6801. ZOSHO[CZ,10]
  6802. If M=1
  6803.    Screen 0 : Curs Off 
  6804.    ZH(CZ,2)=WAH
  6805.    Locate TXP,2 : Print "Floor Height: ";ZH(CZ,0);"                    "
  6806.    Locate TXP,3 : Print "Water Height: ";ZH(CZ,2);"       "
  6807. End If 
  6808. If M=2
  6809.    Screen 0 : Curs Off : WAH=ZH(CZ,2)
  6810.    Locate TXP,2 : Print "Floor Height: ";ZH(CZ,0);"                    "
  6811.    Locate TXP,3 : Print "Water Height: ";ZH(CZ,2);"       "
  6812. End If 
  6813. Return 
  6814. '
  6815. DEFROOFHEIGHT:
  6816. Sprite 1,X Hard(2,X),Y Hard(2,Y),3
  6817. D=1 : If Key State($60) or Key State($61) Then D=8
  6818. If A$="-"
  6819.    Add RFH,-D
  6820.    Screen 0 : Locate TXP,2 : Print "Roof Height: ";RFH;"       "
  6821. End If 
  6822. If A$="+"
  6823.    Add RFH,D
  6824.    Screen 0 : Locate TXP,2 : Print "Roof Height: ";RFH;"       "
  6825. End If 
  6826. M=Mouse Click : If M=0 Then Return 
  6827. X=(X*MU)+XO : Y=(Y*MU)+YO
  6828. ZOSHO[CZ,4]
  6829. ZOGET[X,Y] : P=Param : If P>=0 Then CZ=P
  6830. ZOSHO[CZ,10]
  6831. If CZ<0 Then Return 
  6832. If M=1
  6833.    ZH(CZ,1)=RFH
  6834. End If 
  6835. If M=2
  6836.    RFH=ZH(CZ,1)
  6837.    Screen 0 : Curs Off 
  6838.    Locate TXP,2 : Print "Roof Height: ";ZH(CZ,1);"                    "
  6839. End If 
  6840. Return 
  6841.  
  6842. DEFUPPERROOFHEIGHT:
  6843. Sprite 1,X Hard(2,X),Y Hard(2,Y),3
  6844. D=1 : If Key State($60) or Key State($61) Then D=8
  6845. If A$="-"
  6846.    Add RFH,-D
  6847.    Screen 0 : Locate TXP,2 : Print "Roof Height: ";RFH;"       "
  6848. End If 
  6849. If A$="+"
  6850.    Add RFH,D
  6851.    Screen 0 : Locate TXP,2 : Print "Roof Height: ";RFH;"       "
  6852. End If 
  6853. M=Mouse Click : If M=0 Then Return 
  6854. X=(X*MU)+XO : Y=(Y*MU)+YO
  6855. ZOSHO[CZ,4]
  6856. ZOGET[X,Y] : P=Param : If P>=0 Then CZ=P
  6857. ZOSHO[CZ,10]
  6858. If CZ<0 Then Return 
  6859. If M=1
  6860.    UZH(CZ,1)=RFH
  6861. End If 
  6862. If M=2
  6863.    RFH=UZH(CZ,1)
  6864.    Screen 0 : Curs Off 
  6865.    Locate TXP,2 : Print "Roof Height: ";UZH(CZ,1);"                    "
  6866. End If 
  6867. Return 
  6868.  
  6869. DEFUPPERFLOORHEIGHT:
  6870. Sprite 1,X Hard(2,X),Y Hard(2,Y),3
  6871. D=1 : If Key State($60) or Key State($61) Then D=8
  6872. If A$="-"
  6873.    Add FLH,-D
  6874.    Screen 0 : Locate TXP,2 : Print "Floor Height: ";FLH;"       "
  6875. End If 
  6876. If A$="+"
  6877.    Add FLH,D
  6878.    Screen 0 : Locate TXP,2 : Print "Floor Height: ";FLH;"       "
  6879. End If 
  6880. M=Mouse Click : If M=0 Then Return 
  6881. X=(X*MU)+XO : Y=(Y*MU)+YO
  6882. ZOSHO[CZ,4]
  6883. ZOGET[X,Y] : P=Param : If P>=0 Then CZ=P
  6884. ZOSHO[CZ,10]
  6885. If CZ<0 Then Return 
  6886. If M=1
  6887.    UZH(CZ,0)=FLH
  6888. End If 
  6889. If M=2
  6890.    FLH=UZH(CZ,0)
  6891.    Screen 0 : Curs Off 
  6892.    Locate TXP,2 : Print "Floor Height: ";UZH(CZ,0);"                    "
  6893. End If 
  6894. Return 
  6895. '
  6896. DEFBRIGHT:
  6897. Sprite 1,X Hard(2,X),Y Hard(2,Y),3
  6898. M=Mouse Click : If M=0 Then Return 
  6899. X=(X*MU)+XO : Y=(Y*MU)+YO
  6900. ZOSHO[CZ,4]
  6901. ZOGET[X,Y] : P=Param : If P>=0 Then CZ=P
  6902. ZOSHO[CZ,10]
  6903. If CZ<0 Then Return 
  6904. If M=1
  6905.    Screen 0 : Locate TXP,2 : Print "Zone Brightness: ";ZB(CZ);"       "
  6906. End If 
  6907. If M=2
  6908.    Curs Off 
  6909.    Screen 0 : Locate TXP,2 : Print "Enter brightness for this zone:"
  6910.    Locate TXP,3 : Print "Current brightness: ";ZB(CZ)
  6911.    Locate TXP,4 : Input "New brightness: ";ZB(CZ)
  6912.    Curs Off 
  6913.    Ink 0 : Bar TXP*8,8*2 To 640,80
  6914.    Locate TXP,2 : Print "Zone Brightness: ";ZB(CZ);"                    "
  6915. End If 
  6916. Return 
  6917.  
  6918. DEFUPPERBRIGHT:
  6919. Sprite 1,X Hard(2,X),Y Hard(2,Y),3
  6920. M=Mouse Click : If M=0 Then Return 
  6921. X=(X*MU)+XO : Y=(Y*MU)+YO
  6922. ZOSHO[CZ,4]
  6923. ZOGET[X,Y] : P=Param : If P>=0 Then CZ=P
  6924. ZOSHO[CZ,10]
  6925. If CZ<0 Then Return 
  6926. If M=1
  6927.    Screen 0 : Locate TXP,2 : Print "UPPER Zone Brightness: ";UZB(CZ);"       "
  6928. End If 
  6929. If M=2
  6930.    Curs Off 
  6931.    Screen 0 : Locate TXP,2 : Print "Enter upper zone brightness:"
  6932.    Locate TXP,3 : Print "Current brightness: ";UZB(CZ)
  6933.    Locate TXP,4 : Input "New brightness: ";UZB(CZ)
  6934.    Curs Off 
  6935.    Ink 0 : Bar TXP*8,8*2 To 640,80
  6936.    Locate TXP,2 : Print "UPPER Zone Brightness: ";UZB(CZ);"                    "
  6937. End If 
  6938. Return 
  6939.  
  6940. DEFPOINTBRIGHT:
  6941. 'Sprite 1,X Hard(2,X),Y Hard(2,Y),3
  6942. 'M=Mouse Click : If M=0 Then Return  
  6943. 'X=(X*MU)+XO : Y=(Y*MU)+YO 
  6944. 'FINDNEAR[X,Y] 
  6945. 'CP=Param : OUTLINE[CP] : PTNUM[CP]
  6946. 'If M=1
  6947. '   PBR(CP)=(PDTA*$1000)+(PAN*$100)+(PBR and $FF)
  6948. 'End If  
  6949. '
  6950. 'If M=2
  6951. '   C=PBR(CP) : PDTA=(C/$1000) and $F : PAN=(C/$100) and $F : PBR=C and $FF
  6952. '   PBR=PBR+20 
  6953. '   PBR=PBR and $FF
  6954. '   PBR=PBR-20 
  6955. '   Gosub BRIGHTSLIDE
  6956. 'End If  
  6957. Return 
  6958.  
  6959. UPPERPRESETS:
  6960. If A$="1"
  6961.    For A=0 To ZP(CZ)-1
  6962.       ZPBR(CZ,A,3)=1
  6963.       ZPBR(CZ,A,2)=-1 and $FF
  6964.    Next 
  6965.    MESSAGE["Upper Zone bright; lit from above "]
  6966. Else If A$="2"
  6967.    For A=0 To ZP(CZ)-1
  6968.       ZPBR(CZ,A,3)=-1 and $FF
  6969.       ZPBR(CZ,A,2)=1
  6970.    Next 
  6971.    MESSAGE["Upper Zone bright; lit from below "]
  6972. Else If A$="3"
  6973.    For A=0 To ZP(CZ)-1
  6974.       ZPBR(CZ,A,3)=-15 and $FF
  6975.       ZPBR(CZ,A,2)=1
  6976.    Next 
  6977.    MESSAGE["Upper Zone bright bottom, dark top"]
  6978. Else If A$="4"
  6979.    For A=0 To ZP(CZ)-1
  6980.       ZPBR(CZ,A,3)=1
  6981.       ZPBR(CZ,A,2)=-15 and $FF
  6982.    Next 
  6983.    MESSAGE["Upper Zone bright top, dark bottom"]
  6984. Else If A$="5"
  6985.    For A=0 To ZP(CZ)-1
  6986.       ZPBR(CZ,A,3)=15
  6987.       ZPBR(CZ,A,2)=-15 and $FF
  6988.    Next 
  6989.    MESSAGE["Upper Zone dark, lit from above   "]
  6990. Else If A$="6"
  6991.    For A=0 To ZP(CZ)-1
  6992.       ZPBR(CZ,A,3)=-15 and $FF
  6993.       ZPBR(CZ,A,2)=15
  6994.    Next 
  6995.    MESSAGE["Upper Zone dark, lit from below   "]
  6996. Else If A$="7"
  6997.    For A=0 To ZP(CZ)-1
  6998.       C=ZO(CZ,A)
  6999.       ZPBR(CZ,A,3)=((C mod 5)+1)*$100+$F000
  7000.       ZPBR(CZ,A,2)=-15 and $FF
  7001.    Next 
  7002.    MESSAGE["Upper Zone Roof Glowing           "]
  7003. Else If A$="8"
  7004.    For A=0 To ZP(CZ)-1
  7005.       C=ZO(CZ,A)
  7006.       ZPBR(CZ,A,2)=((C mod 5)+1)*$100+$F000
  7007.       ZPBR(CZ,A,3)=-15 and $FF
  7008.    Next 
  7009.    MESSAGE["Upper Zone Floor Glowing          "]
  7010. Else If A$="9"
  7011.    For A=0 To ZP(CZ)-1
  7012.       C=ZO(CZ,A)
  7013.       ZPBR(CZ,A,3)=((C mod 5)+1)*$100+$F000
  7014.       ZPBR(CZ,A,2)=((C mod 5)+1)*$100+$F000
  7015.    Next 
  7016.    MESSAGE["Upper Zone Glowing in sync        "]
  7017. Else If A$="0"
  7018.    For A=0 To ZP(CZ)-1
  7019.       C=ZO(CZ,A)
  7020.       ZPBR(CZ,A,3)=((C mod 5)+1)*$100+$F000
  7021.       C=1000-ZO(CZ,A)
  7022.       ZPBR(CZ,A,2)=((C mod 5)+1)*$100+$F000
  7023.    Next 
  7024.    MESSAGE["Upper Zone Glowing out of sync    "]
  7025. End If 
  7026. Return 
  7027.  
  7028.  
  7029. PRESETS:
  7030. If A$="1"
  7031.    For A=0 To ZP(CZ)-1
  7032.       ZPBR(CZ,A,1)=1
  7033.       ZPBR(CZ,A,0)=-1 and $FF
  7034.    Next 
  7035.    MESSAGE["Zone bright; lit from above "]
  7036. Else If A$="2"
  7037.    For A=0 To ZP(CZ)-1
  7038.       ZPBR(CZ,A,1)=-1 and $FF
  7039.       ZPBR(CZ,A,0)=1
  7040.    Next 
  7041.    MESSAGE["Zone bright; lit from below "]
  7042. Else If A$="3"
  7043.    For A=0 To ZP(CZ)-1
  7044.       ZPBR(CZ,A,1)=-15 and $FF
  7045.       ZPBR(CZ,A,0)=1
  7046.    Next 
  7047.    MESSAGE["Zone bright bottom, dark top"]
  7048. Else If A$="4"
  7049.    For A=0 To ZP(CZ)-1
  7050.       ZPBR(CZ,A,1)=1
  7051.       ZPBR(CZ,A,0)=-15 and $FF
  7052.    Next 
  7053.    MESSAGE["Zone bright top, dark bottom"]
  7054. Else If A$="5"
  7055.    For A=0 To ZP(CZ)-1
  7056.       ZPBR(CZ,A,1)=15
  7057.       ZPBR(CZ,A,0)=-15 and $FF
  7058.    Next 
  7059.    MESSAGE["Zone dark, lit from above   "]
  7060. Else If A$="6"
  7061.    For A=0 To ZP(CZ)-1
  7062.       ZPBR(CZ,A,1)=-15 and $FF
  7063.       ZPBR(CZ,A,0)=15
  7064.    Next 
  7065.    MESSAGE["Zone dark, lit from below   "]
  7066. Else If A$="7"
  7067.    For A=0 To ZP(CZ)-1
  7068.       C=ZO(CZ,A)
  7069.       ZPBR(CZ,A,1)=((C mod 5)+1)*$100+$F000
  7070.       ZPBR(CZ,A,0)=-15 and $FF
  7071.    Next 
  7072.    MESSAGE["Zone Roof Glowing           "]
  7073. Else If A$="8"
  7074.    For A=0 To ZP(CZ)-1
  7075.       C=ZO(CZ,A)
  7076.       ZPBR(CZ,A,0)=((C mod 5)+1)*$100+$F000
  7077.       ZPBR(CZ,A,1)=-15 and $FF
  7078.    Next 
  7079.    MESSAGE["Zone Floor Glowing          "]
  7080. Else If A$="9"
  7081.    For A=0 To ZP(CZ)-1
  7082.       C=ZO(CZ,A)
  7083.       ZPBR(CZ,A,1)=((C mod 5)+1)*$100+$F000
  7084.       ZPBR(CZ,A,0)=((C mod 5)+1)*$100+$F000
  7085.    Next 
  7086.    MESSAGE["Zone Glowing in sync        "]
  7087. Else If A$="0"
  7088.    For A=0 To ZP(CZ)-1
  7089.       C=ZO(CZ,A)
  7090.       ZPBR(CZ,A,1)=((C mod 5)+1)*$100+$F000
  7091.       C=1000-ZO(CZ,A)
  7092.       ZPBR(CZ,A,0)=((C mod 5)+1)*$100+$F000
  7093.    Next 
  7094.    MESSAGE["Zone Glowing out of sync    "]
  7095. End If 
  7096. Return 
  7097.  
  7098.  
  7099. DEFUPPERROOFBRIGHT:
  7100. Sprite 1,X Hard(2,X),Y Hard(2,Y),3
  7101. X=(X*MU)+XO : Y=(Y*MU)+YO
  7102.  
  7103. Gosub UPPERPRESETS
  7104.  
  7105. If A$="g"
  7106.    FINDNEARZONE[CZ,X,Y]
  7107.    CP=Param
  7108.    OUTLINE[CP] : PTNUM[CP]
  7109.    For A=0 To ZP(CZ)-1
  7110.       If ZO(CZ,A)=CP
  7111.          C=ZPBR(CZ,A,3) : PDTA=(C/$1000) and $F : PAN=(C/$100) and $F : PBR=C and $FF
  7112.       End If 
  7113.    Next 
  7114.    PBR=PBR+20
  7115.    PBR=PBR and $FF
  7116.    PBR=PBR-20
  7117.    Gosub BRIGHTSLIDE
  7118. End If 
  7119. M=Mouse Click : If M=0 Then Return 
  7120.  
  7121. If M=2
  7122.    ZOSHO[CZ,4]
  7123.    ZOGET[X,Y]
  7124.    P=Param
  7125.    If P>=0
  7126.       CZ=P
  7127.    End If 
  7128.    ZOSHO[CZ,10]
  7129. End If 
  7130.  
  7131. If M=1
  7132.    FINDNEARZONE[CZ,X,Y]
  7133.    CP=Param
  7134.    OUTLINE[CP] : PTNUM[CP]
  7135.    For A=0 To ZP(CZ)-1
  7136.       If ZO(CZ,A)=CP
  7137.          ZPBR(CZ,A,3)=(PDTA*$1000)+(PAN*$100)+(PBR and $FF)
  7138.       End If 
  7139.    Next 
  7140. End If 
  7141.  
  7142. Return 
  7143.  
  7144. DEFUPPERFLOORBRIGHT:
  7145. Sprite 1,X Hard(2,X),Y Hard(2,Y),3
  7146. X=(X*MU)+XO : Y=(Y*MU)+YO
  7147. Gosub UPPERPRESETS
  7148.  
  7149. If A$="g"
  7150.    FINDNEARZONE[CZ,X,Y]
  7151.    CP=Param
  7152.    OUTLINE[CP] : PTNUM[CP]
  7153.    For A=0 To ZP(CZ)-1
  7154.       If ZO(CZ,A)=CP
  7155.          C=ZPBR(CZ,A,2) : PDTA=(C/$1000) and $F : PAN=(C/$100) and $F : PBR=C and $FF
  7156.       End If 
  7157.    Next 
  7158.    PBR=PBR+20
  7159.    PBR=PBR and $FF
  7160.    PBR=PBR-20
  7161.    Gosub BRIGHTSLIDE
  7162. End If 
  7163. M=Mouse Click : If M=0 Then Return 
  7164.  
  7165. If M=2
  7166.    ZOSHO[CZ,4]
  7167.    ZOGET[X,Y]
  7168.    P=Param
  7169.    If P>=0
  7170.       CZ=P
  7171.    End If 
  7172.    ZOSHO[CZ,10]
  7173. End If 
  7174.  
  7175. If M=1
  7176.    FINDNEARZONE[CZ,X,Y]
  7177.    CP=Param
  7178.    OUTLINE[CP] : PTNUM[CP]
  7179.    For A=0 To ZP(CZ)-1
  7180.       If ZO(CZ,A)=CP
  7181.          ZPBR(CZ,A,2)=(PDTA*$1000)+(PAN*$100)+(PBR and $FF)
  7182.       End If 
  7183.    Next 
  7184. End If 
  7185.  
  7186. Return 
  7187.  
  7188. DEFLOWERROOFBRIGHT:
  7189. Sprite 1,X Hard(2,X),Y Hard(2,Y),3
  7190. X=(X*MU)+XO : Y=(Y*MU)+YO
  7191. Gosub PRESETS
  7192.  
  7193. If A$="g"
  7194.    FINDNEARZONE[CZ,X,Y]
  7195.    CP=Param
  7196.    OUTLINE[CP] : PTNUM[CP]
  7197.    For A=0 To ZP(CZ)-1
  7198.       If ZO(CZ,A)=CP
  7199.          C=ZPBR(CZ,A,1) : PDTA=(C/$1000) and $F : PAN=(C/$100) and $F : PBR=C and $FF
  7200.       End If 
  7201.    Next 
  7202.    PBR=PBR+20
  7203.    PBR=PBR and $FF
  7204.    PBR=PBR-20
  7205.    Gosub BRIGHTSLIDE
  7206. End If 
  7207. M=Mouse Click : If M=0 Then Return 
  7208.  
  7209. If M=2
  7210.    ZOSHO[CZ,4]
  7211.    ZOGET[X,Y]
  7212.    P=Param
  7213.    If P>=0
  7214.       CZ=P
  7215.    End If 
  7216.    ZOSHO[CZ,10]
  7217. End If 
  7218.  
  7219. If M=1
  7220.    FINDNEARZONE[CZ,X,Y]
  7221.    CP=Param
  7222.    OUTLINE[CP] : PTNUM[CP]
  7223.    For A=0 To ZP(CZ)-1
  7224.       If ZO(CZ,A)=CP
  7225.          ZPBR(CZ,A,1)=(PDTA*$1000)+(PAN*$100)+(PBR and $FF)
  7226.       End If 
  7227.    Next 
  7228. End If 
  7229.  
  7230. Return 
  7231.  
  7232.  
  7233. DEFLOWERFLOORBRIGHT:
  7234. Sprite 1,X Hard(2,X),Y Hard(2,Y),3
  7235. X=(X*MU)+XO : Y=(Y*MU)+YO
  7236. Gosub PRESETS
  7237.  
  7238. If A$="g"
  7239.    FINDNEARZONE[CZ,X,Y]
  7240.    CP=Param
  7241.    OUTLINE[CP] : PTNUM[CP]
  7242.    For A=0 To ZP(CZ)-1
  7243.       If ZO(CZ,A)=CP
  7244.          C=ZPBR(CZ,A,0) : PDTA=(C/$1000) and $F : PAN=(C/$100) and $F : PBR=C and $FF
  7245.       End If 
  7246.    Next 
  7247.    PBR=PBR+20
  7248.    PBR=PBR and $FF
  7249.    PBR=PBR-20
  7250.    Gosub BRIGHTSLIDE
  7251. End If 
  7252. M=Mouse Click : If M=0 Then Return 
  7253.  
  7254. If M=2
  7255.    ZOSHO[CZ,4]
  7256.    ZOGET[X,Y]
  7257.    P=Param
  7258.    If P>=0
  7259.       CZ=P
  7260.    End If 
  7261.    ZOSHO[CZ,10]
  7262. End If 
  7263.  
  7264. If M=1
  7265.    FINDNEARZONE[CZ,X,Y]
  7266.    CP=Param
  7267.    OUTLINE[CP] : PTNUM[CP]
  7268.    For A=0 To ZP(CZ)-1
  7269.       If ZO(CZ,A)=CP
  7270.          ZPBR(CZ,A,0)=(PDTA*$1000)+(PAN*$100)+(PBR and $FF)
  7271.       End If 
  7272.    Next 
  7273. End If 
  7274.  
  7275. Return 
  7276.  
  7277. '
  7278. Procedure ZOGET[X,Y]
  7279.    P=-1
  7280.    If NZ=-1 Then Goto 7
  7281.    For A=0 To NZ
  7282.       If ZP(A)=0 Then Goto 3
  7283.       B=0
  7284.       Repeat 
  7285.          X1=PX(ZO(A,B))
  7286.          X2=PX(ZO(A,B+1))
  7287.          Y1=PY(ZO(A,B))
  7288.          Y2=PY(ZO(A,B+1))
  7289.          Y2=Y2-Y1 : X2=X2-X1
  7290.          X1=X-X1 : Y1=Y-Y1
  7291.          D=(X1*Y2)-(Y1*X2)
  7292.          If D>0 Then Goto 3
  7293.          Add B,1
  7294.       Until B=ZP(A)
  7295.       P=A : A=NZ+1
  7296.       3
  7297.    Next A
  7298.    7
  7299. End Proc[P]
  7300. '
  7301. PTMOVE:
  7302. X=X and SC : Y=Y and SC
  7303. Sprite 1,X Hard(2,X),Y Hard(2,Y),3
  7304. M=Mouse Click : If M=0 Then Return 
  7305. X=(X*MU)+XO : Y=(Y*MU)+YO
  7306. If M=2 Then FINDNEAR[X,Y] : CP=Param : OUTLINE[CP] : PTNUM[CP]
  7307. If CP=-1 Then Return 
  7308. If M=1 Then PX(CP)=X : PY(CP)=Y : Gosub REDRAW
  7309. Return 
  7310. '
  7311. Procedure PTNUM[P]
  7312.    S=Screen
  7313.    Screen 0
  7314.    Locate TXP+27,0 : Print "Point: ";P;"   ";
  7315.    Screen S
  7316. End Proc
  7317. '
  7318. DEFWALL:
  7319. Sprite 1,X Hard(2,X),Y Hard(2,Y),3
  7320. If A$="," and CZ>0 Then ZOSHO[CZ,4] : CZ=CZ-1 : ZOSHO[CZ,10]
  7321. If A$="." and CZ<NZ-1 Then ZOSHO[CZ,4] : CZ=CZ+1 : ZOSHO[CZ,10]
  7322. X=(X*MU)+XO : Y=(Y*MU)+YO
  7323. If A$="d" and CZ>=0 and ZD(CZ)=0 and ZLI(CZ)=0
  7324.    T=1
  7325.    For A=0 To ZP(CZ)-1
  7326.       If WD(CZ,A)>0 or WLI(CZ,A)>0
  7327.          T=0 : A=100
  7328.       End If 
  7329.    Next 
  7330.    If T<>0
  7331.       USED(CZ)=0 : ZP(CZ)=0 : Gosub REDRAW
  7332.    End If 
  7333. End If 
  7334. If A$="b"
  7335.    FINDNEARZONE[CZ,X,Y] : P=Param
  7336.    For A=0 To ZP(CZ)-1
  7337.       If ZO(CZ,A)=P and(WT(CZ,A)=0 or WT(CZ,A)=3)
  7338.          WT(CZ,A)=3-WT(CZ,A) : JOIN[ZO(CZ,A),ZO(CZ,A+1),10+WT(CZ,A)]
  7339.       End If 
  7340.    Next 
  7341. End If 
  7342. If A$="v"
  7343.    FINDNEARZONE[CZ,X,Y] : P=Param
  7344.    For A=0 To ZP(CZ)-1
  7345.       If ZO(CZ,A)=P and(WT(CZ,A)=0 or WT(CZ,A)=4)
  7346.          WT(CZ,A)=4-WT(CZ,A) : JOIN[ZO(CZ,A),ZO(CZ,A+1),10+WT(CZ,A)]
  7347.       End If 
  7348.    Next 
  7349. End If 
  7350. M=Mouse Click : If M=0 Then Return 
  7351. If M=2 : 
  7352.    ZOSHO[CZ,4]
  7353.    ZOGET[X,Y]
  7354.    P=Param
  7355.    If P>=0
  7356.       CZ=P
  7357.    End If 
  7358.    ZOSHO[CZ,10]
  7359.    Goto 9
  7360. End If 
  7361. FINDNEARZONE[CZ,X,Y] : P=Param
  7362. For A=0 To ZP(CZ)-1
  7363.    If WT(CZ,A)<2
  7364.       If ZO(CZ,A)=P
  7365.          WT(CZ,A)=1-WT(CZ,A) : JOIN[ZO(CZ,A),ZO(CZ,A+1),10+WT(CZ,A)]
  7366.       End If 
  7367.    End If 
  7368. Next 
  7369. 9
  7370. Return 
  7371. '
  7372. DEFZONE:
  7373. Sprite 1,X Hard(2,X),Y Hard(2,Y),3
  7374. M=Mouse Click : If M=0 Then Return 
  7375. If ZP(CZ)=0 Then Gosub NEWZONE : Return 
  7376. X=X*MU+XO : Y=Y*MU+YO
  7377. If NP=-1 Then Return 
  7378. FINDNEAR[X,Y] : CP=Param
  7379. If ZP(CZ)<3 and CP=ZO(CZ,0) Then Return 
  7380.  
  7381. If ZP(CZ)>1
  7382.    T=1
  7383.    For A=1 To ZP(CZ)-1
  7384.       If CP=ZO(CZ,A)
  7385.          T=0
  7386.       End If 
  7387.    Next 
  7388.    If T=0
  7389.       Return 
  7390.    End If 
  7391. End If 
  7392.  
  7393. OUTLINE[CP]
  7394.  
  7395. ZO(CZ,ZP(CZ))=CP
  7396. F=ZO(CZ,ZP(CZ)-1) : T=ZO(CZ,ZP(CZ))
  7397. WT(CZ,ZP(CZ)-1)=1
  7398. For Q=0 To NZ-1
  7399.    If USED(Q)
  7400.       For B=0 To ZP(Q)-1
  7401.          If ZO(Q,B)=T and ZO(Q,B+1)=F
  7402.             WT(CZ,ZP(CZ)-1)=0
  7403.             WT(Q,B)=0
  7404.             Q=NZ+1 : B=100
  7405.          End If 
  7406.       Next 
  7407.    End If 
  7408. Next 
  7409. If ZP(CZ)>0 Then JOIN[ZO(CZ,ZP(CZ)-1),ZO(CZ,ZP(CZ)),3]
  7410. If ZO(CZ,0)=ZO(CZ,ZP(CZ))
  7411.    Gosub REDRAW : ZOSHO[CZ,4] : USED(CZ)=1
  7412.    If CZ=NZ
  7413.       Add NZ,1
  7414.    End If 
  7415.    Gosub INITDEFZONE
  7416. Else 
  7417.    Add ZP(CZ),1
  7418. End If 
  7419. Return 
  7420. '
  7421. Procedure ZOSHO[Z,C]
  7422.    If Z<0 Then Pop Proc
  7423.    If ZP(Z)=0 Then Pop Proc
  7424.    X=0 : Y=0
  7425.    HI1=HILITE(HILITE,0) : HI2=HILITE(HILITE,1)
  7426.    For A=0 To ZP(Z)-1
  7427.       X=X+PX(ZO(Z,A)) : Y=Y+PY(ZO(Z,A))
  7428.       CC=2
  7429.       CC=WT(Z,A)+C
  7430.       If WT(Z,A)>1 Then CC=C+2
  7431.       If WT(Z,A)=HI1 Then CC=C+3
  7432.       If WT(Z,A)=HI2 Then CC=C+4
  7433.       If C=0 Then CC=0
  7434.       JOIN[ZO(Z,A),ZO(Z,A+1),CC]
  7435.    Next 
  7436.    If ZD(Z)>0
  7437.       Ink 2,0
  7438.       X=X/ZP(Z) : Y=Y/ZP(Z) : X=(X-XO)/MU : Y=(Y-YO)/MU : M$="D"+Chr$(ZD(Z)+64) : Text X-8,Y+4,M$
  7439.    Else If ZLI(Z)>0
  7440.       Ink 2,0
  7441.       X=X/ZP(Z) : Y=Y/ZP(Z) : X=(X-XO)/MU : Y=(Y-YO)/MU : M$="L"+Chr$(ZLI(Z)+64) : Text X-8,Y+4,M$
  7442.    End If 
  7443.    If Z=EZONE
  7444.       Ink 3,0
  7445.       X=X/ZP(Z) : Y=Y/ZP(Z) : X=(X-XO)/MU : Y=(Y-YO)/MU : M$="END" : Text X-12,Y+4,M$
  7446.    End If 
  7447.    For A=0 To 7
  7448.       If SWWL(A,0)=Z
  7449.          B=SWWL(A,1)
  7450.          LX=PX(ZO(Z,B)) : LY=PY(ZO(Z,B))
  7451.          RX=PX(ZO(Z,B+1)) : RY=PY(ZO(Z,B+1))
  7452.          MX=(LX+RX)/2
  7453.          MY=(LY+RY)/2
  7454.          MX=(MX-XO)/MU
  7455.          MY=(MY-YO)/MU
  7456.          Ink 1,0
  7457.          M$="S"+(Str$(A)-" ") : Text MX-8,MY,M$
  7458.          If HILITE=4
  7459.             JOIN[ZO(Z,B),ZO(Z,B+1),C+3]
  7460.          End If 
  7461.       End If 
  7462.    Next 
  7463.    'JOIN[ZO(Z,ZP(Z)),ZO(Z,0),C] 
  7464. End Proc
  7465. '
  7466. Procedure ZOFILL[Z,C,F]
  7467.    Screen 2
  7468.    If Z<0 Then Pop Proc
  7469.    If ZP(Z)<3 Then Pop Proc
  7470.    Ink F
  7471.    X1=PX(ZO(Z,0)) : Y1=PY(ZO(Z,0))
  7472.    X2=PX(ZO(Z,1)) : Y2=PY(ZO(Z,1))
  7473.    X1=(X1-XO)/MU : Y1=(Y1-YO)/MU
  7474.    X2=(X2-XO)/MU : Y2=(Y2-YO)/MU
  7475.    For A=1 To ZP(Z)-2
  7476.       X3=PX(ZO(Z,A+1)) : Y3=PY(ZO(Z,A+1))
  7477.       X3=(X3-XO)/MU : Y3=(Y3-YO)/MU
  7478.       Polygon X1,Y1 To X2,Y2 To X3,Y3
  7479.       X2=X3 : Y2=Y3
  7480.    Next 
  7481.    ZOSHO[Z,C]
  7482. End Proc
  7483. '
  7484. Procedure CONNECTED[A,B,P]
  7485.    
  7486.    If A=P or B=P Then C1=12 : C2=15 : C3=13 Else C1=6 : C2=8 : C3=7
  7487.    
  7488.    If REDCPT=0 Then Goto 320
  7489.    N=Start(11)
  7490.    Q=Peek(N+A*100+B) : W=Peek(N+B*100+A)
  7491.    If Q or W
  7492.       
  7493.       If Q=1 and W=1 and REDCPT<>2
  7494.          JOINCOORDS[CPTX(A),CPTY(A),CPTX(B),CPTY(B),C1]
  7495.       End If 
  7496.       If Q=2 and W=2 and REDCPT<>1
  7497.          JOINCOORDS[CPTX(A),CPTY(A),CPTX(B),CPTY(B),C2]
  7498.       End If 
  7499.       If Q=1 and W=2 and REDCPT<>2
  7500.          
  7501.          JOINCOORDS[CPTX(A),CPTY(A),CPTX(B),CPTY(B),C3]
  7502.          XD=CPTX(B)-CPTX(A)
  7503.          YD=CPTY(B)-CPTY(A)
  7504.          LD=Sqr(XD^2+YD^2)
  7505.          XD=(XD*30)/LD
  7506.          YD=(YD*30)/LD
  7507.          
  7508.          
  7509.          JOINCOORDS[CPTX(B)-XD,CPTY(B)-YD,CPTX(B)-XD*2-YD/2,CPTY(B)-YD*2+XD/2,C3]
  7510.          JOINCOORDS[CPTX(B)-XD,CPTY(B)-YD,CPTX(B)-XD*2+YD/2,CPTY(B)-YD*2-XD/2,C3]
  7511.       End If 
  7512.       If Q=2 and W=1
  7513.          XD=CPTX(B)-CPTX(A)
  7514.          YD=CPTY(B)-CPTY(A)
  7515.          LD=Sqr(XD^2+YD^2)
  7516.          XD=(XD*30)/LD
  7517.          YD=(YD*30)/LD
  7518.          JOINCOORDS[CPTX(A),CPTY(A),CPTX(B),CPTY(B),C3]
  7519.          
  7520.          JOINCOORDS[CPTX(A)+XD,CPTY(A)+YD,CPTX(A)+XD*2-YD/2,CPTY(A)+YD*2+XD/2,C3]
  7521.          JOINCOORDS[CPTX(A)+XD,CPTY(A)+YD,CPTX(A)+XD*2+YD/2,CPTY(A)+YD*2-XD/2,C3]
  7522.       End If 
  7523.    End If 
  7524.    320
  7525. End Proc
  7526. '
  7527. NEWZONE:
  7528. X=X*MU+XO : Y=Y*MU+YO
  7529. If NP=-1 Then Return 
  7530. FINDNEAR[X,Y] : CP=Param
  7531. OUTLINE[CP]
  7532. ZO(CZ,0)=CP
  7533. ZP(CZ)=1
  7534. Return 
  7535. '
  7536. Procedure JOIN[SP,EP,C]
  7537.    Screen 2
  7538.    Ink C
  7539.    X1=(PX(SP)-XO)/MU : Y1=(PY(SP)-YO)/MU
  7540.    X2=(PX(EP)-XO)/MU : Y2=(PY(EP)-YO)/MU
  7541.    If Y1>Y2
  7542.       X1=X1+1 : X2=X2+1
  7543.       Swap X1,X2 : Swap Y1,Y2
  7544.    End If 
  7545.    If X2>X1
  7546.       Y1=Y1+1 : Y2=Y2+1
  7547.    End If 
  7548.    Extension   X1,Y1 To X2,Y2
  7549. End Proc
  7550. '
  7551. Procedure JOINCOORDS[X1,Y1,X2,Y2,C]
  7552.    Screen 2
  7553.    Ink C
  7554.    X1=(X1-XO)/MU
  7555.    X2=(X2-XO)/MU
  7556.    Y1=(Y1-YO)/MU
  7557.    Y2=(Y2-YO)/MU
  7558.    If Y1>Y2
  7559.       Swap X1,X2 : Swap Y1,Y2
  7560.    End If 
  7561.    Extension   X1,Y1 To X2,Y2
  7562. End Proc
  7563. '
  7564. Procedure FINDNEAR[X,Y]
  7565.    MD=10000000
  7566.    P=-1
  7567.    If NP=-1 Then Goto 22
  7568.    For A=0 To NP
  7569.       D=(X-PX(A))^2+(Y-PY(A))^2
  7570.       If D<MD Then MD=D : P=A
  7571.    Next 
  7572.    22
  7573. End Proc[P]
  7574. Procedure FINDNEARZONE[Z,X,Y]
  7575.    MD=10000000
  7576.    P=-1
  7577.    If NP=-1 Then Goto 22
  7578.    For B=0 To ZP(Z)-1
  7579.       A=ZO(Z,B)
  7580.       D=(X-PX(A))^2+(Y-PY(A))^2
  7581.       If D<MD Then MD=D : P=A
  7582.    Next 
  7583.    22
  7584. End Proc[P]
  7585. '
  7586. Procedure FINDOBJ[X,Y]
  7587.    MD=10000000
  7588.    P=-1
  7589.    If NO<=0 Then Goto 22
  7590.    For A=0 To NO-1
  7591.       D=(X-OBX(A))^2+(Y-OBZ(A))^2
  7592.       If D<MD Then MD=D : P=A
  7593.    Next 
  7594.    22
  7595. End Proc[P]
  7596. '
  7597. PTADD:
  7598. X=X and SC : Y=Y and SC
  7599. Sprite 1,X Hard(2,X),Y Hard(2,Y),3
  7600. M=Mouse Click
  7601. If M=0 Then Return 
  7602. Add NP,1
  7603. CP=NP
  7604. X=X*MU : Y=Y*MU : X=X+XO : Y=Y+YO
  7605. PX(NP)=X : PY(NP)=Y
  7606. PTSHOW[X,Y,1]
  7607. PTNUM[CP]
  7608. OUTLINE[CP]
  7609. Return 
  7610. '
  7611. Procedure OUTLINE[PT]
  7612.    If PT<0 Then Pop Proc
  7613.    X=PX(PT) : Y=PY(PT)
  7614.    X=(X-XO)/MU : Y=(Y-YO)/MU
  7615.    Sprite 2,X Hard(2,X-3),Y Hard(2,Y-3),4
  7616. End Proc
  7617. '
  7618. Procedure HIGHCONT[PT]
  7619.    If PT<0 Then Pop Proc
  7620.    X=CPTX(PT) : Y=CPTY(PT)
  7621.    X=(X-XO)/MU : Y=(Y-YO)/MU
  7622.    Sprite 2,X Hard(2,X-3),Y Hard(2,Y-3),4
  7623. End Proc
  7624. '
  7625. Procedure HIGHCOORDS[X,Y,N,C]
  7626.    X=(X-XO)/MU : Y=(Y-YO)/MU
  7627.    Sprite N,X Hard(2,X-3),Y Hard(2,Y-3),C
  7628. End Proc
  7629. '
  7630. Procedure PTSHOW[X,Y,C]
  7631.    If C<>-1
  7632.       Screen 2
  7633.       Paste Bob(X-XO)/MU-1,(Y-YO)/MU-1,2
  7634.    Else 
  7635.       X=(X-XO)/MU : Y=(Y-YO)/MU
  7636.       Ink 3 : Text X-8,Y+4,"P1"
  7637.    End If 
  7638. End Proc
  7639. '
  7640. Procedure CPTPUT[X,Y,C]
  7641.    Screen 2
  7642.    X=(X-XO)/MU
  7643.    Y=(Y-YO)/MU
  7644.    Ink C
  7645.    Box X-2,Y-2 To X+2,Y+2
  7646.    Draw X,Y-4 To X,Y+4
  7647.    Draw X-4,Y To X+4,Y
  7648. End Proc
  7649. '
  7650. Procedure PTCLR[X,Y]
  7651.    Screen 2
  7652.    X=(X-XO)/MU-1
  7653.    Y=(Y-YO)/MU-1
  7654.    Ink 0 : Box X,Y To X+2,Y+2
  7655. End Proc
  7656. '
  7657. MOVEPT:
  7658. If NP=-1 Then Return 
  7659. X=MU*MU : Y=MU*MU : X=X+XO : Y=Y+YO
  7660. PTCLR[PX(NP),PY(NP)]
  7661. PX(NP)=X : PY(NP)=Y
  7662. PTSHOW[X,Y,1]
  7663. Return 
  7664. '
  7665. Procedure GRID
  7666.    S=Screen
  7667.    Screen 1
  7668.    Cls 0
  7669.    Ink 1
  7670.    For A=0 To 304 Step 128/MU
  7671.       Extension   0,A To 320,A
  7672.       Extension   A,0 To A,200
  7673.    Next 
  7674.    Screen S
  7675. End Proc
  7676. '
  7677. Procedure SHINEBOX[OP,C]
  7678.    X=(OP/3)-EBX : Y=OP mod 3
  7679.    If X<6
  7680.       S=Screen
  7681.       Screen 0 : Ink C : Box X*32,Y*16 To X*32+31,Y*16+15
  7682.       Screen S
  7683.    End If 
  7684. End Proc
  7685. '
  7686. Procedure ZOUT[P,C]
  7687.    X=(P mod 11)*40+TXP*8-4
  7688.    Y=(P/11)*8+15
  7689.    S=Screen
  7690.    Screen 0 : Ink C : Box X,Y To X+39,Y+8
  7691.    Screen S
  7692. End Proc
  7693.