home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / simtel / sigm / vols000 / vol045 / verbs.ftn < prev    next >
Encoding:
Text File  |  1984-04-29  |  20.6 KB  |  806 lines

  1. C VAPPLI- MAIN VERB PROCESSING ROUTINE
  2. C
  3. C COPYRIGHT 1980, INFOCOM COMPUTERS AND COMMUNICATIONS, CAMBRIDGE MA. 02142
  4. C ALL RIGHTS RESERVED, COMMERCIAL USAGE STRICTLY PROHIBITED
  5. C WRITTEN BY R. M. SUPNIK
  6. C
  7. C DECLARATIONS
  8. C
  9.     LOGICAL FUNCTION VAPPLI(RI)
  10.     IMPLICIT INTEGER (A-Z)
  11.     LOGICAL LIT,OBJACT
  12.     LOGICAL QEMPTY,RMDESC,CLOCKD
  13.     LOGICAL QOPEN,EDIBLE,DRKBLE
  14.     LOGICAL TAKE,PUT,DROP,WALK
  15.     LOGICAL QHERE,SVERBS,FINDXT,OAPPLI,F
  16. C
  17. C PARSER OUTPUT
  18. C
  19.     LOGICAL PRSWON
  20.     COMMON /PRSVEC/ PRSA,PRSI,PRSO,PRSWON,PRSCON
  21. C
  22. C GAME STATE
  23. C
  24.     LOGICAL TELFLG
  25.     COMMON /PLAY/ WINNER,HERE,TELFLG
  26.     COMMON /STATE/ MOVES,DEATHS,RWSCOR,MXSCOR,MXLOAD,
  27.     1    LTSHFT,BLOC,MUNGRM,HS,EGSCOR,EGMXSC
  28. C
  29.     COMMON /STAR/ MBASE,STRBIT
  30. C
  31. C ROOMS
  32. C
  33.     COMMON /ROOMS/ RLNT,RDESC2,RDESC1(200),REXIT(200),
  34.     1    RACTIO(200),RVAL(200),RFLAG(200)
  35.     INTEGER RRAND(200)
  36.     EQUIVALENCE (RVAL,RRAND)
  37. C
  38.     COMMON /RFLAG/ RSEEN,RLIGHT,RLAND,RWATER,RAIR,
  39.     1    RSACRD,RFILL,RMUNG,RBUCK,RHOUSE,RNWALL,REND
  40. C
  41.     COMMON /RINDEX/ WHOUS,LROOM,CELLA
  42.     COMMON /RINDEX/ MTROL,MAZE1    
  43.     COMMON /RINDEX/ MGRAT,MAZ15    
  44.     COMMON /RINDEX/ FORE1,FORE3,CLEAR,RESER
  45.     COMMON /RINDEX/ STREA,EGYPT,ECHOR
  46.     COMMON /RINDEX/ TSHAF    
  47.     COMMON /RINDEX/ BSHAF,MMACH,DOME,MTORC
  48.     COMMON /RINDEX/ CAROU    
  49.     COMMON /RINDEX/ RIDDL,LLD2,TEMP1,TEMP2,MAINT
  50.     COMMON /RINDEX/ BLROO,TREAS,RIVR1,RIVR2,RIVR3,MCYCL
  51.     COMMON /RINDEX/ RIVR4,RIVR5,FCHMP,FALLS,MBARR
  52.     COMMON /RINDEX/ MRAIN,POG,VLBOT,VAIR1,VAIR2,VAIR3,VAIR4
  53.     COMMON /RINDEX/ LEDG2,LEDG3,LEDG4,MSAFE,CAGER
  54.     COMMON /RINDEX/ CAGED,TWELL,BWELL,ALICE,ALISM,ALITR
  55.     COMMON /RINDEX/ MTREE,BKENT,BKVW,BKTWI,BKVAU,BKBOX
  56.     COMMON /RINDEX/ CRYPT,TSTRS,MRANT,MREYE
  57.     COMMON /RINDEX/ MRA,MRB,MRC,MRG,MRD,FDOOR
  58.     COMMON /RINDEX/ MRAE,MRCE,MRCW,MRGE,MRGW,MRDW,INMIR
  59.     COMMON /RINDEX/ SCORR,NCORR,PARAP,CELL,PCELL,NCELL
  60.     COMMON /RINDEX/ CPANT,CPOUT,CPUZZ
  61. C
  62. C EXITS
  63. C
  64.     COMMON /XSRCH/ XMIN,XMAX,XDOWN,XUP,
  65.     1    XNORTH,XSOUTH,XENTER,XEXIT,XEAST,XWEST
  66. C
  67. C OBJECTS
  68. C
  69.     COMMON /OBJCTS/ OLNT,ODESC1(220),ODESC2(220),ODESCO(220),
  70.     1    OACTIO(220),OFLAG1(220),OFLAG2(220),OFVAL(220),
  71.     2    OTVAL(220),OSIZE(220),OCAPAC(220),OROOM(220),
  72.     3    OADV(220),OCAN(220),OREAD(220)
  73. C
  74.     COMMON /OFLAGS/ VISIBT,READBT,TAKEBT,DOORBT,TRANBT,FOODBT,
  75.     1    NDSCBT,DRNKBT,CONTBT,LITEBT,VICTBT,BURNBT,FLAMBT,
  76.     2    TOOLBT,TURNBT,ONBT
  77.     COMMON /OFLAGS/ FINDBT,SLEPBT,SCRDBT,TIEBT,CLMBBT,ACTRBT,
  78.     1    WEAPBT,FITEBT,VILLBT,STAGBT,TRYBT,NOCHBT,OPENBT,
  79.     2    TCHBT,VEHBT,SCHBT
  80. C
  81.     COMMON /OINDEX/ GARLI,FOOD,GUNK,COAL,MACHI,DIAMO,TCASE,BOTTL
  82.     COMMON /OINDEX/ WATER,ROPE,KNIFE,SWORD,LAMP,BLAMP,RUG
  83.     COMMON /OINDEX/    LEAVE,TROLL,AXE
  84.     COMMON /OINDEX/ RKNIF,KEYS,ICE,BAR
  85.     COMMON /OINDEX/ COFFI,TORCH,TBASK,FBASK,IRBOX
  86.     COMMON /OINDEX/ GHOST,TRUNK,BELL,BOOK,CANDL
  87.     COMMON /OINDEX/ MATCH,TUBE,PUTTY,WRENC,SCREW,CYCLO,CHALI
  88.     COMMON /OINDEX/ THIEF,STILL,WINDO,GRATE,DOOR
  89.     COMMON /OINDEX/ HPOLE,LEAK,RBUTT,RAILI
  90.     COMMON /OINDEX/ POT,STATU,IBOAT,DBOAT,PUMP,RBOAT
  91.     COMMON /OINDEX/ STICK,BUOY,SHOVE,BALLO,RECEP,GUANO
  92.     COMMON /OINDEX/ BROPE,HOOK1,HOOK2,SAFE,SSLOT,BRICK,FUSE
  93.     COMMON /OINDEX/ GNOME,BLABE,DBALL,TOMB
  94.     COMMON /OINDEX/ LCASE,CAGE,RCAGE,SPHER,SQBUT
  95.     COMMON /OINDEX/ FLASK,POOL,SAFFR,BUCKE,ECAKE,ORICE,RDICE,BLICE
  96.     COMMON /OINDEX/ ROBOT,FTREE,BILLS,PORTR,SCOL,ZGNOM
  97.     COMMON /OINDEX/ EGG,BEGG,BAUBL,CANAR,BCANA
  98.     COMMON /OINDEX/ YLWAL,RDWAL,PINDR,RBEAM
  99.     COMMON /OINDEX/ ODOOR,QDOOR,CDOOR,NUM1,NUM8
  100.     COMMON /OINDEX/ WARNI,CSLIT,GCARD,STLDR
  101.     COMMON /OINDEX/ HANDS,WALL,LUNGS,SAILO,AVIAT,TEETH
  102.     COMMON /OINDEX/ ITOBJ,EVERY,VALUA,OPLAY,WNORT,GWATE,MASTER
  103. C
  104. C ADVENTURERS
  105. C
  106.     COMMON /ADVS/ ALNT,AROOM(4),ASCORE(4),AVEHIC(4),
  107.     1    AOBJ(4),AACTIO(4),ASTREN(4),AFLAG(4)
  108. C
  109.     COMMON /AINDEX/ PLAYER,AROBOT,AMASTR
  110. C
  111. C VERBS
  112. C
  113.     COMMON /VINDEX/ CINTW,DEADXW,FRSTQW,INXW,OUTXW
  114.     COMMON /VINDEX/ WALKIW,FIGHTW,FOOW
  115.     COMMON /VINDEX/ MELTW,READW,INFLAW,DEFLAW,ALARMW,EXORCW
  116.     COMMON /VINDEX/ PLUGW,KICKW,WAVEW,RAISEW,LOWERW,RUBW
  117.     COMMON /VINDEX/ PUSHW,UNTIEW,TIEW,TIEUPW,TURNW,BREATW
  118.     COMMON /VINDEX/ KNOCKW,LOOKW,EXAMIW,SHAKEW,MOVEW,TRNONW,TRNOFW
  119.     COMMON /VINDEX/ OPENW,CLOSEW,FINDW,WAITW,SPINW,BOARDW,UNBOAW,TAKEW
  120.     COMMON /VINDEX/ INVENW,FILLW,EATW,DRINKW,BURNW
  121.     COMMON /VINDEX/ MUNGW,KILLW,ATTACW,SWINGW
  122.     COMMON /VINDEX/ WALKW,TELLW,PUTW,DROPW,GIVEW,POURW,THROWW
  123.     COMMON /VINDEX/ DIGW,LEAPW,STAYW,FOLLOW
  124.     COMMON /VINDEX/ HELLOW,LOOKIW,LOOKUW,PUMPW,WINDW
  125.     COMMON /VINDEX/ CLMBW,CLMBUW,CLMBDW,TRNTOW
  126. C
  127. C FUNCTIONS AND DATA
  128. C
  129.     QOPEN(R)=(OFLAG2(R).AND.OPENBT).NE.0
  130.     EDIBLE(R)=(OFLAG1(R).AND.FOODBT).NE.0
  131.     DRKBLE(R)=(OFLAG1(R).AND.DRNKBT).NE.0
  132.     DATA MXNOP/39/,MXSMP/99/
  133. C VAPPLI, PAGE 2
  134. C
  135.     VAPPLI=.TRUE.                !ASSUME WINS.
  136.     IF(PRSO.NE.0) ODO2=ODESC2(PRSO)        !SET UP DESCRIPTORS.
  137.     IF(PRSI.NE.0) ODI2=ODESC2(PRSI)
  138.     AV=AVEHIC(WINNER)
  139.     RMK=372+RND(6)                !REMARK FOR HACK-HACKS.
  140. C
  141.     IF(RI.EQ.0) GO TO 10            !ZERO IS FALSE.
  142.     IF(RI.LE.MXNOP) RETURN            !NOP?
  143.     IF(RI.LE.MXSMP) GO TO 100        !SIMPLE VERB?
  144.     GO TO (18000,20000,
  145.     2       22000,23000,24000,25000,26000,27000,28000,29000,30000,
  146.     3 31000,32000,33000,34000,35000,36000,      38000,39000,40000,
  147.     4 41000,42000,43000,44000,45000,46000,47000,48000,49000,50000,
  148.     5 51000,52000,53000,      55000,56000,      58000,59000,60000,
  149.     6             63000,64000,65000,66000,      68000,69000,70000,
  150.     7 71000,72000,73000,74000,            77000,78000,
  151.     8 80000,81000,82000,83000,84000,85000,86000,87000,88000),
  152.     8    (RI-MXSMP)
  153.     CALL BUG(7,RI)
  154. C
  155. C ALL VERB PROCESSORS RETURN HERE TO DECLARE FAILURE.
  156. C
  157. 10    VAPPLI=.FALSE.                !LOSE.
  158.     RETURN
  159. C
  160. C SIMPLE VERBS ARE HANDLED EXTERNALLY.
  161. C
  162. 100    VAPPLI=SVERBS(RI)
  163.     RETURN
  164. C VAPPLI, PAGE 3
  165. C
  166. C V100--    READ.  OUR FIRST REAL VERB.
  167. C
  168. 18000    IF(LIT(HERE)) GO TO 18100        !ROOM LIT?
  169.     CALL RSPEAK(356)            !NO, CANT READ.
  170.     RETURN
  171. C
  172. 18100    IF(PRSI.EQ.0) GO TO 18200        !READ THROUGH OBJ?
  173.     IF((OFLAG1(PRSI).AND.TRANBT).NE.0) GO TO 18200
  174.     CALL RSPSUB(357,ODI2)            !NOT TRANSPARENT.
  175.     RETURN
  176. C
  177. 18200    IF((OFLAG1(PRSO).AND.READBT).NE.0) GO TO 18300
  178.     CALL RSPSUB(358,ODO2)            !NOT READABLE.
  179.     RETURN
  180. C
  181. 18300    IF(.NOT.OBJACT(X)) CALL RSPEAK(OREAD(PRSO))
  182.     RETURN
  183. C
  184. C V101--    MELT.  UNLESS OBJECT HANDLES, JOKE.
  185. C
  186. 20000    IF(.NOT.OBJACT(X)) CALL RSPSUB(361,ODO2)
  187.     RETURN
  188. C
  189. C V102--    INFLATE.  WORKS ONLY WITH BOATS.
  190. C
  191. 22000    IF(.NOT.OBJACT(X)) CALL RSPEAK(368)    !OBJ HANDLE?
  192.     RETURN
  193. C
  194. C V103--    DEFLATE.
  195. C
  196. 23000    IF(.NOT.OBJACT(X)) CALL RSPEAK(369)    !OBJ HANDLE?
  197.     RETURN
  198. C VAPPLI, PAGE 4
  199. C
  200. C V104--    ALARM.  IF SLEEPING, WAKE HIM UP.
  201. C
  202. 24000    IF((OFLAG2(PRSO).AND.SLEPBT).EQ.0) GO TO 24100
  203.     VAPPLI=OBJACT(X)            !SLEEPING, LET OBJ DO.
  204.     RETURN
  205. C
  206. 24100    CALL RSPSUB(370,ODO2)            !JOKE.
  207.     RETURN
  208. C
  209. C V105--    EXORCISE.  OBJECTS HANDLE.
  210. C
  211. 25000    F=OBJACT(X)                !OBJECTS HANDLE.
  212.     RETURN
  213. C
  214. C V106--    PLUG.  LET OBJECTS HANDLE.
  215. C
  216. 26000    IF(.NOT.OBJACT(X)) CALL RSPEAK(371)
  217.     RETURN
  218. C
  219. C V107--    KICK.  IF OBJECT IGNORES, JOKE.
  220. C
  221. 27000    IF(.NOT.OBJACT(X)) CALL RSPSB2(378,ODO2,RMK)
  222.     RETURN
  223. C
  224. C V108--    WAVE.  SAME.
  225. C
  226. 28000    IF(.NOT.OBJACT(X)) CALL RSPSB2(379,ODO2,RMK)
  227.     RETURN
  228. C
  229. C V109,V110--    RAISE, LOWER.  SAME.
  230. C
  231. 29000    CONTINUE
  232. 30000    IF(.NOT.OBJACT(X)) CALL RSPSB2(380,ODO2,RMK)
  233.     RETURN
  234. C
  235. C V111--    RUB.  SAME.
  236. C
  237. 31000    IF(.NOT.OBJACT(X)) CALL RSPSB2(381,ODO2,RMK)
  238.     RETURN
  239. C
  240. C V112--    PUSH.  SAME.
  241. C
  242. 32000    IF(.NOT.OBJACT(X)) CALL RSPSB2(382,ODO2,RMK)
  243.     RETURN
  244. C VAPPLI, PAGE 5
  245. C
  246. C V113--    UNTIE.  IF OBJECT IGNORES, JOKE.
  247. C
  248. 33000    IF(OBJACT(X)) RETURN            !OBJECT HANDLE?
  249.     I=383                    !NO, NOT TIED.
  250.     IF((OFLAG2(PRSO).AND.TIEBT).EQ.0) I=384    !NOT TIEABLE.
  251.     CALL RSPEAK(I)
  252.     RETURN
  253. C
  254. C V114--    TIE.  NEVER REALLY WORKS.
  255. C
  256. 34000    IF((OFLAG2(PRSO).AND.TIEBT).NE.0) GO TO 34100
  257.     CALL RSPEAK(385)            !NOT TIEABLE.
  258.     RETURN
  259. C
  260. 34100    IF(.NOT.OBJACT(X)) CALL RSPSUB(386,ODO2) !JOKE.
  261.     RETURN
  262. C
  263. C V115--    TIE UP.  NEVER REALLY WORKS.
  264. C
  265. 35000    IF((OFLAG2(PRSI).AND.TIEBT).NE.0) GO TO 35100
  266.     CALL RSPSUB(387,ODO2)            !NOT TIEABLE.
  267.     RETURN
  268. C
  269. 35100    I=388                    !ASSUME VILLAIN.
  270.     IF((OFLAG2(PRSO).AND.VILLBT).EQ.0) I=389
  271.     CALL RSPSUB(I,ODO2)            !JOKE.
  272.     RETURN
  273. C
  274. C V116--    TURN.  OBJECT MUST HANDLE.
  275. C
  276. 36000    IF((OFLAG1(PRSO).AND.TURNBT).NE.0) GO TO 36100
  277.     CALL RSPEAK(390)            !NOT TURNABLE.
  278.     RETURN
  279. C
  280. 36100    IF((OFLAG1(PRSI).AND.TOOLBT).NE.0) GO TO 36200
  281.     CALL RSPSUB(391,ODI2)            !NOT A TOOL.
  282.     RETURN
  283. C
  284. 36200    VAPPLI=OBJACT(X)            !LET OBJECT HANDLE.
  285.     RETURN
  286. C
  287. C V117--    BREATHE.  BECOMES INFLATE WITH LUNGS.
  288. C
  289. 38000    PRSA=INFLAW
  290.     PRSI=LUNGS
  291.     GO TO 22000                !HANDLE LIKE INFLATE.
  292. C
  293. C V118--    KNOCK.  MOSTLY JOKE.
  294. C
  295. 39000    IF(OBJACT(X)) RETURN            !OBJ HANDLE?
  296.     I=394                    !JOKE FOR DOOR.
  297.     IF((OFLAG1(PRSO).AND.DOORBT).EQ.0) I=395
  298.     CALL RSPSUB(I,ODO2)            !JOKE FOR NONDOORS TOO.
  299.     RETURN
  300. C
  301. C V119--    LOOK.
  302. C
  303. 40000    IF(PRSO.NE.0) GO TO 41500        !SOMETHING TO LOOK AT?
  304.     VAPPLI=RMDESC(3)            !HANDLED BY RMDESC.
  305.     RETURN
  306. C
  307. C V120--    EXAMINE.
  308. C
  309. 41000    IF(PRSO.NE.0) GO TO 41500        !SOMETHING TO EXAMINE?
  310.     VAPPLI=RMDESC(0)            !HANDLED BY RMDESC.
  311.     RETURN
  312. C
  313. 41500    IF(OBJACT(X)) RETURN            !OBJ HANDLE?
  314.     I=OREAD(PRSO)                !GET READING MATERIAL.
  315.     IF(I.NE.0) CALL RSPEAK(I)        !OUTPUT IF THERE,
  316.     IF(I.EQ.0) CALL RSPSUB(429,ODO2)    !OTHERWISE DEFAULT.
  317.     PRSA=FOOW                !DEFUSE ROOM PROCESSORS.
  318.     RETURN
  319. C
  320. C V121--    SHAKE.  IF HOLLOW OBJECT, SOME ACTION.
  321. C
  322. 42000    IF(OBJACT(X)) RETURN            !OBJECT HANDLE?
  323.     IF((OFLAG2(PRSO).AND.VILLBT).EQ.0) GO TO 42100
  324.     CALL RSPEAK(371)            !JOKE FOR VILLAINS.
  325.     RETURN
  326. C
  327. 42100    IF(QEMPTY(PRSO).OR.((OFLAG1(PRSO).AND.TAKEBT).EQ.0))
  328.     1    GO TO 10            !EMPTY OR NO TAKE?  FAILS.
  329.     IF(QOPEN(PRSO)) GO TO 42300        !OPEN?  SPILL.
  330.     CALL RSPSUB(396,ODO2)            !NO, DESCRIBE NOISE.
  331.     RETURN
  332. C
  333. 42300    CALL RSPSUB(397,ODO2)            !SPILL THE WORKS.
  334.     DO 42500 I=1,OLNT            !SPILL CONTENTS.
  335.       IF(OCAN(I).NE.PRSO) GO TO 42500    !INSIDE?
  336.       OFLAG2(I)=OFLAG2(I).OR.TCHBT        !TOUCH OBJECT.
  337.       IF(AV.EQ.0) GO TO 42400        !IN VEHICLE?
  338.       CALL NEWSTA(I,0,0,AV,0)        !YES, SPILL IN THERE.
  339.       GO TO 42500
  340. C
  341. 42400      CALL NEWSTA(I,0,HERE,0,0)        !NO, SPILL ON FLOOR,
  342.       IF(I.EQ.WATER) CALL NEWSTA(I,133,0,0,0)    !BUT WATER DISAPPEARS.
  343. 42500    CONTINUE
  344.     RETURN
  345. C
  346. C V122--    MOVE.  MOSTLY JOKES.
  347. C
  348. 43000    IF(OBJACT(X)) RETURN            !OBJ HANDLE?
  349.     I=398                    !ASSUME NOT HERE.
  350.     IF(QHERE(PRSO,HERE)) I=399
  351.     CALL RSPSUB(I,ODO2)            !JOKE.
  352.     RETURN
  353. C VAPPLI, PAGE 6
  354. C
  355. C V123--    TURN ON.
  356. C
  357. 44000    F=LIT(HERE)                !RECORD IF LIT.
  358.     IF(OBJACT(X)) GO TO 44300        !OBJ HANDLE?
  359.     IF(((OFLAG1(PRSO).AND.LITEBT).NE.0).AND.
  360.     1    (OADV(PRSO).EQ.WINNER)) GO TO 44100
  361.     CALL RSPEAK(400)            !CANT DO IT.
  362.     RETURN
  363. C
  364. 44100    IF((OFLAG1(PRSO).AND.ONBT).EQ.0) GO TO 44200
  365.     CALL RSPEAK(401)            !ALREADY ON.
  366.     RETURN
  367. C
  368. 44200    OFLAG1(PRSO)=OFLAG1(PRSO).OR.ONBT    !TURN IT ON.
  369.     CALL RSPSUB(404,ODO2)
  370. 44300    IF(.NOT.F .AND.LIT(HERE)) F=RMDESC(0)    !ROOM NEWLY LIT.
  371.     RETURN
  372. C
  373. C V124--    TURN OFF.
  374. C
  375. 45000    IF(OBJACT(X)) GO TO 45300        !OBJ HANDLE?
  376.     IF(((OFLAG1(PRSO).AND.LITEBT).NE.0).AND.
  377.     1    (OADV(PRSO).EQ.WINNER)) GO TO 45100
  378.     CALL RSPEAK(402)            !CANT DO IT.
  379.     RETURN
  380. C
  381. 45100    IF((OFLAG1(PRSO).AND.ONBT).NE.0) GO TO 45200
  382.     CALL RSPEAK(403)            !ALREADY OFF.
  383.     RETURN
  384. C
  385. 45200    OFLAG1(PRSO)=OFLAG1(PRSO).AND. .NOT.ONBT
  386.     CALL RSPSUB(405,ODO2)
  387. 45300    IF(.NOT.LIT(HERE)) CALL RSPEAK(406)    !MAY BE DARK.
  388.     RETURN
  389. C
  390. C V125--    OPEN.  A FINE MESS.
  391. C
  392. 46000    IF(OBJACT(X)) RETURN            !OBJ HANDLE?
  393.     IF((OFLAG1(PRSO).AND.CONTBT).NE.0) GO TO 46100
  394. 46050    CALL RSPSUB(407,ODO2)            !NOT OPENABLE.
  395.     RETURN
  396. C
  397. 46100    IF(OCAPAC(PRSO).NE.0) GO TO 46200
  398.     CALL RSPSUB(408,ODO2)            !NOT OPENABLE.
  399.     RETURN
  400. C
  401. 46200    IF(.NOT.QOPEN(PRSO)) GO TO 46225
  402.     CALL RSPEAK(412)            !ALREADY OPEN.
  403.     RETURN
  404. C
  405. 46225    OFLAG2(PRSO)=OFLAG2(PRSO).OR.OPENBT    !OPEN IT.
  406.     IF(((OFLAG1(PRSO).AND.TRANBT).NE.0).OR.QEMPTY(PRSO))
  407.     1    GO TO 46300
  408.     CALL PRINCO(PRSO,410)            !PRINT CONTENTS.
  409.     RETURN
  410. C
  411. 46300    CALL RSPEAK(409)            !DONE
  412.     RETURN
  413. C
  414. C V126--    CLOSE.
  415. C
  416. 47000    IF(OBJACT(X)) RETURN            !OBJ HANDLE?
  417.     IF((OFLAG1(PRSO).AND.CONTBT).EQ.0) GO TO 46050
  418.     IF(OCAPAC(PRSO).NE.0) GO TO 47100
  419.     CALL RSPSUB(411,ODO2)            !NOT CLOSABLE.
  420.     RETURN
  421. C
  422. 47100    IF(QOPEN(PRSO)) GO TO 47200        !OPEN?
  423.     CALL RSPEAK(413)            !NO, JOKE.
  424.     RETURN
  425. C
  426. 47200    OFLAG2(PRSO)=OFLAG2(PRSO).AND. .NOT.OPENBT
  427.     CALL RSPEAK(414)            !DONE.
  428.     RETURN
  429. C VAPPLI, PAGE 7
  430. C
  431. C V127--    FIND.  BIG MEGILLA.
  432. C
  433. 48000    IF(OBJACT(X)) RETURN            !OBJ HANDLE?
  434.     I=415                    !DEFAULT CASE.
  435.     IF(QHERE(PRSO,HERE)) GO TO 48300    !IN ROOM?
  436.     IF(OADV(PRSO).EQ.WINNER) GO TO 48200    !ON WINNER?
  437.     J=OCAN(PRSO)                !DOWN ONE LEVEL.
  438.     IF(J.EQ.0) GO TO 10
  439.     IF((((OFLAG1(J).AND.TRANBT).EQ.0).AND.
  440.     2 (.NOT.QOPEN(J).OR.((OFLAG1(J).AND.(DOORBT+CONTBT)).EQ.0))))
  441.     3    GO TO 10            !IF NOT VISIBLE, PUNT.
  442.     I=417                    !ASSUME IN ROOM.
  443.     IF(QHERE(J,HERE)) GO TO 48100
  444.     IF(OADV(J).NE.WINNER) GO TO 10        !NOT HERE OR ON PERSON.
  445.     I=418
  446. 48100    CALL RSPSUB(I,ODESC2(J))        !DESCRIBE FINDINGS.
  447.     RETURN
  448. C
  449. 48200    I=416
  450. 48300    CALL RSPSUB(I,ODO2)            !DESCRIBE FINDINGS.
  451.     RETURN
  452. C
  453. C V128--    WAIT.  RUN CLOCK DEMON.
  454. C
  455. 49000    CALL RSPEAK(419)            !TIME PASSES.
  456.     DO 49100 I=1,3
  457.       IF(CLOCKD(X)) RETURN
  458. 49100    CONTINUE
  459.     RETURN
  460. C
  461. C V129--    SPIN.
  462. C V159--    TURN TO.
  463. C
  464. 50000    CONTINUE
  465. 88000    IF(.NOT.OBJACT(X)) CALL RSPEAK(663)    !IF NOT OBJ, JOKE.
  466.     RETURN
  467. C
  468. C V130--    BOARD.  WORKS WITH VEHICLES.
  469. C
  470. 51000    IF((OFLAG2(PRSO).AND.VEHBT).NE.0) GO TO 51100
  471.     CALL RSPSUB(421,ODO2)            !NOT VEHICLE, JOKE.
  472.     RETURN
  473. C
  474. 51100    IF(QHERE(PRSO,HERE)) GO TO 51200    !HERE?
  475.     CALL RSPSUB(420,ODO2)            !NO, JOKE.
  476.     RETURN
  477. C
  478. 51200    IF(AV.EQ.0) GO TO 51300            !ALREADY GOT ONE?
  479.     CALL RSPSUB(422,ODO2)            !YES, JOKE.
  480.     RETURN
  481. C
  482. 51300    IF(OBJACT(X)) RETURN            !OBJ HANDLE?
  483.     CALL RSPSUB(423,ODO2)            !DESCRIBE.
  484.     AVEHIC(WINNER)=PRSO
  485.     IF(WINNER.NE.PLAYER) OCAN(AOBJ(WINNER))=PRSO
  486.     RETURN
  487. C
  488. C V131--    DISEMBARK.
  489. C
  490. 52000    IF(AV.EQ.PRSO) GO TO 52100        !FROM VEHICLE?
  491.     CALL RSPEAK(424)            !NO, JOKE.
  492.     RETURN
  493. C
  494. 52100    IF(OBJACT(X)) RETURN            !OBJ HANDLE?
  495.     IF((RFLAG(HERE).AND.RLAND).NE.0) GO TO 52200
  496.     CALL RSPEAK(425)            !NOT ON LAND.
  497.     RETURN
  498. C
  499. 52200    AVEHIC(WINNER)=0
  500.     CALL RSPEAK(426)
  501.     IF(WINNER.NE.PLAYER) CALL NEWSTA(AOBJ(WINNER),0,HERE,0,0)
  502.     RETURN
  503. C
  504. C V132--    TAKE.  HANDLED EXTERNALLY.
  505. C
  506. 53000    VAPPLI=TAKE(.TRUE.)
  507.     RETURN
  508. C
  509. C V133--    INVENTORY.  PROCESSED EXTERNALLY.
  510. C
  511. 55000    CALL INVENT(WINNER)
  512.     RETURN
  513. C VAPPLI, PAGE 8
  514. C
  515. C V134--    FILL.  STRANGE DOINGS WITH WATER.
  516. C
  517. 56000    IF(PRSI.NE.0) GO TO 56050        !ANY OBJ SPECIFIED?
  518.     IF((RFLAG(HERE).AND.(RWATER+RFILL)).NE.0) GO TO 56025
  519.     CALL RSPEAK(516)            !NOTHING TO FILL WITH.
  520.     PRSWON=.FALSE.                !YOU LOSE.
  521.     RETURN
  522. C
  523. 56025    PRSI=GWATE                !USE GLOBAL WATER.
  524. 56050    IF(OBJACT(X)) RETURN            !OBJ HANDLE?
  525.     IF((PRSI.NE.GWATE).AND.(PRSI.NE.WATER))
  526.     1    CALL RSPSB2(444,ODI2,ODO2)    !NO, JOKE.
  527.     RETURN
  528. C
  529. C V135,V136--    EAT/DRINK
  530. C
  531. 58000    CONTINUE
  532. 59000    IF(OBJACT(X)) RETURN            !OBJ HANDLE?
  533.     IF(PRSO.EQ.GWATE) GO TO 59500        !DRINK GLOBAL WATER?
  534.     IF(.NOT.EDIBLE(PRSO)) GO TO 59400    !EDIBLE?
  535.     IF(OADV(PRSO).EQ.WINNER) GO TO 59200    !YES, ON WINNER?
  536. 59100    CALL RSPSUB(454,ODO2)            !NOT ACCESSIBLE.
  537.     RETURN
  538. C
  539. 59200    IF(PRSA.EQ.DRINKW) GO TO 59300        !DRINK FOOD?
  540.     CALL NEWSTA(PRSO,455,0,0,0)        !NO, IT DISAPPEARS.
  541.     RETURN
  542. C
  543. 59300    CALL RSPEAK(456)            !YES, JOKE.
  544.     RETURN
  545. C
  546. 59400    IF(.NOT.DRKBLE(PRSO)) GO TO 59600    !DRINKABLE?
  547.     IF(OCAN(PRSO).EQ.0) GO TO 59100        !YES, IN SOMETHING?
  548.     IF(OADV(OCAN(PRSO)).NE.WINNER) GO TO 59100
  549.     IF(QOPEN(OCAN(PRSO))) GO TO 59500    !CONT OPEN?
  550.     CALL RSPEAK(457)            !NO, JOKE.
  551.     RETURN
  552. C
  553. 59500    CALL NEWSTA(PRSO,458,0,0,0)        !GONE.
  554.     RETURN
  555. C
  556. 59600    CALL RSPSUB(453,ODO2)            !NOT FOOD OR DRINK.
  557.     RETURN
  558. C
  559. C V137--    BURN.  COMPLICATED.
  560. C
  561. 60000    IF((OFLAG1(PRSI).AND.(FLAMBT+LITEBT+ONBT)).NE.
  562.     1    (FLAMBT+LITEBT+ONBT)) GO TO 60400
  563.     IF(OBJACT(X)) RETURN            !OBJ HANDLE?
  564.     IF(OCAN(PRSO).NE.RECEP) GO TO 60050    !BALLOON?
  565.     IF(OAPPLI(OACTIO(BALLO),0)) RETURN    !DID IT HANDLE?
  566. 60050    IF((OFLAG1(PRSO).AND.BURNBT).EQ.0) GO TO 60300
  567.     IF(OADV(PRSO).NE.WINNER) GO TO 60100    !CARRYING IT?
  568.     CALL RSPSUB(459,ODO2)
  569.     CALL JIGSUP(460)
  570.     RETURN
  571. C
  572. 60100    J=OCAN(PRSO)                !GET CONTAINER.
  573.     IF(QHERE(PRSO,HERE).OR. ((AV.NE.0).AND.(J.EQ.AV)))
  574.     1    GO TO 60200            !REACHABLE?
  575.     IF(J.EQ.0) GO TO 60150            !INSIDE?
  576.     IF(.NOT.QOPEN(J)) GO TO 60150        !OPEN?
  577.     IF(QHERE(J,HERE).OR.((AV.NE.0).AND.(OCAN(J).EQ.AV)))
  578.     1    GO TO 60200            !REACHABLE?
  579. 60150    CALL RSPEAK(461)            !CANT REACH IT.
  580.     RETURN
  581. C
  582. 60200    CALL RSPSUB(462,ODO2)            !BURN IT.
  583.     CALL NEWSTA(PRSO,0,0,0,0)
  584.     RETURN
  585. C
  586. 60300    CALL RSPSUB(463,ODO2)            !CANT BURN IT.
  587.     RETURN
  588. C
  589. 60400    CALL RSPSUB(301,ODI2)        !CANT BURN IT WITH THAT.
  590.     RETURN
  591. C VAPPLI, PAGE 9
  592. C
  593. C V138--    MUNG.  GO TO COMMON ATTACK CODE.
  594. C
  595. 63000    I=466                    !CHOOSE PHRASE.
  596.     IF((OFLAG2(PRSO).AND.VILLBT).NE.0) GO TO 66100
  597.     IF(.NOT.OBJACT(X)) CALL RSPSB2(466,ODO2,RMK)
  598.     RETURN
  599. C
  600. C V139--    KILL.  GO TO COMMON ATTACK CODE.
  601. C
  602. 64000    I=467                    !CHOOSE PHRASE.
  603.     GO TO 66100
  604. C
  605. C V140--    SWING.  INVERT OBJECTS, FALL THRU TO ATTACK.
  606. C
  607. 65000    J=PRSO                    !INVERT.
  608.     PRSO=PRSI
  609.     PRSI=J
  610.     J=ODO2
  611.     ODO2=ODI2
  612.     ODI2=J
  613.     PRSA=ATTACW                !FOR OBJACT.
  614. C
  615. C V141--    ATTACK.  FALL THRU TO ATTACK CODE.
  616. C
  617. 66000    I=468
  618. C
  619. C COMMON MUNG/ATTACK/SWING/KILL CODE.
  620. C
  621. 66100    IF(PRSO.NE.0) GO TO 66200        !ANYTHING?
  622.     CALL RSPEAK(469)            !NO, JOKE.
  623.     RETURN
  624. C
  625. 66200    IF(OBJACT(X)) RETURN            !OBJ HANDLE?
  626.     IF((OFLAG2(PRSO).AND.VILLBT).NE.0) GO TO 66300
  627.     IF((OFLAG1(PRSO).AND.VICTBT).EQ.0)
  628.     1    CALL RSPSUB(470,ODO2)        !NOT A VILLAIN.
  629.     RETURN
  630. C
  631. 66300    J=471                    !ASSUME NO WEAPON.
  632.     IF(PRSI.EQ.0) GO TO 66500
  633.     IF((OFLAG2(PRSI).AND.WEAPBT).EQ.0) GO TO 66400
  634.     MELEE=1                    !ASSUME SWORD.
  635.     IF(PRSI.NE.SWORD) MELEE=2        !MUST BE KNIFE.
  636.     I=BLOW(PLAYER,PRSO,MELEE,.TRUE.,0)    !STRIKE BLOW.
  637.     RETURN
  638. C
  639. 66400    J=472                    !NOT A WEAPON.
  640. 66500    CALL RSPSB2(I,ODO2,J)            !JOKE.
  641.     RETURN
  642. C VAPPLI, PAGE 10
  643. C
  644. C V142--    WALK.  PROCESSED EXTERNALLY.
  645. C
  646. 68000    VAPPLI=WALK(X)
  647.     RETURN
  648. C
  649. C V143--    TELL.  PROCESSED IN GAME.
  650. C
  651. 69000    CALL RSPEAK(603)
  652.     RETURN
  653. C
  654. C V144--    PUT.  PROCESSED EXTERNALLY.
  655. C
  656. 70000    VAPPLI=PUT(.TRUE.)
  657.     RETURN
  658. C
  659. C V145,V146,V147,V148--    DROP/GIVE/POUR/THROW
  660. C
  661. 71000    CONTINUE
  662. 72000    CONTINUE
  663. 73000    CONTINUE
  664. 74000    VAPPLI=DROP(.FALSE.)
  665.     RETURN
  666. C
  667. C V149--    SAVE
  668. C
  669. 77000    IF((RFLAG(TSTRS).AND.RSEEN).EQ.0) GO TO 77100
  670.     CALL RSPEAK(828)            !NO SAVES IN ENDGAME.
  671.     RETURN
  672. C
  673. 77100    CALL SAVEGM
  674.     RETURN
  675. C
  676. C V150--    RESTORE
  677. C
  678. 78000    IF((RFLAG(TSTRS).AND.RSEEN).EQ.0) GO TO 78100
  679.     CALL RSPEAK(829)            !NO RESTORES IN ENDGAME.
  680.     RETURN
  681. C
  682. 78100    CALL RSTRGM
  683.     RETURN
  684. C VAPPLI, PAGE 11
  685. C
  686. C V151--    HELLO
  687. C
  688. 80000    IF(PRSO.NE.0) GO TO 80100        !ANY OBJ?
  689.     CALL RSPEAK(346+RND(4))            !NO, VANILLA HELLO.
  690.     RETURN
  691. C
  692. 80100    IF(PRSO.NE.AVIAT) GO TO 80200        !HELLO AVIATOR?
  693.     CALL RSPEAK(350)            !NOTHING HAPPENS.
  694.     RETURN
  695. C
  696. 80200    IF(PRSO.NE.SAILO) GO TO 80300        !HELLO SAILOR?
  697.     HS=HS+1                    !COUNT.
  698.     I=351                    !GIVE NORMAL OR
  699.     IF(MOD(HS,10).EQ.0) I=352        !RANDOM MESSAGE.
  700.     IF(MOD(HS,20).EQ.0) I=353
  701.     CALL RSPEAK(I)                !SPEAK UP.
  702.     RETURN
  703. C
  704. 80300    IF(OBJACT(X)) RETURN            !OBJ HANDLE?
  705.     I=354                    !ASSUME VILLAIN.
  706.     IF((OFLAG2(PRSO).AND.(VILLBT+ACTRBT)).EQ.0) I=355
  707.     CALL RSPSUB(I,ODO2)            !HELLO THERE!
  708.     RETURN
  709. C
  710. C V152--    LOOK INTO
  711. C
  712. 81000    IF(OBJACT(X)) RETURN            !OBJ HANDLE?
  713.     IF((OFLAG1(PRSO).AND.DOORBT).EQ.0) GO TO 81300    !DOOR?
  714.     IF(.NOT.QOPEN(PRSO)) GO TO 81200    !OPEN?
  715.     CALL RSPSUB(628,ODO2)            !OPEN DOOR- UNINTERESTING.
  716.     RETURN
  717. C
  718. 81200    CALL RSPSUB(525,ODO2)            !CLOSED DOOR- CANT SEE.
  719.     RETURN
  720. C
  721. 81300    IF((OFLAG2(PRSO).AND.VEHBT).NE.0) GO TO 81400    !VEHICLE?
  722.     IF(QOPEN(PRSO).OR.((OFLAG1(PRSO).AND.TRANBT).NE.0))
  723.     1    GO TO 81400            !OPEN OR SEE INSIDE?
  724.     IF((OFLAG1(PRSO).AND.CONTBT).NE.0) GO TO 81200    !CLOSED CONT?
  725.     CALL RSPSUB(630,ODO2)            !CANT LOOK INSIDE.
  726.     RETURN
  727. C
  728. 81400    IF(QEMPTY(PRSO)) GO TO 81500        !VEH OR SEE IN.  EMPTY?
  729.     CALL PRINCO(PRSO,573)            !NO, LIST CONTENTS.
  730.     RETURN
  731. C
  732. 81500    CALL RSPSUB(629,ODO2)            !EMPTY.
  733.     RETURN
  734. C
  735. C V153--    LOOK UNDER
  736. C
  737. 82000    IF(.NOT.OBJACT(X)) CALL RSPEAK(631)    !OBJECT HANDLE?
  738.     RETURN
  739. C VAPPLI, PAGE 12
  740. C
  741. C V154--    PUMP
  742. C
  743. 83000    IF((OROOM(PUMP).EQ.HERE).OR.(OADV(PUMP).EQ.WINNER))
  744.     1    GO TO 83100            !PUMP HERE?
  745.     CALL RSPEAK(632)            !NO.
  746.     RETURN
  747. C
  748. 83100    PRSI=PUMP                !BECOMES INFLATE
  749.     PRSA=INFLAW                !X WITH PUMP.
  750.     GO TO 22000                !DONE.
  751. C
  752. C V155--    WIND
  753. C
  754. 84000    IF(.NOT.OBJACT(X)) CALL RSPSUB(634,ODO2)    !OBJ HANDLE?
  755.     RETURN
  756. C
  757. C V156--    CLIMB
  758. C V157--    CLIMB UP
  759. C V158--    CLIMB DOWN
  760. C
  761. 85000    CONTINUE
  762. 86000    CONTINUE
  763. 87000    I=XUP                    !ASSUME UP.
  764.     IF(PRSA.EQ.CLMBDW) I=XDOWN        !UNLESS CLIMB DN.
  765.     F=(OFLAG2(PRSO).AND.CLMBBT).NE.0
  766.     IF(F.AND.FINDXT(I,HERE)) GO TO 87500        !ANYTHING TO CLIMB?
  767.     IF(OBJACT(X)) RETURN            !OBJ HANDLE?
  768.     I=657
  769.     IF(F) I=524                !VARIETY OF JOKES.
  770.     IF(.NOT.F .AND.((PRSO.EQ.WALL).OR.
  771.     1    ((PRSO.GE.WNORT).AND.(PRSO.LE.WNORT+3))))
  772.     2    I=656                !IF WALLS.
  773.     CALL RSPEAK(I)            !JOKE.
  774.     RETURN
  775. C
  776. 87500    PRSA=WALKW                !WALK
  777.     PRSO=I                    !IN SPECIFIED DIR.
  778.     VAPPLI=WALK(X)
  779.     RETURN
  780. C
  781.     END
  782. C CLOCKD- CLOCK DEMON FOR INTERMOVE CLOCK EVENTS
  783. C
  784. C DECLARATIONS
  785. C
  786.     LOGICAL FUNCTION CLOCKD(X)
  787.     IMPLICIT INTEGER (A-Z)
  788. C
  789. C CLOCK INTERRUPTS
  790. C
  791.     LOGICAL*1 CFLAG
  792.     COMMON /CEVENT/ CLNT,CTICK(25),CACTIO(25),CFLAG(25)
  793. C
  794.     CLOCKD=.FALSE.            !ASSUME NO ACTION.
  795.     DO 100 I=1,CLNT
  796.       IF(.NOT.CFLAG(I) .OR.(CTICK(I).EQ.0)) GO TO 100
  797.       IF(CTICK(I).LT.0) GO TO 50        !PERMANENT ENTRY?
  798.       CTICK(I)=CTICK(I)-1
  799.       IF(CTICK(I).NE.0) GO TO 100        !TIMER EXPIRED?
  800. 50      CLOCKD=.TRUE.
  801.       CALL CEVAPP(CACTIO(I))        !DO ACTION.
  802. 100    CONTINUE
  803.     RETURN
  804. C
  805.     END
  806.