home *** CD-ROM | disk | FTP | other *** search
/ The CIA World Factbook 1992 / k3bimage.iso / sel / 12 / 0103 / decorate.bas (.txt) < prev    next >
Encoding:
GW-BASIC  |  1991-12-02  |  31.5 KB  |  786 lines

  1. 3  COMMON ADDR.%, CLOCK.ON%
  2. 4  KEY OFF:KEY(8) ON:ON KEY(8) GOSUB 60000
  3. 5  DEF SEG = 0: IF (PEEK(&H410) AND &H30) <> &H30 THEN GRAPH.ICS=1
  4. 6  IF GRAPH.ICS THEN FC=3: BC=0 ELSE GOSUB 28000
  5. 7  DEF SEG:IF PEEK(3)<>195 AND PEEK(6)<>0 THEN IBMPC=0 ELSE IBMPC=1
  6. 8  SCREEN 2:CLS
  7. 10  DIM FU$(100,8),PA(4000),UL(20),UR(20),LL(20),LR(20),DO#(12,5),PF#(12,5),WD#(12,5)
  8. 90  METRIC=0
  9. 91  PI=3.14159
  10. 92  RADFAC=180/PI
  11. 94  GOSUB 7800
  12. 100  '
  13. 110  SCREEN 2
  14. 120  CLS
  15. 130  GOSUB 10000
  16. 300  '
  17. 301  IF IBMPC THEN DEF SEG:OUT &H3D9,2
  18. 302  ON ERROR GOTO 390
  19. 303  LOCATE 12,25:PRINT "Loading furniture from disk..."
  20. 305  OPEN "i",#2,"DECOFURN.FRN"
  21. 310  FURNNO=1
  22. 312  IF EOF(2)=0 THEN 315 ELSE 379
  23. 315  FOR SUBLOOP= 1 TO 8:INPUT #2,FU$(FURNNO,SUBLOOP):NEXT SUBLOOP
  24. 316  LOCATE 14,29:PRINT "Furniture number : ";FURNNO
  25. 320  FURNNO=FURNNO+1:GOTO 312
  26. 379  CLOSE #2:FURNNO=FURNNO-1
  27. 380  ON ERROR GOTO 40000:GOTO 400
  28. 390  '
  29. 391  IF ERL=305 AND ERR=53 THEN CLOSE #2:OPEN "O",#2,"DECOFURN.FRN":CLOSE #2:RESUME 380
  30. 400  '
  31. 500  '
  32. 501  IF IBMPC THEN DEF SEG:OUT &H3D9,2
  33. 505  CLS
  34. 506  X=140:Y=40:GOSUB 10010
  35. 507  LOCATE 10,35:PRINT "MAIN MENU";
  36. 508  LINE(264,68)-(272+78,82),1,B
  37. 510  LOCATE 13,26:PRINT "1. Design a room."
  38. 520  LOCATE 14,26:PRINT "2. Create, delete, or view furniture."
  39. 530  LOCATE 15,26:PRINT "3. Work in a room."
  40. 532  LOCATE 16,26:PRINT "4. Change to ";:IF METRIC THEN PRINT "feet and inches."; ELSE PRINT "metric.               ";
  41. 533  LOCATE 17,26:PRINT "5. Remove furniture from all rooms."
  42. 535  LOCATE 18,26:PRINT "6. Exit to ";:IF ADDR.% THEN PRINT "the Magazette."; ELSE PRINT "BASIC.";
  43. 540  GOSUB 8000
  44. 550  IF VAL(I$)<1 OR VAL(I$)>6 THEN 540
  45. 560  CLS:ON VAL(I$) GOTO 1000,2000,3000,4000,4100,60000
  46. 1000  '
  47. 1001  RFN$="":PERMFIXNO=0:DOORNO=0:WINDNO=0
  48. 1002  CLS
  49. 1004  X=20:Y=20:GOSUB 12000
  50. 1005  LOCATE 1,57:PRINT "ROOM DESIGN";
  51. 1006  LOCATE 3,48:PRINT "Press ESC to return to the";:LOCATE 4,48:PRINT "main menu or any other key";:LOCATE 5,48:PRINT "to design a room.";
  52. 1007  DEF SEG=0:POKE &H41A,PEEK(&H41C)
  53. 1008  I$=INKEY$:IF I$="" THEN 1008 ELSE IF I$=CHR$(27) THEN 500
  54. 1010  LOCATE 7,48:PRINT "Please enter the room dim-"
  55. 1012  LOCATE 8,48:PRINT "ensions in ";:IF METRIC THEN PRINT "meters."; ELSE PRINT "feet and inches.";
  56. 1020  LOCATE 10,50:PRINT "width: ";:GOSUB 7000:WDTH#=NUM:LOCATE 11,50:PRINT "length: ";:GOSUB 7000:LENGTH#=NUM
  57. 1030  IF WDTH#>LENGTH# THEN SCALE#=360/WDTH# ELSE SCALE#=360/LENGTH#
  58. 1040  CLS:LINE(0,0)-(INT(WDTH#*SCALE#),INT(LENGTH#*SCALE#/2)),1,B
  59. 1042  LINE(1,1)-(INT(WDTH#*SCALE#)-1,INT(LENGTH#*SCALE#/2)-1),1,B
  60. 1043  LINE(2,1)-(INT(WDTH#*SCALE#)-2,INT(LENGTH#*SCALE#/2)-1),1,B
  61. 1045  GOSUB 7100
  62. 1090  LOCATE 20,WDTH#*SCALE#\8+2:NUM=LENGTH#:GOSUB 7075:LOCATE (LENGTH#*SCALE#/2)\8+2,(WDTH#*SCALE#/2)\8+1:NUM=WDTH#:GOSUB 7075
  63. 1095  RTN$=""
  64. 1100  '
  65. 1101  LOCATE 14,1:GOSUB 7100
  66. 1105  LOCATE 1,48:PRINT "   WORKING IN ";LEFT$(RFN$,8);" ROOM   "
  67. 1110  IF DOORNO<12 THEN LOCATE 3,48:PRINT "1. Add a door                  ";
  68. 1111  IF WINDNO<12 THEN LOCATE 4,48:PRINT "2. Add a window                ";
  69. 1112  IF PERMFIXNO <12 THEN LOCATE 5,48:PRINT "3. Add a permanent fixture     ";
  70. 1113  LOCATE 6,48:PRINT "4. Save this room and continue ";
  71. 1114  LOCATE 7,48:PRINT "5. Work with furniture         ";
  72. 1115  LOCATE 8,48:PRINT "6. Remove all furniture        ";
  73. 1116  LOCATE 9,48:PRINT "7. View the furniture          ";
  74. 1117  LOCATE 10,48:PRINT "8. Return to main menu         ";
  75. 1119  IF PERMFIXNO=0 AND DOORNO=0 AND WINDOWNO=0 THEN  LOCATE 11,48:PRINT "9. Redo room size.       ";:ABLETOREDO=1
  76. 1120  GOSUB 8050
  77. 1122  IF VAL(I$)<1 OR VAL(I$)>9 THEN LOCATE CSRLIN-3,40:GOTO 1116 ELSE IF I$="9" AND ABLETOREDO=0 THEN 1116
  78. 1130  GOSUB 7100:ON VAL(I$) GOTO 1300,1400,1500,1600,3100,4200,2500,500,1000
  79. 1300  IF DOORNO>11 THEN GOTO 1100
  80. 1301  HINGEDONE=0:DOINGDOOR=1:DOORNO=DOORNO+1:LOCATE 3,48:PRINT "Point to the point where the";: LOCATE 4,48:PRINT "HINGE should be, then press" ;:LOCATE 5,48:PRINT "ENTER.";
  81. 1302  XP#=0:YP#=0
  82. 1304  GOSUB 7200
  83. 1305  DEX1#=XP#:DEY1#=YP#
  84. 1306  HINGEDONE=1:GOSUB 7900:DO#(DOORNO,1)=XP#/SCALE#:DO#(DOORNO,2)=YP#/SCALE#*2
  85. 1307  GOSUB 7100:LOCATE 3,48:PRINT "Now move the arrow to the";: LOCATE 4,48:PRINT "opening edge of the door";: LOCATE 5,48:PRINT "then press ENTER. ";
  86. 1310  IF XP#=0 OR YP#=0 THEN DRAW "D4U4R8L8" ELSE DRAW "U4D4L8R8"
  87. 1317  GOSUB 7200: DO#(DOORNO,3)=XP#/SCALE#:DO#(DOORNO,4)=YP#/SCALE#*2:DEX2#=XP#:DEY2#=YP#
  88. 1318  IF XP#=0 OR YP#=0 THEN DRAW "D4U4R8L8" ELSE DRAW "U4D4L8R8"
  89. 1319  GOSUB 7900:LOCATE 16,50:GOSUB 7100
  90. 1320  IF XP#=0 THEN WALL=4
  91. 1321  IF YP#=0 THEN WALL=1
  92. 1322  IF XP#=WDTH#*SCALE# THEN WALL=2
  93. 1323  IF YP#=LENGTH#*SCALE#/2 THEN WALL=3
  94. 1325  LOCATE 3,48:PRINT "Does the door open in or out?";:LOCATE 4,48:PRINT "(I or O)  ";:GOSUB 8000
  95. 1326  IF I$<>"O" AND I$<>"I" THEN 1325
  96. 1327  IF I$="O" THEN DO#(DOORNO,5)=1:GOTO 1380
  97. 1330  IF WALL=1 AND DO#(DOORNO,1) < DO#(DOORNO,3) THEN SP=3*PI/2:EP=2*PI
  98. 1331  IF WALL=1 AND DO#(DOORNO,1) > DO#(DOORNO,3) THEN SP=PI:EP=3*PI/2
  99. 1332  IF WALL=2 AND DO#(DOORNO,2) < DO#(DOORNO,4) THEN SP=PI:EP=3*PI/2
  100. 1333  IF WALL=2 AND DO#(DOORNO,2) > DO#(DOORNO,4) THEN SP=PI/2:EP=PI
  101. 1334  IF WALL=3 AND DO#(DOORNO,1) < DO#(DOORNO,3) THEN SP=2*PI:EP=PI/2
  102. 1335  IF WALL=3 AND DO#(DOORNO,1) > DO#(DOORNO,3) THEN SP=PI/2:EP=PI
  103. 1336  IF WALL=4 AND DO#(DOORNO,2) < DO#(DOORNO,4) THEN SP=3*PI/2:EP=2*PI
  104. 1337  IF WALL=4 AND DO#(DOORNO,2) > DO#(DOORNO,4) THEN SP=2*PI:EP=PI/2
  105. 1340  CIRCLE(INT(DO#(DOORNO,1)*SCALE#),INT(DO#(DOORNO,2)*SCALE#/2)),INT(DOORWDTH*SCALE#),1,SP*(-1),EP*(-1),0.5
  106. 1345  DO#(DOORNO,5)=-1
  107. 1380  '
  108. 1381  IF WALL=1 THEN LINE(DEX1#,DEY1#)-(DEX2#,DEY2#+1),0,BF
  109. 1382  IF WALL=2 THEN LINE(DEX1#,DEY1#)-(DEX2#-2,DEY2#),0,BF
  110. 1383  IF WALL=3 THEN LINE(DEX1#,DEY1#)-(DEX2#,DEY2#-1),0,BF
  111. 1384  IF WALL=4 THEN LINE(DEX1#,DEY1#)-(DEX2#+2,DEY2#),0,BF
  112. 1390  GOSUB 7100
  113. 1399  HINGEDONE=0:DOINGDOOR=0:GOTO 1100
  114. 1400  IF WINDNO>11 THEN GOTO 1100
  115. 1401  DOINGWIND=1:DOINGDOOR=1:WINDNO=WINDNO+1:LOCATE 3,48:PRINT "Move the arrow to one end of";: LOCATE 4,48:PRINT "the window and press ENTER.";
  116. 1402  XP#=0:YP#=0
  117. 1404  GOSUB 7200
  118. 1406  HINGEDONE=1:GOSUB 7900:WD#(WINDNO,1)=XP#/SCALE#:WD#(WINDNO,2)=YP#/SCALE#*2
  119. 1407  GOSUB 7100:LOCATE 3,48:PRINT "Now move the arrow to the";: LOCATE 4,48:PRINT "other end of the window.";: LOCATE 5,48:PRINT "then press ENTER. ";
  120. 1410  IF XP#=0 THEN DRAW "C0R3L3" ELSE IF YP#=0 THEN DRAW "C0D2U2" ELSE IF XP#=WDTH#*SCALE# THEN DRAW  "C0L2R2" ELSE DRAW "C0U2D2"
  121. 1417  GOSUB 7200:WD#(WINDNO,3)=XP#/SCALE#:WD#(WINDNO,4)=YP#/SCALE#*2
  122. 1418  '
  123. 1419  GOSUB 7900:LOCATE 16,50:GOSUB 7100
  124. 1420  X1=INT(WD#(WINDNO,1)*SCALE#):Y1=INT(WD#(WINDNO,2)*SCALE#/2):X2=INT(WD#(WINDNO,3)*SCALE#):Y2=INT(WD#(WINDNO,4)*SCALE#/2)
  125. 1430  IF XP#=0 THEN LINE(X1+1,Y1)-(X2+1,Y2),0:LINE(X1+2,Y1)-(X2+2,Y2),0
  126. 1431  IF YP#=0 THEN LINE(X1,Y1+1)-(X2,Y2+1),0
  127. 1432  IF XP#=WDTH#*SCALE# THEN LINE(X1-1,Y1)-(X2-1,Y2),0:LINE(X1-2,Y1)-(X2-2,Y2),0
  128. 1433  IF YP#=LENGTH#*SCALE#/2 THEN LINE(X1,Y1-1)-(X2,Y2-1),0
  129. 1435  DOINGWIND=0:HINGEDONE=0:DOINGDOOR=0
  130. 1440  GOTO 1100
  131. 1500  IF PERMFIXNO>11 THEN GOTO 1100
  132. 1510  PERMFIXNO=PERMFIXNO+1
  133. 1515  '
  134. 1520  LOCATE 3,50:PRINT "Is this fixture...";
  135. 1522  LOCATE 5,50:PRINT "1. square or rectangular"
  136. 1524  LOCATE 6,50:PRINT "2. round"
  137. 1525  LOCATE 7,50:PRINT "3. a diagonal wall"
  138. 1530  GOSUB 8050
  139. 1532  IF VAL(I$)<1 OR VAL(I$)>3 THEN 1525
  140. 1534  ON VAL(I$) GOTO 1540,1560,1580
  141. 1540  '
  142. 1541  PF#(PERMFIXNO,1)=1:GOSUB 7100:LOCATE 3,48:PRINT "move the arrow to the upper";: LOCATE 4,48:PRINT "left corner of the fixture";:LOCATE 5,48:PRINT "then press ENTER.";
  143. 1542  XP#=0:YP#=0
  144. 1544  GOSUB 7200
  145. 1546  GOSUB 7900:PF#(PERMFIXNO,2)=XP#/SCALE#:PF#(PERMFIXNO,3)=YP#/SCALE#*2
  146. 1547  DRAW "r4l4d2u2":GOSUB 7100:LOCATE 3,48:PRINT "Now move the arrow to the lower";: LOCATE 4,48:PRINT "right corner of the fixture and";: LOCATE 5,48:PRINT "press ENTER. ";
  147. 1548  GOSUB 7200:PF#(PERMFIXNO,4)=XP#/SCALE#:PF#(PERMFIXNO,5)=YP#/SCALE#*2:LINE(INT(PF#(PERMFIXNO,2)*SCALE#),INT(PF#(PERMFIXNO,3)*SCALE#/2))-(INT(XP#),INT(YP#)),1,B
  148. 1549  GOSUB 7900:LOCATE 16,50
  149. 1550  GOTO 1100
  150. 1560  '
  151. 1561  PF#(PERMFIXNO,1)=2:GOSUB 7100:LOCATE 3,48:PRINT "What is the diameter of the";:LOCATE 4,48:PRINT "fixture in ";:IF METRIC THEN PRINT "meters?  ";: ELSE PRINT "feet and inches?  ";
  152. 1562  LOCATE 5,48:GOSUB 7000
  153. 1564  PF#(PERMFIXNO,2)=NUM/2
  154. 1566  GOSUB 7100:LOCATE 3,48:PRINT "Move the arrow to the point";:LOCATE 4,48:PRINT "where the CENTER of the";:LOCATE 5,48:PRINT "fixture will be and press ";:LOCATE 6,48:PRINT "ENTER.";
  155. 1568  GOSUB 7200
  156. 1570  PF#(PERMFIXNO,3)=XP#/SCALE#:PF#(PERMFIXNO,4)=YP#/SCALE#*2:GOSUB 7900:CIRCLE(XP#,YP#),PF#(PERMFIXNO,2)*SCALE#,1,,,0.5
  157. 1572  LOCATE 16,48:GOTO 1100
  158. 1580  '
  159. 1581  PF#(PERMFIXNO,1)=3:GOSUB 7100:LOCATE 3,48:PRINT "move the arrow to one end";: LOCATE 4,48:PRINT "of the wall and press ";:LOCATE 5,48:PRINT "ENTER.";
  160. 1582  XP#=0:YP#=0
  161. 1584  GOSUB 7200
  162. 1586  GOSUB 7900:PF#(PERMFIXNO,2)=XP#/SCALE#:PF#(PERMFIXNO,3)=YP#/SCALE#*2
  163. 1587  DRAW "r1l1":GOSUB 7100:LOCATE 3,48:PRINT "Now move the arrow to the other";: LOCATE 4,48:PRINT "end and press ENTER.";
  164. 1588  GOSUB 7200: PF#(PERMFIXNO,4)=XP#/SCALE#:PF#(PERMFIXNO,5)=YP#/SCALE#*2:LINE(INT(PF#(PERMFIXNO,2)*SCALE#),INT(PF#(PERMFIXNO,3)*SCALE#/2))-(INT(XP#),INT(YP#)),1
  165. 1589  GOSUB 7900:LOCATE 16,50
  166. 1590  GOTO 1100
  167. 1600  '
  168. 1601  CLOSE
  169. 1605  GOSUB 7100:LOCATE 3,48:PRINT "Are you sure you're finished?";:GOSUB 8000:IF I$<>"Y" THEN 1100
  170. 1606  KEY(8) OFF
  171. 1610  GOSUB 7100:IF RFN$="" THEN LOCATE 3,48:PRINT "What room is this?  Use 8";:LOCATE 4,48:PRINT "characters or less.";:ALLEN%=8:LOCATE 5,48:GOSUB 9500 ELSE NTRY$=LEFT$(RFN$,INSTR(RFN$,".")-1)
  172. 1611  IF NTRY$="" OR INSTR(NTRY$," ")<>0  THEN 1610 ELSE RFN$=NTRY$+".roo"
  173. 1612  ON ERROR GOTO 1680
  174. 1614  NAME RFN$ AS RFN$
  175. 1620  OPEN "O",#1,RFN$
  176. 1630  PRINT #1,WDTH#
  177. 1632  PRINT #1,LENGTH#
  178. 1634  PRINT #1,DOORNO:FOR LCV=1 TO DOORNO:FOR SUBLOOP=1 TO 5
  179. 1636      PRINT #1,DO#(LCV,SUBLOOP)
  180. 1638  NEXT SUBLOOP,LCV
  181. 1640  PRINT #1,WINDNO:FOR LCV=1 TO WINDNO:FOR SUBLOOP=1 TO 5
  182. 1642      PRINT #1,WD#(LCV,SUBLOOP)
  183. 1644  NEXT SUBLOOP,LCV
  184. 1646  PRINT #1,PERMFIXNO:FOR LCV=1 TO PERMFIXNO:FOR SUBLOOP=1 TO 5
  185. 1647      PRINT #1,PF#(LCV,SUBLOOP)
  186. 1648  NEXT SUBLOOP,LCV
  187. 1649  CLOSE:GOSUB 1650:GOTO 500
  188. 1650  '
  189. 1651  KEY(8) OFF
  190. 1652  CLOSE:OPEN "O",#1,"DECOFURN.FRN"
  191. 1654  FOR LCV=1 TO FURNNO:FOR SUBLOOP=1 TO 8:PRINT #1,FU$(LCV,SUBLOOP):NEXT SUBLOOP,LCV
  192. 1678  CLOSE:KEY(8) ON:ON KEY(8) GOSUB 60000:ON ERROR GOTO 30000
  193. 1679  RETURN
  194. 1680  '==== specialized error trap for files check =======
  195. 1682  CLOSE:RESUME 1620
  196. 1684  IF ERR=53 THEN RESUME NEXT
  197. 1686  ON ERROR GOTO 0
  198. 1998  GOSUB 8000
  199. 1999  STOP
  200. 2000  '
  201. 2001  CLS:LOCATE 1,52:PRINT "CREATE OR DELETE FURNITURE";
  202. 2002  X=20:Y=50:GOSUB 11000
  203. 2005  GOSUB 7100
  204. 2010  LOCATE 3,48:PRINT "You have";FURNNO;" pieces of furniture";:LOCATE 4,48:PRINT "stored.  Do you want to...";
  205. 2012  LOCATE 6,50:PRINT "1. Add a piece of furniture."
  206. 2014  LOCATE 7,50:PRINT "2. Delete furniture."
  207. 2016  LOCATE 8,50:PRINT "3. View a piece of furniture."
  208. 2017  LOCATE 9,50:PRINT "4. Return to main menu."
  209. 2018  LOCATE 10,50:IF RFN$>"" THEN PRINT "5. Return to the room."
  210. 2020  GOSUB 8050
  211. 2022  IF (VAL(I$)>0 AND VAL(I$)<5) OR (I$="5" AND RFN$>"") THEN ON VAL(I$) GOTO 2100,3300,2500,500,3030 ELSE 2018
  212. 2100  '
  213. 2101  OPEN "a",#2,"DECOFURN.FRN"
  214. 2102  FURNNO=FURNNO+1
  215. 2105  GOSUB 7100
  216. 2110  LOCATE 1,50:PRINT "    ADDING FURNITURE         ";
  217. 2120  LOCATE 3,48:PRINT "Is this piece of furniture";
  218. 2122  LOCATE 5,50:PRINT "1. Rectangular";
  219. 2124  LOCATE 6,50:PRINT "2. Circular.";
  220. 2130  GOSUB 8050:IF I$="1" THEN 2200 ELSE IF I$="2" THEN 2300 ELSE 2124
  221. 2140  FOR SUBLOOP=1 TO 8:PRINT #2,FU$(FURNNO,SUBLOOP):NEXT SUBLOOP
  222. 2142  CLOSE #2
  223. 2150  GOTO 2005
  224. 2200  '
  225. 2202  FU$(FURNNO,1)="R"
  226. 2203  CLS
  227. 2210  LOCATE 3,48:PRINT "Enter the size of the item";:LOCATE 4,48:PRINT "in ";:IF METRIC THEN PRINT "meters."; ELSE PRINT "feet and inches.";
  228. 2212  LOCATE 6,50:PRINT "WIDTH: ";:GOSUB 7000:IF NUM>3 THEN BEEP:GOTO 2212 ELSE FU$(FURNNO,7)=STR$(NUM):FWDTH=NUM
  229. 2214  LOCATE 8,50:PRINT "LENGTH: ";:GOSUB 7000:IF NUM>3 THEN BEEP:GOTO 2214 ELSE FU$(FURNNO,8)=STR$(NUM):FLENGTH=NUM
  230. 2240  LINE(180-VAL(FU$(FURNNO,7))*100/2,0)-(180+VAL(FU$(FURNNO,7))*100/2,VAL(FU$(FURNNO,8))*100/2),1,B
  231. 2245  LOCATE (FLENGTH*50)\8+3,(180-FWDTH*50)\8+2:NUM=FWDTH:GOSUB 7075:LOCATE (FLENGTH*25)\8+2,(180+FWDTH*50)\8+2:NUM=FLENGTH:GOSUB 7075
  232. 2250  LOCATE 10,48:PRINT "What do you want to call this";:LOCATE 11,48:PRINT "piece of furniture?";:LOCATE 13,52:ALLEN%=12:GOSUB 9500:FU$(FURNNO,3)=NTRY$
  233. 2260  IF NTRY$="" OR MID$(NTRY$,1,1)=" " THEN 2250 ELSE  LOCATE (FLENGTH*50)\8+5,23-LEN(FU$(FURNNO,3))\2:PRINT FU$(FURNNO,3);
  234. 2261  LOCATE 16
  235. 2262  GOTO 2140
  236. 2295  GOSUB 8000
  237. 2300  '
  238. 2305  FU$(FURNNO,1)="C"
  239. 2307  CLS
  240. 2310  LOCATE 3,48:PRINT "Enter the DIAMETER of the ";:LOCATE 4,48:PRINT "item in ";:IF METRIC THEN PRINT "meters."; ELSE PRINT "feet and inches.";
  241. 2312  LOCATE 6,50:PRINT "DIAMETER: ";:GOSUB 7000:IF NUM>3 THEN BEEP:GOTO 2312 ELSE FU$(FURNNO,7)=STR$(NUM):FDIA=NUM
  242. 2340  CIRCLE(180,FDIA*25),FDIA*100/2,1,,,0.5
  243. 2350  LOCATE 8,48:PRINT "What do you want to call this";:LOCATE 9,48:PRINT "piece of furniture?";:LOCATE 11,52:ALLEN%=12:GOSUB 9500:FU$(FURNNO,3)=NTRY$
  244. 2360  LOCATE FDIA*25/8+3,23-(LEN(FU$(FURNNO,3)))\2:PRINT FU$(FURNNO,3);
  245. 2365  LOCATE 16
  246. 2370  GOTO 2140
  247. 2500  '
  248. 2510  LOCATE 17,1:GOSUB 7100:GOSUB 16000:IF FUWORK=0 THEN 2000
  249. 2520  CLS
  250. 2521  X=VAL(FU$(FUWORK,7)):Y=VAL(FU$(FUWORK,8))
  251. 2530  IF FU$(FUWORK,1)="C" THEN CIRCLE(180,VAL(FU$(FUWORK,7))*25),VAL(FU$(FUWORK,7))*50,1,,,0.5 ELSE LINE(180-VAL(FU$(FUWORK,7))*50,0)-(180+VAL(FU$(FUWORK,7))*50,VAL(FU$(FUWORK,8))*50),1,B
  252. 2531  IF FU$(FUWORK,1)="C" THEN LOCATE X*50\8+3,20:NUM=X:GOSUB 7075:LOCATE X*50\8+5,23-LEN(FU$(FUWORK,3))\2:PRINT FU$(FUWORK,3); ELSE LOCATE Y*50\8+3,16:PRINT "WIDTH: ";:NUM=X:GOSUB 7075:LOCATE Y*50\8+4,16:PRINT "LENGTH: ";:NUM=Y:GOSUB 7075
  253. 2532  IF FU$(FUWORK,1)="R" THEN LOCATE Y*50\8+6,23-LEN(FU$(FUWORK,3))\2:PRINT FU$(FUWORK,3);
  254. 2550  GOTO 2005
  255. 2999  STOP
  256. 3000  '
  257. 3001  CLOSE
  258. 3010  CLS:GOSUB 14000
  259. 3020  GOSUB 13000
  260. 3030  GOSUB 13500
  261. 3040  GOTO 1100
  262. 3100  '
  263. 3110  LOCATE 15
  264. 3115  GOSUB 16000
  265. 3116  IF FUWORK=0 THEN 1100
  266. 3117  LOCATE 20:GOSUB 7100
  267. 3200  '
  268. 3201  IF FU$(FUWORK,2)<>RFN$ THEN 3210
  269. 3202  '
  270. 3204  CLS:FU$(FUWORK,2)="":RTFU=FUWORK:GOSUB 13500:FUWORK=RTFU:FX#=VAL(FU$(FUWORK,4)):FY#=VAL(FU$(FUWORK,5)):GOTO 3215
  271. 3210  FX#=WDTH#/2:FY#=LENGTH#/2
  272. 3215  ANGLE=VAL(FU$(FUWORK,6)):FW=VAL(FU$(FUWORK,7)):FL=VAL(FU$(FUWORK,8))
  273. 3221  IF FU$(FUWORK,1)="R" THEN RADIUS =SQR((FW/2)^2 + (FL/2)^2) ELSE RADIUS=FW/2
  274. 3222  A1#=ATN((FL/2)/(FW/2))*RADFAC
  275. 3224  A2#=180-A1#
  276. 3226  A3#=180+A1#
  277. 3228  A4#=360-A1#
  278. 3230  LOCATE 1,48:PRINT "      MOVING FURNITURE       ";
  279. 3232  LOCATE 3,48:PRINT "Use arrow keys and SHIFT+arrows"
  280. 3234  LOCATE 4,48:PRINT "to move the furniture.         "
  281. 3236  LOCATE 6,48:PRINT "The + and - keys will rotate   "
  282. 3238  LOCATE 7,48:PRINT "the item around its center.    "
  283. 3240  LOCATE 9,48:PRINT "Press ENTER to set item down"
  284. 3242  LOCATE 10,48:PRINT "and return to the WORK menu."
  285. 3244  LOCATE 12,48:PRINT "Press ESC to return this "
  286. 3246  LOCATE 13,48:PRINT "item to the list and return"
  287. 3248  LOCATE 14,48:PRINT "to the WORK menu."
  288. 3299  GOTO 3500
  289. 3300  '
  290. 3310  GOSUB 7100:GOSUB 16000
  291. 3320  LOCATE 21,1:GOSUB 7100:LOCATE 3,48:PRINT "Are you sure you want to";:LOCATE 4,48:PRINT "delete this furniture? (Y or N)";
  292. 3330  DEF SEG=0:POKE &H41A,PEEK(&H41C)
  293. 3335  I$=INKEY$:IF I$="" THEN 3335 ELSE IF I$="Y" OR I$="y" THEN 3340 ELSE 3350
  294. 3340  LOCATE 6,52:PRINT "DELETING THIS ITEM";
  295. 3345  FOR LCV=FUWORK TO FURNNO-1:FOR SUBLOOP = 1 TO 8:FU$(LCV,SUBLOOP)=FU$(LCV+1,SUBLOOP):NEXT SUBLOOP,LCV:FU$(FURNNO,3)="            ":FURNNO=FURNNO-1:GOTO 3360
  296. 3350  LOCATE 6,52:PRINT "DELETE ABORTED";
  297. 3360  FOR DELAY= 1 TO 1000:NEXT DELAY
  298. 3370  LOCATE 17,1:GOSUB 7100:GOTO 2010
  299. 3500  '
  300. 3501  '========= given a1,a2,a3,a4,radius,angle,fx#,yx# ======
  301. 3502  IF METRIC THEN UNIT#=0.01 ELSE UNIT#=0.0254
  302. 3503  DEF SEG=0:POKE &H41A,PEEK(&H41C):POKE &H417,(PEEK(&H417) OR &H40)
  303. 3504  IF METRIC THEN UNIT2=10 ELSE UNIT2=12
  304. 3505  DEF SEG=0:POKE &H417,(PEEK(&H417) AND &HDF)
  305. 3506  INC=UNIT#
  306. 3507  IF FU$(FUWORK,1)="R" THEN GOSUB 7400 ELSE AC1=(FX#-RADIUS)*SCALE#-1:AC2=(FY#-RADIUS)*SCALE#/2-1:AC3=(FX#+RADIUS)*SCALE#+1:AC4=(FY#+RADIUS)*SCALE#/2+1
  307. 3508  IF AC1<0 THEN AC1=0
  308. 3509  IF AC2<0 THEN AC2=0
  309. 3510  IF AC3>639 THEN AC3=639
  310. 3511  IF AC4>199 THEN AC4=199
  311. 3514  ON ERROR GOTO 29000
  312. 3515  GET(AC1,AC2)-(AC3,AC4),PA
  313. 3520  IF FU$(FUWORK,1)="R" THEN GOSUB 7484 ELSE CIRCLE(FX#*SCALE#,FY#*SCALE#/2),SCALE#*RADIUS,1,,,0.5:DRAW "BM"+STR$(INT(FX#*SCALE#)-4)+","+STR$(INT(FY#*SCALE#/2)+4)+N$(FUWORK\10)+N$(FUWORK MOD 10)
  314. 3521  ON ERROR GOTO 30000
  315. 3522  DEF SEG=0:POKE &H41A,PEEK(&H41C)
  316. 3523  I$=INKEY$:IF I$="" THEN 3523
  317. 3524  OX=(FX#):OY=(FY#)
  318. 3525  IF I$=CHR$(13) THEN 3600
  319. 3526  IF I$=CHR$(27) THEN PUT(AC1,AC2),PA,PSET:GOTO 1100
  320. 3528  IF I$="+" THEN ANGLE=ANGLE-10/RADFAC:GOTO 3570
  321. 3529  IF I$="-" THEN ANGLE=ANGLE+10/RADFAC:GOTO 3570
  322. 3534  I=ASC(RIGHT$(I$,1))
  323. 3538  IF I=72 THEN FY#=FY#-INC
  324. 3540  IF I=56 THEN FY#=FY#-INC*UNIT2
  325. 3542  IF I=80 THEN FY#=FY#+INC
  326. 3544  IF I=50 THEN FY#=FY#+INC*UNIT2
  327. 3546  IF I=75 THEN FX#=FX#-INC
  328. 3548  IF I=52 THEN FX#=FX#-INC*UNIT2
  329. 3550  IF I=77 THEN FX#=FX#+INC
  330. 3552  IF I=54 THEN FX#=FX#+INC*UNIT2
  331. 3570  PUT(AC1,AC2),PA,PSET
  332. 3580  GOTO 3507
  333. 3599  STOP
  334. 3600  '
  335. 3610  FU$(FUWORK,2)=RFN$:FU$(FUWORK,4)=STR$(FX#):FU$(FUWORK,5)=STR$(FY#):FU$(FUWORK,6)=STR$(ANGLE)
  336. 3620  SOUND 100,1:SOUND 75,1:SOUND 50,1:SOUND 100,0
  337. 3630  GOTO 1100
  338. 3999  STOP
  339. 4000  '
  340. 4010  IF METRIC THEN METRIC=0 ELSE METRIC=1
  341. 4020  GOTO 500
  342. 4100  IF IBMPC THEN DEF SEG:OUT &H3D9,12
  343. 4110  CLS:LOCATE 12,5:BEEP:PRINT "This will take all furniture from all rooms and return it to the list.";:LOCATE 13,19:PRINT "Are you sure you want to do this? (Y or N)"
  344. 4112  DEF SEG=0:POKE &H41A,PEEK(&H41C)
  345. 4114  I$=INKEY$:IF I$="" THEN 4114 ELSE IF I$="Y" OR I$="y" THEN LOCATE 14,38:PRINT "YES";:GOTO 4120 ELSE LOCATE 14,33:PRINT "ACTION ABORTED";:GOTO 4125
  346. 4120  FOR LCV=1 TO FURNNO:FU$(LCV,2)="":FU$(LCV,6)="":NEXT LCV
  347. 4122  LOCATE 15,28:PRINT "Moving furniture back to list.";
  348. 4125  FOR DELAY= 1 TO 500:NEXT DELAY
  349. 4130  GOTO 500
  350. 4200  IF IBMPC THEN DEF SEG:OUT &H3D9,12
  351. 4210  GOSUB 7100:LOCATE 5,48:PRINT "This action will remove all";:LOCATE 6,48:PRINT "furniture from this room";:LOCATE 7,48:PRINT "and return it to the list.";:LOCATE 8,48:PRINT "Are you sure you want to";
  352. 4212  LOCATE 9,48:PRINT "do this?  (Y or N)  ";
  353. 4215  DEF SEG=0:POKE &H41A,PEEK(&H41C)
  354. 4216  I$=INKEY$:IF I$="Y" OR I$="y" THEN LOCATE 11,52:PRINT "FURNITURE REMOVED" ELSE IF I$="N" OR I$="n" THEN 4230 ELSE 4216
  355. 4220  FOR LCV=1 TO FURNNO:IF FU$(LCV,2)=RFN$ THEN FU$(LCV,2)="":FU$(LCV,6)=""
  356. 4222  NEXT LCV:GOSUB 13500
  357. 4224  GOTO 4235
  358. 4230  LOCATE 11,52:PRINT "ACTION ABORTED";
  359. 4235  FOR DELAY=1 TO 1000:NEXT DELAY:IF IBMPC THEN DEF SEG:OUT &H3D9,2
  360. 4240  GOTO 1100
  361. 7000  '
  362. 7005  ROW=CSRLIN:COL=POS(0)
  363. 7010  IF METRIC THEN 7020 ELSE 7030
  364. 7020  INLEN%=6:GOSUB 9000:NUM=VAL(NTRY$)
  365. 7022  GOTO 7050
  366. 7030  PRINT"  '";CHR$(29);CHR$(29);CHR$(29);:INLEN%=2:GOSUB 9000:FEET=VAL(NTRY$)
  367. 7032  LOCATE ROW,COL+4:PRINT"  "+CHR$(34);CHR$(29);CHR$(29);CHR$(29);:INLEN%=2:GOSUB 9000:INCHES=VAL(NTRY$)
  368. 7034  INCHES=FEET*12+INCHES
  369. 7036  NUM=INCHES*0.0254
  370. 7050  IF NUM=0 THEN BEEP:LOCATE ROW,COL:PRINT STRING$(10," ");:LOCATE ROW,COL:GOTO 7010 ELSE RETURN
  371. 7075  '
  372. 7076  ROW=CSRLIN:COL=POS(0)
  373. 7080  IF METRIC THEN PRINT USING "##.###";NUM;:RETURN
  374. 7085  INCHES=NUM*39.37:FEET=INCHES\12:INCHES=INCHES MOD 12
  375. 7086  PRINT FEET;CHR$(29);"'";INCHES;CHR$(29);CHR$(34);" ";
  376. 7087  RETURN
  377. 7100  '
  378. 7110  BOTROW=CSRLIN+1:FOR CROW = 2 TO BOTROW:LOCATE CROW,48:PRINT STRING$(33," ");:NEXT CROW
  379. 7120  RETURN
  380. 7200  '
  381. 7201  IF METRIC THEN UNIT#=SCALE#/100 ELSE UNIT#=SCALE#/39.37
  382. 7202  DEF SEG=0:POKE &H41A,PEEK(&H41C):POKE &H417,(PEEK(&H417) OR &H40)
  383. 7203  IF METRIC THEN UNIT2=10 ELSE UNIT2=12
  384. 7204  DEF SEG=0:POKE &H417,(PEEK(&H417) AND &HDF)
  385. 7205  ABORT=0:LINE (400,58)-(608,116),1,B
  386. 7206  DRAW "bm500,88m+14,+0m-5,+2m+5,+3m-5,+3m-5,-3m-4,+2m+0,-7"
  387. 7208  INC=UNIT#:DEF SEG=0:POKE &H41A,PEEK(&H41C)
  388. 7210  GET(INT(XP#),INT(YP#))-(INT(XP#+14),INT(YP#+8)),PA
  389. 7211  DRAW "bm"+STR$(INT(XP#))+","+STR$(INT(YP#))+"m+14,+0m-5,+2m+5,+3m-5,+3m-5,-3m-4,+2m+0,-7"
  390. 7212  I$=INKEY$:IF I$="" THEN 7212
  391. 7213  '
  392. 7216  IF I$=CHR$(13) THEN PUT(INT(XP#),INT(YP#)),PA,PSET:RETURN
  393. 7220  I=ASC(RIGHT$(I$,1))
  394. 7221  OX=INT(XP#):OY=INT(YP#):IF DOINGDOOR THEN GOTO 7300
  395. 7222  IF I=72 THEN YP#=YP#-INC/2      :GOSUB 7280:GOTO 7230
  396. 7223  IF I=56 THEN YP#=YP#-INC/2*UNIT2:GOSUB 7280:GOTO 7230
  397. 7224  IF I=80 THEN YP#=YP#+INC/2      :GOSUB 7280:GOTO 7230
  398. 7225  IF I=50 THEN YP#=YP#+INC/2*UNIT2:GOSUB 7280:GOTO 7230
  399. 7226  IF I=75 THEN XP#=XP#-INC:        GOSUB 7290:GOTO 7230
  400. 7227  IF I=52 THEN XP#=XP#-INC*UNIT2  :GOSUB 7290:GOTO 7230
  401. 7228  IF I=77 THEN XP#=XP#+INC        :GOSUB 7290:GOTO 7230
  402. 7229  IF I=54 THEN XP#=XP#+INC*UNIT2  :GOSUB 7290
  403. 7230  '
  404. 7231  IF XP#<0 THEN XP#=0:GOSUB 7290
  405. 7232  IF XP#>WDTH#*SCALE# THEN XP#=WDTH#*SCALE#:GOSUB 7290
  406. 7234  IF YP#<0 THEN YP#=0:GOSUB 7280
  407. 7236  IF YP#>LENGTH#*SCALE#/2 THEN YP#=LENGTH#*SCALE#/2:GOSUB 7280
  408. 7249  PUT(OX,OY),PA,PSET
  409. 7250  GOTO 7208
  410. 7280  '
  411. 7281  LOCATE 9,60:NUM=YP#/SCALE#*2:GOSUB 7075
  412. 7282  LOCATE 14,60:NUM=(LENGTH#)-(YP#/SCALE#*2):GOSUB 7075
  413. 7284  RETURN
  414. 7290  '
  415. 7291  LOCATE 11,52:NUM=XP#/SCALE#:GOSUB 7075
  416. 7292  LOCATE 11,68:NUM=(WDTH#)-(XP#/SCALE#):GOSUB 7075
  417. 7294  RETURN
  418. 7299  STOP
  419. 7300  '
  420. 7322  IF I=72 AND (XP#=0 OR XP#=WDTH#*SCALE#) THEN YP#=YP#-INC/2      :GOSUB 7280:GOTO 7330
  421. 7323  IF I=56 AND (XP#=0 OR XP#=WDTH#*SCALE#) THEN YP#=YP#-INC/2*UNIT2:GOSUB 7280:GOTO 7330
  422. 7324  IF I=80 AND (XP#=0 OR XP#=SCALE#*WDTH#) THEN YP#=YP#+INC/2      :GOSUB 7280:GOTO 7330
  423. 7325  IF I=50 AND (XP#=0 OR XP#=SCALE#*WDTH#) THEN YP#=YP#+INC/2*UNIT2:GOSUB 7280:GOTO 7330
  424. 7326  IF I=75 AND (YP#=0 OR YP#=LENGTH#*SCALE#/2) THEN XP#=XP#-INC:        GOSUB 7290:GOTO 7330
  425. 7327  IF I=52 AND (YP#=0 OR YP#=LENGTH#*SCALE#/2) THEN XP#=XP#-INC*UNIT2:  GOSUB 7290:GOTO 7330
  426. 7328  IF I=77 AND (YP#=0 OR YP#=LENGTH#*SCALE#/2) THEN XP#=XP#+INC        :GOSUB 7290:GOTO 7330
  427. 7329  IF I=54 AND (YP#=0 OR YP#=LENGTH#*SCALE#/2) THEN XP#=XP#+INC*UNIT2  :GOSUB 7290:GOTO 7330
  428. 7330  IF  HINGEDONE THEN 7332 ELSE 7340
  429. 7332  IF DOINGWIND=0 THEN DW1#=ABS(DO#(DOORNO,1)-XP#/SCALE#):DW2#=ABS(DO#(DOORNO,2)-YP#/SCALE#*2):IF DW1#>DW2# THEN DOORWDTH=DW1# ELSE DOORWDTH=DW2#
  430. 7333  IF DOINGWIND=1 THEN DW1#=ABS(WD#(WINDNO,1)-XP#/SCALE#):DW2#=ABS(WD#(WINDNO,2)-YP#/SCALE#*2):IF DW1#>DW2# THEN DOORWDTH=DW1# ELSE DOORWDTH=DW2#
  431. 7334  LOCATE 16,53:IF DOINGWIND=0 THEN PRINT "DOOR WIDTH ="; ELSE PRINT "WINDOW WIDTH =";
  432. 7336  NUM=DOORWDTH:GOSUB 7075
  433. 7340  GOTO 7230
  434. 7400  '
  435. 7410  X1=(FX#+RADIUS*COS(ANGLE+A1#/RADFAC)):   Y1=(FY#-RADIUS*SIN(ANGLE+A1#/RADFAC))
  436. 7420  X2=(FX#+RADIUS*COS(ANGLE+A2#/RADFAC)):   Y2=(FY#-RADIUS*SIN(ANGLE+A2#/RADFAC))
  437. 7430  X3=(FX#+RADIUS*COS(ANGLE+A3#/RADFAC)):   Y3=(FY#-RADIUS*SIN(ANGLE+A3#/RADFAC))
  438. 7440  X4=(FX#+RADIUS*COS(ANGLE+A4#/RADFAC)):   Y4=(FY#-RADIUS*SIN(ANGLE+A4#/RADFAC))
  439. 7460  AC1=X1:IF X2<X1 THEN AC1=X2
  440. 7461  IF X3<AC1 THEN AC1=X3
  441. 7462  IF X4<AC1 THEN AC1=X4
  442. 7463  AC1=AC1*SCALE#-1
  443. 7464  IF FX#-AC1<8/SCALE# THEN AC1=AC1-8/SCALE#
  444. 7475  AC2=Y1:IF Y2<AC2 THEN AC2=Y2
  445. 7476  IF Y3<AC2 THEN AC2=Y3
  446. 7477  IF Y4<AC2 THEN AC2=Y4
  447. 7478  IF FY#-AC2<4/SCALE# THEN AC2=AC2-4/SCALE#
  448. 7479  AC2=AC2*SCALE#/2-1
  449. 7480  AC3=(FX#*SCALE#-AC1)+FX#*SCALE#
  450. 7482  AC4=(FY#*SCALE#/2-AC2)+FY#*SCALE#/2
  451. 7483  RETURN
  452. 7484  '
  453. 7485  LINE(X1*SCALE#,Y1*SCALE#/2)-(X2*SCALE#,Y2*SCALE#/2),1
  454. 7486  LINE(X2*SCALE#,Y2*SCALE#/2)-(X3*SCALE#,Y3*SCALE#/2),1
  455. 7487  LINE(X3*SCALE#,Y3*SCALE#/2)-(X4*SCALE#,Y4*SCALE#/2),1
  456. 7488  LINE(X4*SCALE#,Y4*SCALE#/2)-(X1*SCALE#,Y1*SCALE#/2),1
  457. 7490  DRAW "BM"+STR$(INT(FX#*SCALE#)-4)+","+STR$(INT(FY#*SCALE#/2)+4)+N$(FUWORK\10)+N$(FUWORK MOD 10)
  458. 7499  RETURN
  459. 7800  '
  460. 7802  N$(0)="R3U4L3D4BR7":N$(1)="U4D4BR4":N$(2)="BU4R3D2L3D2R3BR4":N$(4)="BU4D2R2U1D1R1L1D2BR5":N$(5)="R3U2L3U2R3BD4BR4":N$(6)="U4D4U2R3D2L3BR7":N$(3)="R3U2L2R2U2L3R3D4BR4":N$(7)="BU4R3D4BR4":N$(8)="U2R3L3U2R3D4L3BR7":N$(9)="BR3U4L3D2R3D2BR4"
  461. 7810  RETURN
  462. 7900  '
  463. 7905  PLAY "MB"
  464. 7910  FOR TONE=1000 TO 1100 STEP 20:SOUND TONE,0.2:NEXT TONE
  465. 7915  RETURN
  466. 7990  '
  467. 8000  '**********  pause until keypress ***************
  468. 8010  DEF SEG=0:POKE &H41A,PEEK(&H41C)
  469. 8030  I$=INKEY$:IF I$="" THEN 8030
  470. 8031  IF ASC(I$)<123 AND ASC(I$)>96 THEN I$=CHR$(ASC(I$)-32)
  471. 8032  SOUND 500,0.02:SOUND 100,0:RETURN
  472. 8050  '********** wait for selection *********
  473. 8055  DEF SEG=0:POKE &H41A,PEEK(&H41C)
  474. 8060  LOCATE CSRLIN+2,48:PRINT "Press selection to continue,";:LOCATE CSRLIN+1,48:PRINT "or F8 to exit.";
  475. 8065  I$=INKEY$:IF I$="" THEN 8030 ELSE SOUND 500,0.51:SOUND 100,0
  476. 8066  IF ASC(I$)>96 AND ASC(I$)<123 THEN I$=CHR$(ASC(I$)-32)
  477. 8067  RETURN
  478. 8099  STOP
  479. 9000  '
  480. 9005  '* NUMERIC INPUT ROUTINE                                *
  481. 9010  '********************************************************
  482. 9015  PRINT STRING$(INLEN%,CHR$(35));:FOR AZX=1 TO INLEN%:PRINT CHR$(29);:NEXT AZX
  483. 9020  DEF FNO.DECIMAL=INSTR(NTRY$,".")=0
  484. 9025  NTRY$=""
  485. 9030  KK$=INKEY$: IF KK$="" THEN 9030 ELSE KK%=ASC(KK$)
  486. 9035  IF KK%=13 THEN GOTO 9095               'End of entry
  487. 9040  IF KK%=8 THEN GOTO 9070                'Backspace
  488. 9045  IF KK%=45 AND LEN(NTRY$)=0 AND INLEN%>1 THEN PRINT KK$;: NTRY$=KK$: GOTO 9060
  489. 9050  IF KK%=46 AND FNO.DECIMAL THEN PRINT KK$;: NTRY$=NTRY$+KK$: GOTO 9060
  490. 9055  IF KK%>47 AND KK%<58 THEN PRINT KK$;:NTRY$=NTRY$ + KK$
  491. 9060  IF LEN(NTRY$)=INLEN% THEN 9095
  492. 9065  GOTO 9030                              'Get another character
  493. 9070  '**** Backspace
  494. 9075  IF LEN(NTRY$)=0 THEN 9030              'Not if entry is empty
  495. 9080  PRINT CHR$(29); CHR$(35); CHR$(29);    'Redisplay box
  496. 9085  NTRY$=LEFT$(NTRY$,LEN(NTRY$)-1)         'Delete last character
  497. 9090  GOTO 9030                              'Get next character
  498. 9095  PRINT SPACE$(INLEN% - LEN(NTRY$))
  499. 9100  RETURN
  500. 9500  '
  501. 9505  '* ALPHABETIC INPUT ROUTINE                            *
  502. 9510  '
  503. 9515  LOCATE ,,1:PRINT STRING$(ALLEN%,CHR$(95));:FOR AZX= 1 TO ALLEN%:PRINT CHR$(29);:NEXT AZX
  504. 9520  NTRY$=""
  505. 9525  KK$=INKEY$: IF KK$="" THEN 9525
  506. 9526  KK%=ASC(KK$): IF LEN(KK$)>1 AND RIGHT$(KK$,1)=CHR$(75) THEN 9555
  507. 9527  IF KK%>96 AND KK%<123 THEN KK%=KK%-32:KK$=CHR$(KK%)
  508. 9530  IF KK%=13 THEN GOTO 9580                'End of entry
  509. 9535  IF KK%=8 THEN GOTO 9555                 'Backspace
  510. 9540  IF (KK%>47 AND KK%<58) OR (KK%>64 AND KK%<91) OR KK%=32 THEN PRINT KK$;: NTRY$=NTRY$+KK$                                   'Echo keystroke and add to entry
  511. 9545  IF LEN(NTRY$) = ALLEN% THEN 9580        'Entry full
  512. 9550  GOTO 9525                               'Get another character
  513. 9555  '**** Backspace
  514. 9560  IF LEN(NTRY$)=0 THEN 9525               'Not if entry is empty
  515. 9565  PRINT CHR$(29);STRING$(1,95);CHR$(29);  'Redisplay box
  516. 9570  NTRY$=LEFT$(NTRY$,LEN(NTRY$)-1)          'Delete last character
  517. 9575  GOTO 9525                               'Get next character
  518. 9580  LOCATE ,,0:PRINT SPACE$(ALLEN% - LEN(NTRY$));
  519. 9585  RETURN
  520. 10000  IF IBMPC THEN DEF SEG=0:OUT &H3D9,0
  521. 10001  X=180:Y=20:GOSUB 11000
  522. 10003  X=145
  523. 10005  Y=130
  524. 10006  GOSUB 10010:GOTO 10400
  525. 10010  CIRCLE(X+140,Y),16,1,,,0.5
  526. 10020  CIRCLE(X+140,Y),12,1,,,0.5:PAINT(X+127,Y),1,1
  527. 10100  GET(X+140-16,Y-8)-(X+140,Y),UL
  528. 10110  GET(X+140-16,Y)-(X+140,Y+8),LL
  529. 10120  GET(X+140,Y-8)-(X+140+16,Y),UR
  530. 10130  GET(X+140,Y)-(X+140+16,Y+8),LR
  531. 10200  PUT(X+100,Y-8),UL,PSET:PUT(X+100,Y),LL,PSET
  532. 10210  PUT(X+73,Y-8),UL,PSET :PUT(X+73,Y),LL,PSET
  533. 10220  GET(X+140-16,Y-8)-(X+140+16,Y+8),PA:PUT(X+30,Y-8),PA,PSET
  534. 10230  PUT(X+165,Y-8),UL,PSET
  535. 10240  PUT(X+190,Y-8),PA,PSET
  536. 10300  LINE(X+234,Y-16)-(X+238,Y+8),1,BF
  537. 10310  PUT(X+255,Y-8),PA,PSET
  538. 10320  PUT(X+295,Y-8),UL,PSET
  539. 10330  GET(X+230,Y)-(X+240,Y+8),PA
  540. 10332  PUT(X+214,Y),PA,PSET
  541. 10334  PUT(X+161,Y),PA,PSET
  542. 10335  PUT(X+291,Y),PA,PSET
  543. 10336  GET(X+230,Y-16)-(X+240,Y),PA
  544. 10338  PUT(X+54,Y-16),PA,PSET
  545. 10340  PUT(X+234,Y),LL,PSET
  546. 10350  LINE(X+234,Y-8)-(X+250,Y-6),1,BF
  547. 10352  GET(X+234,Y-8)-(X+250,Y-6),PA
  548. 10354  PUT(X+73,Y-1),PA,PSET
  549. 10360  RETURN
  550. 10400  LOCATE Y\8+3,(X+180)\8-7
  551. 10410  LOCATE Y\8+4,(X+180)\8-13
  552. 10420  LOCATE Y/8+5,(X+180)\8-7
  553. 10500  GET(X+16,154-16)-(X+312,187),PA
  554. 10510  'LINE(140,65)-(490,130),1,B
  555. 10600  DEF SEG:FOR DELAY = 1 TO 2850:IF IBMPC THEN OUT &H3D9,DELAY \ 133 +1
  556. 10610  IF INKEY$="" THEN NEXT
  557. 10620  CLS:RETURN
  558. 10999  RETURN
  559. 11000  '
  560. 11015  LINE(X+105,66+Y)-(X+192,73+Y),1:LINE-(X+192,79+Y),1:LINE-(X+200,80+Y),1:LINE-(X+200,10+Y),1:LINE-(X+0,6+Y),1
  561. 11020  LINE(X+0,7+Y)-(X+0,60+Y),1
  562. 11025  LINE -(X+5,61+Y),1:LINE-(X+5,16+Y),1:LINE -(X+100,20+Y),1:LINE -(X+100,70+Y),1:LINE-(X+105,71+Y),1:LINE -(X+105,66+Y),1
  563. 11030  LINE(X+200,80+Y)-(X+208,78+Y),1:LINE-(X+208,72+Y),1:LINE-(X+268,60+Y),1:LINE-(X+268,63+Y),1:LINE-(X+271,62+Y),1:LINE-(X+271,6+Y),1:LINE-(X+106,4+Y),1:LINE-(X+0,6+Y),1
  564. 11035  LINE(X+200,10+Y)-(X+271,6+Y),1:LINE(X+5,61+Y)-(X+10,60+Y),1:LINE-(X+10,17+Y),1:LINE(X+105,71+Y)-(X+111,70+Y),1:LINE-(X+111,68+Y),1:LINE(X+268,63+Y)-(X+264,61+Y),1
  565. 11040  LINE(X+107,21+Y)-(X+107,41+Y),1:LINE-(X+194,46+Y),1:LINE-(X+194,24+Y),1:LINE-(X+107,21+Y),1
  566. 11045  LINE(X+107,44+Y)-(X+107,64+Y),1:LINE-(X+194,70+Y),1:LINE-(X+194,49+Y),1:LINE-(X+107,44+Y),1
  567. 11050  LINE(X+140,25+Y)-(X+155,26+Y),1
  568. 11055  LINE(X+140,52+Y)-(X+155,53+Y),1
  569. 11060  LINE(X+90,19+Y)-(X+90,47+Y),1:LINE-(X+93,48+Y),1:LINE-(X+96,47+Y),1:LINE-(X+96,20+Y),1
  570. 11065  LINE(X+0,8+Y)-(X+200,14+Y),1:LINE-(X+270,8+Y),1
  571. 11070  LOCATE 12,1
  572. 11090  RETURN
  573. 12000  '
  574. 12005  LINE(X+0,6+Y)-(X+120,10+Y),1:LINE-(X+320,5+Y),1:LINE(X+120,10+Y)-(X+120,81+Y),1:LINE(X+300,101+Y)-(X+320,102+Y),1:LINE(X+0,104+Y)-(X+107,92+Y),1
  575. 12010  LINE(X+10,18+Y)-(X+60,19+Y),1:LINE-(X+60,70+Y),1:LINE-(X+10,73+Y),1:LINE-(X+10,18+Y),1
  576. 12015  LINE(X+35,19+Y)-(X+35,72+Y),1:LINE(X+10,47+Y)-(X+60,45+Y),1
  577. 12020  LINE(X+107,100+Y)-(X+107,83+Y),1:LINE-(X+117,84+Y),1:LINE-(X+117,91+Y),1:LINE-(X+236,97+Y),1
  578. 12025  LINE-(X+236,88+Y),1:LINE-(X+250,89+Y),1:LINE-(X+250,110+Y),1:LINE-(X+107,100+Y),1
  579. 12030  LINE(X+250,110+Y)-(X+300,100+Y),1:LINE-(X+300,70+Y),1:LINE-(X+286,72+Y),1:LINE-(X+286,85+Y),1:LINE-(X+250,89+Y),1
  580. 12035  LINE(X+236,88+Y)-(X+272,84+Y),1:LINE-(X+286,85+Y),1
  581. 12040  LINE(X+147,66+Y)-(X+286,72+Y),1
  582. 12045  LINE(X+107,83+Y)-(X+147,78+Y),1:LINE-(X+147,66+Y),1:LINE-(X+160,65+Y),1:LINE-(X+300,70+Y),1
  583. 12050  LINE(X+117,91+Y)-(X+154,86+Y),1:LINE-(X+236,90+Y),1
  584. 12055  LINE(X+117,84+Y)-(X+154,79+Y),1:LINE-(X+147,78+Y),1
  585. 12060  LINE(X+154,79+Y)-(X+154,86+Y),1
  586. 12065  LINE(X+12,83+Y)-(X+60,78+Y),1:LINE-(X+84,80+Y),1:LINE-(X+35,85+Y),1:LINE-(X+12,83+Y),1
  587. 12070  LINE(X+12,85+Y)-(X+35,87+Y),1:LINE-(X+84,82+Y),1:LINE-(X+84,80+Y),1
  588. 12075  LINE(X+35,87+Y)-(X+35,85+Y),1:LINE(X+12,85+Y)-(X+12,83+Y),1:LINE-(X+12,102+Y),1
  589. 12080  LINE(X+35,87+Y)-(X+35,105+Y),1:LINE(X+84,80+Y)-(X+84,99+Y),1:LINE(X+60,84+Y)-(X+60,97+Y),1
  590. 12085  RETURN
  591. 13000  '
  592. 13001  CLOSE
  593. 13002  LOCATE 25,28:PRINT "  Loading room info...  ";
  594. 13005  RFN$=F$
  595. 13010  OPEN "I",#1,RFN$
  596. 13015  INPUT #1, WDTH#
  597. 13020  INPUT #1, LENGTH#
  598. 13030  INPUT #1, DOORNO:FOR LCV= 1 TO DOORNO:FOR SUBLOOP = 1 TO 5
  599. 13032  INPUT #1, DO#(LCV,SUBLOOP)
  600. 13034  NEXT SUBLOOP,LCV
  601. 13040  INPUT #1, WINDNO:FOR LCV= 1 TO WINDNO:FOR SUBLOOP = 1 TO 5
  602. 13042  INPUT #1, WD#(LCV,SUBLOOP)
  603. 13044  NEXT SUBLOOP,LCV
  604. 13050  INPUT #1, PERMFIXNO:FOR LCV=1 TO PERMFIXNO:FOR SUBLOOP = 1 TO 5
  605. 13052  INPUT #1, PF#(LCV,SUBLOOP)
  606. 13054  NEXT SUBLOOP,LCV
  607. 13060  RETURN
  608. 13500  '
  609. 13502  SCREEN 2:CLS:IF IBMPC THEN DEF SEG:OUT &H3D9,2
  610. 13503  LOCATE 3,54:PRINT "Drawing room..."
  611. 13509  IF WDTH#>LENGTH# THEN SCALE#=360/WDTH# ELSE SCALE#=360/LENGTH#
  612. 13510  LINE(0,0)-(INT(WDTH#*SCALE#),INT(LENGTH#*SCALE#/2)),1,B
  613. 13511  LINE(1,1)-(INT(WDTH#*SCALE#)-1,INT(LENGTH#*SCALE#/2)-1),1,B
  614. 13512  LINE(2,1)-(INT(WDTH#*SCALE#)-2,INT(LENGTH#*SCALE#/2)-1),1,B
  615. 13520  LOCATE 20,WDTH#*SCALE#\8+2:NUM=LENGTH#:GOSUB 7075:LOCATE (LENGTH#*SCALE#/2)\8+2,(WDTH#*SCALE#/2)\8:NUM=WDTH#:GOSUB 7075
  616. 13550  '====== DRAW DOORS =========
  617. 13552  FOR LCV=1 TO DOORNO
  618. 13553  DEX1#=DO#(LCV,1)*SCALE#:DEY1#=DO#(LCV,2)*SCALE#/2:DEX2#=DO#(LCV,3)*SCALE#:DEY2#=DO#(LCV,4)*SCALE#/2
  619. 13554  PSET(INT(SCALE#*DO#(LCV,1)),INT(SCALE#*DO#(LCV,2)/2)),1:IF DO#(LCV,1)=0 OR DO#(LCV,2)=0 THEN DRAW "D4U4R8L8" ELSE DRAW "U4D4L8R8"
  620. 13555  PSET(INT(SCALE#*DO#(LCV,3)),INT(SCALE#*DO#(LCV,4)/2)),1:IF DO#(LCV,3)=0 OR DO#(LCV,4)=0 THEN DRAW "D4U4R8L8" ELSE DRAW "U4D4L8R8"
  621. 13556  XP#=SCALE#*DO#(LCV,3):YP#=DO#(LCV,4)*SCALE#/2
  622. 13558  IF XP#=0 THEN WALL=4
  623. 13560  IF YP#=0 THEN WALL=1
  624. 13562  IF XP#=WDTH#*SCALE# THEN WALL=2
  625. 13564  IF YP#=LENGTH#*SCALE#/2 THEN WALL=3
  626. 13566  IF DO#(LCV,5)=1 THEN 13586
  627. 13570  IF WALL=1 AND DO#(LCV   ,1) < DO#(LCV   ,3) THEN SP=3*PI/2:EP=2*PI
  628. 13572  IF WALL=1 AND DO#(LCV   ,1) > DO#(LCV   ,3) THEN SP=PI:EP=3*PI/2
  629. 13574  IF WALL=2 AND DO#(LCV   ,2) < DO#(LCV   ,4) THEN SP=PI:EP=3*PI/2
  630. 13575  IF WALL=2 AND DO#(LCV   ,2) > DO#(LCV   ,4) THEN SP=PI/2:EP=PI
  631. 13576  IF WALL=3 AND DO#(LCV   ,1) < DO#(LCV   ,3) THEN SP=2*PI:EP=PI/2
  632. 13577  IF WALL=3 AND DO#(LCV   ,1) > DO#(LCV   ,3) THEN SP=PI/2:EP=PI
  633. 13578  IF WALL=4 AND DO#(LCV   ,2) < DO#(LCV   ,4) THEN SP=3*PI/2:EP=2*PI
  634. 13579  IF WALL=4 AND DO#(LCV   ,2) > DO#(LCV   ,4) THEN SP=2*PI:EP=PI/2
  635. 13580  W1=ABS(DO#(LCV,1)-DO#(LCV,3)):W2=ABS(DO#(LCV,2)-DO#(LCV,4)):IF W1>W2 THEN DOORWDTH=W1 ELSE DOORWDTH=W2
  636. 13585  CIRCLE(INT(DO#(LCV,1)*SCALE#),INT(DO#(LCV,2)*SCALE#/2)),INT(DOORWDTH*SCALE#),1,SP*(-1),EP*(-1),0.5
  637. 13586  IF WALL=1 THEN LINE(DEX1#,DEY1#)-(DEX2#,DEY2#+1),0,BF
  638. 13587  IF WALL=2 THEN LINE(DEX1#,DEY1#)-(DEX2#-2,DEY2#),0,BF
  639. 13588  IF WALL=3 THEN LINE(DEX1#,DEY1#)-(DEX2#,DEY2#-1),0,BF
  640. 13589  IF WALL=4 THEN LINE(DEX1#,DEY1#)-(DEX2#+2,DEY2#),0,BF
  641. 13590  NEXT LCV
  642. 13600  '
  643. 13610  FOR LCV=1 TO WINDNO
  644. 13615  XP#=WD#(LCV,3)*SCALE#:YP#=WD#(LCV,4)*SCALE#/2
  645. 13617  X1=INT(WD#(LCV,1)*SCALE#):Y1=INT(WD#(LCV,2)*SCALE#/2):X2=INT(WD#(LCV,3)*SCALE#):Y2=INT(WD#(LCV,4)*SCALE#/2)
  646. 13619  IF XP#=0 THEN LINE(X1+1,Y1)-(X2+1,Y2),0:LINE(X1+2,Y1)-(X2+2,Y2),0
  647. 13621  IF YP#=0 THEN LINE(X1,Y1+1)-(X2,Y2+1),0
  648. 13623  IF XP#=WDTH#*SCALE# THEN LINE(X1-1,Y1)-(X2-1,Y2),0:LINE(X1-2,Y1)-(X2-2,Y2),0
  649. 13625  IF YP#=LENGTH#*SCALE#/2 THEN LINE(X1,Y1-1)-(X2,Y2-1),0
  650. 13627  NEXT LCV
  651. 13700  '========= PUT PERMANENT FIXTURES ON SCREEN ===============
  652. 13710  FOR LCV= 1 TO PERMFIXNO
  653. 13715  ON PF#(LCV,1) GOSUB 13750,13800,13850
  654. 13720  NEXT LCV
  655. 13725  GOSUB 13900:LOCATE 3,54:PRINT STRING$(20," ");:RETURN
  656. 13750  '=========== DRAW RECTANGLE FIXTURE =======
  657. 13752  LINE(INT(SCALE#*PF#(LCV,2)),INT(PF#(LCV,3)*SCALE#/2))-(INT(PF#(LCV,4)*SCALE#),INT(PF#(LCV,5)*SCALE#/2)),1,B
  658. 13760  RETURN
  659. 13800  '======== DRAW CIRCULAR FIXTURE ============
  660. 13810  CIRCLE(INT(PF#(LCV,3)*SCALE#),INT(PF#(LCV,4)*SCALE#/2)),INT(PF#(LCV,2)*SCALE#),1,,,0.5
  661. 13820  RETURN
  662. 13850  '======== DRAW DIAGONAL WALL ===========
  663. 13852  LINE(INT(SCALE#*PF#(LCV,2)),INT(PF#(LCV,3)*SCALE#/2))-(INT(PF#(LCV,4)*SCALE#),INT(PF#(LCV,5)*SCALE#/2)),1
  664. 13860  RETURN
  665. 13900  '
  666. 13910  FOR FUWORK= 1 TO FURNNO:IF FU$(FUWORK,2)=RFN$ THEN 13920 ELSE 13990
  667. 13920  FW=VAL(FU$(FUWORK,7)):FL=VAL(FU$(FUWORK,8))
  668. 13921  IF FU$(FUWORK,1)="R" THEN RADIUS =SQR((FW/2)^2 + (FL/2)^2) ELSE RADIUS=FW/2
  669. 13922  A1#=ATN((FL/2)/(FW/2))*RADFAC
  670. 13924  A2#=180-A1#
  671. 13926  A3#=180+A1#
  672. 13928  A4#=360-A1#
  673. 13929  FX#=VAL(FU$(FUWORK,4)):FY#=VAL(FU$(FUWORK,5)):ANGLE=VAL(FU$(FUWORK,6))
  674. 13930  IF FU$(FUWORK,1)="R" THEN GOSUB 7400:GOSUB 7484 ELSE CIRCLE(FX#*SCALE#,FY#*SCALE#/2),SCALE#*RADIUS,1,,,0.5:DRAW "BM"+STR$(INT(FX#*SCALE#)-4)+","+STR$(INT(FY#*SCALE#/2)+4)+N$(FUWORK\10)+N$(FUWORK MOD 10)
  675. 13990  NEXT FUWORK
  676. 13999  RETURN
  677. 14000  '
  678. 14005  SCREEN 0,0,0:WIDTH 80
  679. 14010  ON KEY(8) GOSUB 60000
  680. 14020  GOSUB 15000
  681. 14025  IF FI.CO =1 THEN F$=FI.FI$(1):RETURN
  682. 14030  COLOR 7,0:CLS
  683. 14040  BASELOC=12-(FI.CO\2)
  684. 14070  FOR SELECTION = 1 TO FI.CO:LOCATE BASELOC+SELECTION,33:PRINT LEFT$(FI.FI$(SELECTION),8);:NEXT SELECTION
  685. 14080  LOCATE BASELOC+FI.CO+4,25:COLOR 7,0:PRINT "Use ";CHR$(24);" and ";CHR$(25);" to select."
  686. 14090  LOCATE ,25:PRINT "Press ";CHR$(17);"SOUND' to continue."
  687. 14100  LOCATE ,25:PRINT "F8 will exit this program."
  688. 14110  POINTER=1
  689. 14120  LOCATE BASELOC+POINTER,33:COLOR 0,7:PRINT LEFT$(FI.FI$(POINTER),8);
  690. 14130  DEF SEG=0:POKE &H41A,PEEK(&H41C)
  691. 14140  I$=INKEY$:IF LEN(I$)<2 AND I$<>CHR$(13) THEN 14140
  692. 14150  IF I$=CHR$(13) THEN F$=FI.FI$(POINTER):COLOR 7,0:SCREEN 2:RETURN
  693. 14160  LOCATE BASELOC+POINTER,33:COLOR 7,0:PRINT LEFT$(FI.FI$(POINTER),8);
  694. 14170  I=ASC(RIGHT$(I$,1))
  695. 14180  IF I=72 AND POINTER>1 THEN POINTER=POINTER-1
  696. 14190  IF I=80 AND POINTER<FI.CO THEN POINTER=POINTER+1
  697. 14200  LOCATE BASELOC+POINTER,33:COLOR 0,7:PRINT LEFT$(FI.FI$(POINTER),8);
  698. 14210  GOTO 14140
  699. 14620  CLS:SCREEN 2:RETURN 500
  700. 15000  '
  701. 15010  CLS:LOCATE 25,28:COLOR 0,7:PRINT " Examining directory... ";
  702. 15011  FI.CO=0
  703. 15020  LOCATE 1,1,0
  704. 15021  ON ERROR GOTO 15200
  705. 15030  COLOR 0,0:FILES "*.ROO"
  706. 15032  ON ERROR GOTO 30000
  707. 15040  FI.LA=CSRLIN
  708. 15050  FOR FI.RO=2 TO FI.LA-2
  709. 15060  FOR FI.NA=1 TO 18*4 STEP 18
  710. 15070  IF SCREEN(FI.RO,FI.NA)<>SCREEN(1,70) THEN FI.CO=FI.CO+1:FI.FI$(FI.CO)="":FOR FI.P=1 TO 12:FI.FI$(FI.CO)=FI.FI$(FI.CO)+CHR$(SCREEN(FI.RO,FI.NA-1+FI.P)):NEXT FI.P: ELSE 15090
  711. 15080  NEXT FI.NA,FI.RO
  712. 15090  FI.RO$="":FOR FI.CL=2 TO 7:FI.RO$=FI.RO$+CHR$(SCREEN(FI.LA-2,FI.CL)):NEXT FI.CL
  713. 15100  COLOR 7,0
  714. 15110  RETURN
  715. 15200  SCREEN 2:CLS:ON ERROR GOTO 30000:RESUME 500
  716. 16000  '
  717. 16005  LOCATE 1,48:PRINT "        SELECT FURNITURE       ";
  718. 16006  LOCATE 19,48:PRINT "Use arrow keys to select item.";:LOCATE 20,48:PRINT "Press ENTER to continue.";:LOCATE 21,48:PRINT "ESC will abort.";
  719. 16010  PG=0
  720. 16100  'LOCATE 17,50:GOSUB 7100
  721. 16110  FOR LCV= 1 TO 15:LOCATE 2+LCV,48:PRINT PG*30+LCV;FU$(PG*30+LCV,3);:LOCATE 2+LCV,64:PRINT PG*30+LCV+15;FU$(PG*30+LCV+15,3);:NEXT LCV
  722. 16120  POINTER=1
  723. 16200  IF POINTER >15 THEN LOCATE 2+POINTER-15,64 ELSE LOCATE 2+POINTER,48
  724. 16210  PRINT ">";CHR$(29);
  725. 16300  I$=INKEY$:IF I$="" THEN 16300
  726. 16310  IF I$=CHR$(13) THEN FUWORK=PG*30+POINTER:GOTO 16900
  727. 16312  IF I$=CHR$(27) THEN FUWORK=0:GOTO 16900
  728. 16320  IF LEN(I$)<2 THEN 16300
  729. 16322  PRINT " ";CHR$(29);
  730. 16324  I=ASC(RIGHT$(I$,1))
  731. 16330  IF I=72 AND POINTER>1 THEN POINTER=POINTER-1
  732. 16332  IF I=80 AND FU$(1+POINTER+30*PG,3)<>"" AND POINTER<30 THEN POINTER=POINTER+1
  733. 16334  IF I=77 AND POINTER+15+30*PG<=FURNNO THEN POINTER=POINTER+15
  734. 16336  IF I=75 AND POINTER>15 THEN POINTER=POINTER-15
  735. 16340  IF I=73 AND PG>0 THEN PG=PG-1:LOCATE 17,1:GOSUB 7100:GOTO 16100
  736. 16342  IF I=81 AND PG<FURNNO\30+1 THEN PG=PG+1:LOCATE 17,1:GOSUB 7100:GOTO 16100
  737. 16350  GOTO 16200
  738. 16900  LOCATE 16,48:RETURN
  739. 16999  GOSUB 8000:STOP
  740. 19999  RETURN
  741. 28000  '
  742. 28010  CLS:LOCATE 12,12:PRINT "This program uses the graphics card.  If you do not have":LOCATE 13,12:PRINT "graphics capabilities, proceeding past this screen may create":LOCATE 14,12:PRINT "errors.  Press F8 to exit or C to continue."
  743. 28020  DEF SEG=0:POKE &H41A,PEEK(&H41C)
  744. 28030  I$=INKEY$:IF I$<>"C" AND I$<>"c" THEN 28030 ELSE RETURN
  745. 29000  '========== graphic function call errors ===========
  746. 29010  IF ERR=5 THEN FX#=WDTH#/2:FY#=LENGTH#/2:BEEP:RESUME 3507
  747. 30000  '========== SPECIALIZED ERROR TRAPPING ===========
  748. 40000  '========== ERROR TRAPPING ROUTINE ================
  749. 40005  CLOSE
  750. 40010  IF ERR=24 OR ERR=25 OR ERR=27 OR ERR=68 THEN MSG$="ARE YOU SURE THE PRINTER IS READY?":GOSUB 50000:RESUME
  751. 40020  IF ERR=71 OR ERR=70 THEN MSG$="ARE YOU SURE THE DISK IS READY?":GOSUB 50000:CLOSE:RESUME
  752. 40900  ON ERROR GOTO 0
  753. 50000  '========= display msg routine ==============
  754. 50010  SM.L=LEN(MSG$)
  755. 50020  SM.ST$="":SM.OC=0
  756. 50030  SM.CL=POS(0):SM.RW=CSRLIN
  757. 50040  BEEP
  758. 50050  SM.SL=40-(SM.L\2+1)
  759. 50060  FOR SM.LCV=SM.SL TO SM.SL+SM.L+2
  760. 50070  SM.NC=SCREEN(12,SM.LCV,1)
  761. 50080  IF SM.NC<>SM.OC THEN SM.ST$=SM.ST$+CHR$(255)+CHR$(SM.NC):SM.OC=SM.NC
  762. 50090  SM.ST$=SM.ST$+CHR$(SCREEN(12,SM.LCV))
  763. 50100  NEXT SM.LCV
  764. 50110  LOCATE 12,40:PRINT CHR$(219);
  765. 50120  SM.V=SCREEN(12,40,1):SM.RF=(SM.V MOD 16):SM.RB=(((SM.V-SM.RF)/16) MOD 128)
  766. 50130  COLOR 15,4
  767. 50140  LOCATE 12,SM.SL+1:PRINT " ";MSG$;" "
  768. 50150  SM.I$=INKEY$:IF SM.I$="" THEN 50150
  769. 50160  SM.SP=1
  770. 50170  LOCATE 12,SM.SL
  771. 50180  COLOR SM.RF,SM.RB
  772. 50190  FOR SM.LCV=1 TO LEN(SM.ST$)
  773. 50200  IF MID$(SM.ST$,SM.LCV,1)=CHR$(255) THEN SM.V=ASC(MID$(SM.ST$,SM.LCV+1,1)):SM.F=(SM.V MOD 16):SM.B=(((SM.V-SM.F)/16) MOD 128):COLOR SM.F,SM.B:SM.LCV=SM.LCV+2
  774. 50210  PRINT MID$(SM.ST$,SM.LCV,1);
  775. 50220  NEXT SM.LCV
  776. 50230  LOCATE SM.RW,SM.CL:COLOR SM.RF,SM.RB
  777. 50240  RETURN
  778. 60000  '======= RESAVE FURNITURE AND CLOSE FILES ==========
  779. 60001  BEEP
  780. 60005  GOSUB 1650:CLOSE
  781. 65010  CLOSE:SCREEN 0: WIDTH 80: COLOR 14,0
  782. 65015  ON ERROR GOTO 0
  783. 65020  IF ADDR.%<>0 THEN LOCATE 25,1,0: PRINT SPACE$(28)
  784. 65030  CLS: LOCATE 12,35: PRINT"Good-bye!": COLOR 3
  785. 65040  END
  786.