home *** CD-ROM | disk | FTP | other *** search
/ Oakland CPM Archive / oakcpm.iso / sigm / sigmv045.ark / OBJCTS.FTN < prev    next >
Encoding:
Text File  |  1984-04-29  |  20.2 KB  |  732 lines

  1. C OAPPLI- OBJECT SPECIAL ACTION ROUTINES
  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 OAPPLI(RI,ARG)
  10.     IMPLICIT INTEGER (A-Z)
  11.     LOGICAL SOBJS,NOBJS
  12.     LOGICAL QOPEN,QON,LIT
  13.     LOGICAL MOVETO,RMDESC,CLOCKD
  14.     LOGICAL THIEFP,CYCLOP,TROLLP,BALLOP,LIGHTP
  15.     LOGICAL QEMPTY,QHERE,F,OPNCLS
  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 /BATS/ BATDRP(9)
  30. C
  31. C PUZZLE ROOM
  32. C
  33.     COMMON /PUZZLE/ CPDR(16),CPWL(8),CPVEC(64)
  34. C
  35. C ROOMS
  36. C
  37.     COMMON /ROOMS/ RLNT,RDESC2,RDESC1(200),REXIT(200),
  38.     1    RACTIO(200),RVAL(200),RFLAG(200)
  39.     INTEGER RRAND(200)
  40.     EQUIVALENCE (RVAL,RRAND)
  41. C
  42.     COMMON /RFLAG/ RSEEN,RLIGHT,RLAND,RWATER,RAIR,
  43.     1    RSACRD,RFILL,RMUNG,RBUCK,RHOUSE,RNWALL,REND
  44. C
  45.     COMMON /RINDEX/ WHOUS,LROOM,CELLA
  46.     COMMON /RINDEX/ MTROL,MAZE1    
  47.     COMMON /RINDEX/ MGRAT,MAZ15    
  48.     COMMON /RINDEX/ FORE1,FORE3,CLEAR,RESER
  49.     COMMON /RINDEX/ STREA,EGYPT,ECHOR
  50.     COMMON /RINDEX/ TSHAF    
  51.     COMMON /RINDEX/ BSHAF,MMACH,DOME,MTORC
  52.     COMMON /RINDEX/ CAROU    
  53.     COMMON /RINDEX/ RIDDL,LLD2,TEMP1,TEMP2,MAINT
  54.     COMMON /RINDEX/ BLROO,TREAS,RIVR1,RIVR2,RIVR3,MCYCL
  55.     COMMON /RINDEX/ RIVR4,RIVR5,FCHMP,FALLS,MBARR
  56.     COMMON /RINDEX/ MRAIN,POG,VLBOT,VAIR1,VAIR2,VAIR3,VAIR4
  57.     COMMON /RINDEX/ LEDG2,LEDG3,LEDG4,MSAFE,CAGER
  58.     COMMON /RINDEX/ CAGED,TWELL,BWELL,ALICE,ALISM,ALITR
  59.     COMMON /RINDEX/ MTREE,BKENT,BKVW,BKTWI,BKVAU,BKBOX
  60.     COMMON /RINDEX/ CRYPT,TSTRS,MRANT,MREYE
  61.     COMMON /RINDEX/ MRA,MRB,MRC,MRG,MRD,FDOOR
  62.     COMMON /RINDEX/ MRAE,MRCE,MRCW,MRGE,MRGW,MRDW,INMIR
  63.     COMMON /RINDEX/ SCORR,NCORR,PARAP,CELL,PCELL,NCELL
  64.     COMMON /RINDEX/ CPANT,CPOUT,CPUZZ
  65. C
  66. C OBJECTS
  67. C
  68.     COMMON /OBJCTS/ OLNT,ODESC1(220),ODESC2(220),ODESCO(220),
  69.     1    OACTIO(220),OFLAG1(220),OFLAG2(220),OFVAL(220),
  70.     2    OTVAL(220),OSIZE(220),OCAPAC(220),OROOM(220),
  71.     3    OADV(220),OCAN(220),OREAD(220)
  72. C
  73.     COMMON /OFLAGS/ VISIBT,READBT,TAKEBT,DOORBT,TRANBT,FOODBT,
  74.     1    NDSCBT,DRNKBT,CONTBT,LITEBT,VICTBT,BURNBT,FLAMBT,
  75.     2    TOOLBT,TURNBT,ONBT
  76.     COMMON /OFLAGS/ FINDBT,SLEPBT,SCRDBT,TIEBT,CLMBBT,ACTRBT,
  77.     1    WEAPBT,FITEBT,VILLBT,STAGBT,TRYBT,NOCHBT,OPENBT,
  78.     2    TCHBT,VEHBT,SCHBT
  79. C
  80.     COMMON /OINDEX/ GARLI,FOOD,GUNK,COAL,MACHI,DIAMO,TCASE,BOTTL
  81.     COMMON /OINDEX/ WATER,ROPE,KNIFE,SWORD,LAMP,BLAMP,RUG
  82.     COMMON /OINDEX/    LEAVE,TROLL,AXE
  83.     COMMON /OINDEX/ RKNIF,KEYS,ICE,BAR
  84.     COMMON /OINDEX/ COFFI,TORCH,TBASK,FBASK,IRBOX
  85.     COMMON /OINDEX/ GHOST,TRUNK,BELL,BOOK,CANDL
  86.     COMMON /OINDEX/ MATCH,TUBE,PUTTY,WRENC,SCREW,CYCLO,CHALI
  87.     COMMON /OINDEX/ THIEF,STILL,WINDO,GRATE,DOOR
  88.     COMMON /OINDEX/ HPOLE,LEAK,RBUTT,RAILI
  89.     COMMON /OINDEX/ POT,STATU,IBOAT,DBOAT,PUMP,RBOAT
  90.     COMMON /OINDEX/ STICK,BUOY,SHOVE,BALLO,RECEP,GUANO
  91.     COMMON /OINDEX/ BROPE,HOOK1,HOOK2,SAFE,SSLOT,BRICK,FUSE
  92.     COMMON /OINDEX/ GNOME,BLABE,DBALL,TOMB
  93.     COMMON /OINDEX/ LCASE,CAGE,RCAGE,SPHER,SQBUT
  94.     COMMON /OINDEX/ FLASK,POOL,SAFFR,BUCKE,ECAKE,ORICE,RDICE,BLICE
  95.     COMMON /OINDEX/ ROBOT,FTREE,BILLS,PORTR,SCOL,ZGNOM
  96.     COMMON /OINDEX/ EGG,BEGG,BAUBL,CANAR,BCANA
  97.     COMMON /OINDEX/ YLWAL,RDWAL,PINDR,RBEAM
  98.     COMMON /OINDEX/ ODOOR,QDOOR,CDOOR,NUM1,NUM8
  99.     COMMON /OINDEX/ WARNI,CSLIT,GCARD,STLDR
  100.     COMMON /OINDEX/ HANDS,WALL,LUNGS,SAILO,AVIAT,TEETH
  101.     COMMON /OINDEX/ ITOBJ,EVERY,VALUA,OPLAY,WNORT,GWATE,MASTER
  102. C
  103. C CLOCK INTERRUPTS
  104. C
  105.     LOGICAL*1 CFLAG
  106.     COMMON /CEVENT/ CLNT,CTICK(25),CACTIO(25),CFLAG(25)
  107. C
  108.     COMMON /CINDEX/ CEVCUR,CEVMNT,CEVLNT,CEVMAT,CEVCND,
  109.     1    CEVBAL,CEVBRN,CEVFUS,CEVLED,CEVSAF,CEVVLG,
  110.     2    CEVGNO,CEVBUC,CEVSPH,CEVEGH,
  111.     3    CEVFOR,CEVSCL,CEVZGI,CEVZGO,CEVSTE,
  112.     5    CEVMRS,CEVPIN,CEVINQ,CEVFOL
  113.  
  114. C
  115. C ADVENTURERS
  116. C
  117.     COMMON /ADVS/ ALNT,AROOM(4),ASCORE(4),AVEHIC(4),
  118.     1    AOBJ(4),AACTIO(4),ASTREN(4),AFLAG(4)
  119. C
  120.     COMMON /AINDEX/ PLAYER,AROBOT,AMASTR
  121. C
  122. C VERBS
  123. C
  124.     COMMON /VINDEX/ CINTW,DEADXW,FRSTQW,INXW,OUTXW
  125.     COMMON /VINDEX/ WALKIW,FIGHTW,FOOW
  126.     COMMON /VINDEX/ MELTW,READW,INFLAW,DEFLAW,ALARMW,EXORCW
  127.     COMMON /VINDEX/ PLUGW,KICKW,WAVEW,RAISEW,LOWERW,RUBW
  128.     COMMON /VINDEX/ PUSHW,UNTIEW,TIEW,TIEUPW,TURNW,BREATW
  129.     COMMON /VINDEX/ KNOCKW,LOOKW,EXAMIW,SHAKEW,MOVEW,TRNONW,TRNOFW
  130.     COMMON /VINDEX/ OPENW,CLOSEW,FINDW,WAITW,SPINW,BOARDW,UNBOAW,TAKEW
  131.     COMMON /VINDEX/ INVENW,FILLW,EATW,DRINKW,BURNW
  132.     COMMON /VINDEX/ MUNGW,KILLW,ATTACW,SWINGW
  133.     COMMON /VINDEX/ WALKW,TELLW,PUTW,DROPW,GIVEW,POURW,THROWW
  134.     COMMON /VINDEX/ DIGW,LEAPW,STAYW,FOLLOW
  135.     COMMON /VINDEX/ HELLOW,LOOKIW,LOOKUW,PUMPW,WINDW
  136.     COMMON /VINDEX/ CLMBW,CLMBUW,CLMBDW,TRNTOW
  137. C
  138. C FLAGS
  139. C
  140.     LOGICAL*1 TROLLF,CAGESF,BUCKTF,CAROFF,CAROZF,LWTIDF
  141.     LOGICAL*1 DOMEF,GLACRF,ECHOF,RIDDLF,LLDF,CYCLOF
  142.     LOGICAL*1 MAGICF,LITLDF,SAFEF,GNOMEF,GNODRF,MIRRMF
  143.     LOGICAL*1 EGYPTF,ONPOLF,BLABF,BRIEFF,SUPERF,BUOYF
  144.     LOGICAL*1 GRUNLF,GATEF,RAINBF,CAGETF,EMPTHF,DEFLAF
  145.     LOGICAL*1 GLACMF,FROBZF,ENDGMF,BADLKF,THFENF,SINGSF
  146.     LOGICAL*1 MRPSHF,MROPNF,WDOPNF,MR1F,MR2F,INQSTF
  147.     LOGICAL*1 FOLLWF,SPELLF,CPOUTF,CPUSHF
  148.     COMMON /FINDEX/ TROLLF,CAGESF,BUCKTF,CAROFF,CAROZF,LWTIDF,
  149.     1    DOMEF,GLACRF,ECHOF,RIDDLF,LLDF,CYCLOF,
  150.     2    MAGICF,LITLDF,SAFEF,GNOMEF,GNODRF,MIRRMF,
  151.     3    EGYPTF,ONPOLF,BLABF,BRIEFF,SUPERF,BUOYF,
  152.     4    GRUNLF,GATEF,RAINBF,CAGETF,EMPTHF,DEFLAF,
  153.     5    GLACMF,FROBZF,ENDGMF,BADLKF,THFENF,SINGSF,
  154.     6    MRPSHF,MROPNF,WDOPNF,MR1F,MR2F,INQSTF,
  155.     7    FOLLWF,SPELLF,CPOUTF,CPUSHF
  156.     COMMON /FINDEX/ BTIEF,BINFF
  157.     COMMON /FINDEX/ RVMNT,RVCLR,RVCYC,RVSND,RVGUA
  158.     COMMON /FINDEX/ ORRUG,ORCAND,ORMTCH,ORLAMP
  159.     COMMON /FINDEX/ MDIR,MLOC,POLEUF
  160.     COMMON /FINDEX/ QUESNO,NQATT,CORRCT
  161.     COMMON /FINDEX/ LCELL,PNUMB,ACELL,DCELL,CPHERE
  162. C
  163. C FUNCTIONS AND DATA
  164. C
  165.     QOPEN(R)=(OFLAG2(R).AND.OPENBT).NE.0
  166.     QON(R)=(OFLAG1(R).AND.ONBT).NE.0
  167.     DATA MXSMP/99/
  168. C OAPPLI, PAGE 2
  169. C
  170.     IF(RI.EQ.0) GO TO 10            !ZERO IS FALSE APP.
  171.     IF(RI.LE.MXSMP) GO TO 100        !SIMPLE OBJECT?
  172.     IF(PRSO.NE.0) ODO2=ODESC2(PRSO)
  173.     IF(PRSI.NE.0) ODI2=ODESC2(PRSI)
  174.     AV=AVEHIC(WINNER)
  175.     FLOBTS=FLAMBT+LITEBT+ONBT
  176.     OAPPLI=.TRUE.
  177. C
  178.     GO TO (2000,5000,10000,11000,12000,15000,18000,
  179.     1 19000,20000,22000,25000,26000,32000,35000,39000,40000,
  180.     2 45000,47000,48000,49000,50000,51000,52000,54000,55000,
  181.     3 56000,57000,58000,59000,60000,61000,62000),
  182.     3    (RI-MXSMP)
  183.     CALL BUG(6,RI)
  184. C
  185. C RETURN HERE TO DECLARE FALSE RESULT
  186. C
  187. 10    OAPPLI=.FALSE.
  188.     RETURN
  189. C
  190. C SIMPLE OBJECTS, PROCESSED EXTERNALLY.
  191. C
  192. 100    IF(RI.LT.32) OAPPLI=SOBJS(RI,ARG)
  193.     IF(RI.GE.32) OAPPLI=NOBJS(RI,ARG)
  194.     RETURN
  195. C OAPPLI, PAGE 3
  196. C
  197. C O100--    MACHINE FUNCTION
  198. C
  199. 2000    IF(HERE.NE.MMACH) GO TO 10        !NOT HERE? F
  200.     OAPPLI=OPNCLS(MACHI,123,124)        !HANDLE OPN/CLS.
  201.     RETURN
  202. C
  203. C O101--    WATER FUNCTION
  204. C
  205. 5000    IF(PRSA.NE.FILLW) GO TO 5050        !FILL X WITH Y IS
  206.     PRSA=PUTW                !MADE INTO
  207.     I=PRSI
  208.     PRSI=PRSO
  209.     PRSO=I                    !PUT Y IN X.
  210.     I=ODI2
  211.     ODI2=ODO2
  212.     ODO2=I
  213. 5050    IF((PRSO.EQ.WATER).OR.(PRSO.EQ.GWATE)) GO TO 5100
  214.     CALL RSPEAK(561)            !WATER IS IND OBJ,
  215.     RETURN                    !PUNT.
  216. C
  217. 5100    IF(PRSA.NE.TAKEW) GO TO 5400        !TAKE WATER?
  218.     IF((OADV(BOTTL).EQ.WINNER).AND.(OCAN(PRSO).NE.BOTTL))
  219.     1    GO TO 5500            !TAKE, NOT IN BOTTLE.
  220.     IF(OCAN(PRSO).EQ.0) GO TO 5200        !INSIDE ANYTHING?
  221.     IF(QOPEN(OCAN(PRSO))) GO TO 5200    !YES, OPEN?
  222.     CALL RSPEAK(525,ODESC2(OCAN(PRSO)))    !INSIDE, CLOSED, PUNT.
  223.     RETURN
  224. C
  225. 5200    CALL RSPEAK(615)            !NOT INSIDE OR OPEN,
  226.     RETURN                    !SLIPS THRU FINGERS.
  227. C
  228. 5400    IF(PRSA.NE.PUTW) GO TO 5700        !PUT WATER IN X?
  229.     IF((AV.NE.0).AND.(PRSI.EQ.AV)) GO TO 5800    !IN VEH?
  230.     IF(PRSI.EQ.BOTTL) GO TO 5500        !IN BOTTLE?
  231.     CALL RSPSUB(297,ODI2)            !WONT GO ELSEWHERE.
  232.     CALL NEWSTA(PRSO,0,0,0,0)        !VANISH WATER.
  233.     RETURN
  234. C
  235. 5500    IF(QOPEN(BOTTL)) GO TO 5550        !BOTTLE OPEN?
  236.     CALL RSPEAK(612)            !NO, LOSE.
  237.     RETURN
  238. C
  239. 5550    IF(QEMPTY(BOTTL)) GO TO 5600        !OPEN, EMPTY?
  240.     CALL RSPEAK(613)            !NO, ALREADY FULL.
  241.     RETURN
  242. C
  243. 5600    CALL NEWSTA(WATER,614,0,BOTTL,0)    !TAKE WATER TO BOTTLE.
  244.     RETURN
  245. C
  246. 5700    IF((PRSA.NE.DROPW).AND.(PRSA.NE.POURW).AND.
  247.     1    (PRSA.NE.GIVEW)) GO TO 5900    !DROP, POUR, GIVE?
  248.     IF(AV.NE.0) GO TO 5800            !INTO VEHICLE?
  249.     CALL NEWSTA(PRSO,133,0,0,0)        !NO, VANISHES.
  250.     RETURN
  251. C
  252. 5800    CALL NEWSTA(WATER,0,0,AV,0)        !WATER INTO VEHICLE.
  253.     CALL RSPSUB(296,ODESC2(AV))        !DESCRIBE.
  254.     RETURN
  255. C
  256. 5900    IF(PRSA.NE.THROWW) GO TO 10        !LAST CHANCE, THROW?
  257.     CALL NEWSTA(PRSO,132,0,0,0)        !VANISHES.
  258.     RETURN
  259. C OAPPLI, PAGE 4
  260. C
  261. C O102--    LEAF PILE
  262. C
  263. 10000    IF(PRSA.NE.BURNW) GO TO 10500        !BURN?
  264.     IF(OROOM(PRSO).EQ.0) GO TO 10100    !WAS HE CARRYING?
  265.     CALL NEWSTA(PRSO,158,0,0,0)        !NO, BURN IT.
  266.     RETURN
  267. C
  268. 10100    CALL NEWSTA(PRSO,0,HERE,0,0)        !DROP LEAVES.
  269.     CALL JIGSUP(159)            !BURN HIM.
  270.     RETURN
  271. C
  272. 10500    IF(PRSA.NE.MOVEW) GO TO 10600        !MOVE?
  273.     CALL RSPEAK(2)                !DONE.
  274.     RETURN
  275. C
  276. 10600    IF((PRSA.NE.LOOKUW).OR.(RVCLR.NE.0)) GO TO 10
  277.     CALL RSPEAK(344)            !LOOK UNDER?
  278.     RETURN
  279. C
  280. C O103--    TROLL, DONE EXTERNALLY.
  281. C
  282. 11000    OAPPLI=TROLLP(ARG)            !TROLL PROCESSOR.
  283.     RETURN
  284. C
  285. C O104--    RUSTY KNIFE.
  286. C
  287. 12000    IF(PRSA.NE.TAKEW) GO TO 12100        !TAKE?
  288.     IF(OADV(SWORD).EQ.WINNER) CALL RSPEAK(160) !PULSE SWORD.
  289.     GO TO 10
  290. C
  291. 12100    IF((((PRSA.NE.ATTACW).AND.(PRSA.NE.KILLW)).OR.
  292.     1    (PRSI.NE.RKNIF)).AND.
  293.     2  (((PRSA.NE.SWINGW).AND.(PRSA.NE.THROWW)).OR.
  294.     3    (PRSO.NE.RKNIF))) GO TO 10
  295.     CALL NEWSTA(RKNIF,0,0,0,0)        !KILL KNIFE.
  296.     CALL JIGSUP(161)            !KILL HIM.
  297.     RETURN
  298. C OAPPLI, PAGE 5
  299. C
  300. C O105--    GLACIER
  301. C
  302. 15000    IF(PRSA.NE.THROWW) GO TO 15500    !THROW?
  303.     IF(PRSO.NE.TORCH) GO TO 15400        !TORCH?
  304.     CALL NEWSTA(ICE,169,0,0,0)        !MELT ICE.
  305.     ODESC1(TORCH)=174            !MUNG TORCH.
  306.     ODESC2(TORCH)=173
  307.     OFLAG1(TORCH)=OFLAG1(TORCH).AND. .NOT.FLOBTS
  308.     CALL NEWSTA(TORCH,0,STREA,0,0)        !MOVE TORCH.
  309.     GLACRF=.TRUE.                !GLACIER GONE.
  310.     IF(.NOT.LIT(HERE)) CALL RSPEAK(170)    !IN DARK?
  311.     RETURN
  312. C
  313. 15400    CALL RSPEAK(171)            !JOKE IF NOT TORCH.
  314.     RETURN
  315. C
  316. 15500    IF((PRSA.NE.MELTW).OR.(PRSO.NE.ICE)) GO TO 10
  317.     IF((OFLAG1(PRSI).AND.FLOBTS).EQ.FLOBTS) GO TO 15600
  318.     CALL RSPSUB(298,ODI2)            !CANT MELT WITH THAT.
  319.     RETURN
  320. C
  321. 15600    GLACMF=.TRUE.                !PARTIAL MELT.
  322.     IF(PRSI.NE.TORCH) GO TO 15700        !MELT WITH TORCH?
  323.     ODESC1(TORCH)=174            !MUNG TORCH.
  324.     ODESC2(TORCH)=173
  325.     OFLAG1(TORCH)=OFLAG1(TORCH).AND. .NOT.FLOBTS
  326. 15700    CALL JIGSUP(172)            !DROWN.
  327.     RETURN
  328. C
  329. C O106--    BLACK BOOK
  330. C
  331. 18000    IF(PRSA.NE.OPENW) GO TO 18100        !OPEN?
  332.     CALL RSPEAK(180)            !JOKE.
  333.     RETURN
  334. C
  335. 18100    IF(PRSA.NE.CLOSEW) GO TO 18200        !CLOSE?
  336.     CALL RSPEAK(181)
  337.     RETURN
  338. C
  339. 18200    IF(PRSA.NE.BURNW) GO TO 10        !BURN?
  340.     CALL NEWSTA(PRSO,0,0,0,0)        !FATAL JOKE.
  341.     CALL JIGSUP(182)
  342.     RETURN
  343. C OAPPLI, PAGE 6
  344. C
  345. C O107--    CANDLES, PROCESSED EXTERNALLY
  346. C
  347. 19000    OAPPLI=LIGHTP(CANDL)
  348.     RETURN
  349. C
  350. C O108--    MATCHES, PROCESSED EXTERNALLY
  351. C
  352. 20000    OAPPLI=LIGHTP(MATCH)
  353.     RETURN
  354. C
  355. C O109--    CYCLOPS, PROCESSED EXTERNALLY.
  356. C
  357. 22000    OAPPLI=CYCLOP(ARG)            !CYCLOPS
  358.     RETURN
  359. C
  360. C O110--    THIEF, PROCESSED EXTERNALLY
  361. C
  362. 25000    OAPPLI=THIEFP(ARG)
  363.     RETURN
  364. C
  365. C O111--    WINDOW
  366. C
  367. 26000    OAPPLI=OPNCLS(WINDO,208,209)        !OPEN/CLS WINDOW.
  368.     RETURN
  369. C
  370. C O112--    PILE OF BODIES
  371. C
  372. 32000    IF(PRSA.NE.TAKEW) GO TO 32500        !TAKE?
  373.     CALL RSPEAK(228)            !CANT.
  374.     RETURN
  375. C
  376. 32500    IF((PRSA.NE.BURNW).AND.(PRSA.NE.MUNGW)) GO TO 10
  377.     IF(ONPOLF) RETURN            !BURN OR MUNG?
  378.     ONPOLF=.TRUE.                !SET HEAD ON POLE.
  379.     CALL NEWSTA(HPOLE,0,LLD2,0,0)
  380.     CALL JIGSUP(229)            !BEHEADED.
  381.     RETURN
  382. C
  383. C O113--    VAMPIRE BAT
  384. C
  385. 35000    CALL RSPEAK(50)                !TIME TO FLY, JACK.
  386.     F=MOVETO(BATDRP(RND(9)+1),WINNER)    !SELECT RANDOM DEST.
  387.     F=RMDESC(0)
  388.     RETURN
  389. C OAPPLI, PAGE 7
  390. C
  391. C O114--    STICK
  392. C
  393. 39000    IF(PRSA.NE.WAVEW) GO TO 10        !WAVE?
  394.     IF(HERE.EQ.MRAIN) GO TO 39500        !ON RAINBOW?
  395.     IF((HERE.EQ.POG).OR.(HERE.EQ.FALLS)) GO TO 39200
  396.     CALL RSPEAK(244)            !NOTHING HAPPENS.
  397.     RETURN
  398. C
  399. 39200    OFLAG1(POT)=OFLAG1(POT).OR.VISIBT    !MAKE GOLD VISIBLE.
  400.     RAINBF=.NOT. RAINBF            !COMPLEMENT RAINBOW.
  401.     I=245                    !ASSUME OFF.
  402.     IF(RAINBF) I=246            !IF ON, SOLID.
  403.     CALL RSPEAK(I)                !DESCRIBE.
  404.     RETURN
  405. C
  406. 39500    RAINBF=.FALSE.                !ON RAINBOW,
  407.     CALL JIGSUP(247)            !TAKE A FALL.
  408.     RETURN
  409. C
  410. C O115--    BALLOON, HANDLED EXTERNALLY
  411. C
  412. 40000    OAPPLI=BALLOP(ARG)
  413.     RETURN
  414. C
  415. C O116--    HEADS
  416. C
  417. 45000    IF(PRSA.NE.HELLOW) GO TO 45100        !HELLO HEADS?
  418.     CALL RSPEAK(633)            !TRULY BIZARRE.
  419.     RETURN
  420. C
  421. 45100    IF(PRSA.EQ.READW) GO TO 10        !READ IS OK.
  422.     CALL NEWSTA(LCASE,260,LROOM,0,0)    !MAKE LARGE CASE.
  423.     I=ROBADV(WINNER,0,LCASE,0)+ROBRM(HERE,100,0,LCASE,0)
  424.     CALL JIGSUP(261)            !KILL HIM.
  425.     RETURN
  426. C OAPPLI, PAGE 8
  427. C
  428. C O117--    SPHERE
  429. C
  430. 47000    IF(CAGESF.OR.(PRSA.NE.TAKEW)) GO TO 10    !TAKE?
  431.     IF(WINNER.NE.PLAYER) GO TO 47500    !ROBOT TAKE?
  432.     CALL RSPEAK(263)            !NO, DROP CAGE.
  433.     IF(OROOM(ROBOT).NE.HERE) GO TO 47200    !ROBOT HERE?
  434.     F=MOVETO(CAGED,WINNER)            !YES, MOVE INTO CAGE.
  435.     CALL NEWSTA(ROBOT,0,CAGED,0,0)    !MOVE ROBOT.
  436.     AROOM(AROBOT)=CAGED
  437.     OFLAG1(ROBOT)=OFLAG1(ROBOT).OR.NDSCBT    !DONT DESCRIBE ROBOT.
  438.     CTICK(CEVSPH)=10            !GET OUT IN 10 OR ELSE.
  439.     RETURN
  440. C
  441. 47200    CALL NEWSTA(SPHER,0,0,0,0)        !YOURE DEAD.
  442.     RFLAG(CAGER)=RFLAG(CAGER).OR.RMUNG    !MUNG CAGE ROOM.
  443.     RRAND(CAGER)=147
  444.     CALL JIGSUP(148)            !MUNG PLAYER.
  445.     RETURN
  446. C
  447. 47500    CALL NEWSTA(SPHER,0,0,0,0)        !ROBOT TRIED,
  448.     CALL NEWSTA(ROBOT,264,0,0,0)        !KILL HIM.
  449.     CALL NEWSTA(CAGE,0,HERE,0,0)        !INSERT MANGLED CAGE.
  450.     RETURN
  451. C
  452. C O118--    GEOMETRICAL BUTTONS
  453. C
  454. 48000    IF(PRSA.NE.PUSHW) GO TO 10        !PUSH?
  455.     I=PRSO-SQBUT+1                !GET BUTTON INDEX.
  456.     IF((I.LE.0).OR.(I.GE.4)) GO TO 10    !A BUTTON?
  457.     IF(WINNER.NE.PLAYER) GO TO (48100,48200,48300),I
  458.     CALL JIGSUP(265)            !YOU PUSHED, YOU DIE.
  459.     RETURN
  460. C
  461. 48100    I=267
  462.     IF(CAROZF) I=266            !SPEED UP?
  463.     CAROZF=.TRUE.
  464.     CALL RSPEAK(I)
  465.     RETURN
  466. C
  467. 48200    I=266                    !ASSUME NO CHANGE.
  468.     IF(CAROZF) I=268
  469.     CAROZF=.FALSE.
  470.     CALL RSPEAK(I)
  471.     RETURN
  472. C
  473. 48300    CAROFF=.NOT.CAROFF            !FLIP CAROUSEL.
  474.     IF(.NOT.QHERE(IRBOX,CAROU)) RETURN    !IRON BOX IN CAROUSEL?
  475.     CALL RSPEAK(269)            !YES, THUMP.
  476.     OFLAG1(IRBOX)=OFLAG1(IRBOX).XOR.VISIBT    !COMPLEMENT VISIBILITY.
  477.     IF(CAROFF) RFLAG(CAROU)=RFLAG(CAROU).AND. .NOT.RSEEN
  478.     RETURN
  479. C
  480. C O119--    FLASK FUNCTION
  481. C
  482. 49000    IF(PRSA.EQ.OPENW) GO TO 49100        !OPEN?
  483.     IF((PRSA.NE.MUNGW).AND.(PRSA.NE.THROWW)) GO TO 10
  484.     CALL NEWSTA(FLASK,270,0,0,0)        !KILL FLASK.
  485. 49100    RFLAG(HERE)=RFLAG(HERE).OR.RMUNG    !MUNG ROOM.
  486.     RRAND(HERE)=271
  487.     CALL JIGSUP(272)            !POISONED.
  488.     RETURN
  489. C
  490. C O120--    BUCKET FUNCTION
  491. C
  492. 50000    IF(ARG.NE.2) GO TO 10            !READOUT?
  493.     IF((OCAN(WATER).NE.BUCKE).OR.BUCKTF) GO TO 50500
  494.     BUCKTF=.TRUE.                !BUCKET AT TOP.
  495.     CTICK(CEVBUC)=100            !START COUNTDOWN.
  496.     CALL NEWSTA(BUCKE,290,TWELL,0,0)    !REPOSITION BUCKET.
  497.     GO TO 50900                !FINISH UP.
  498. C
  499. 50500    IF((OCAN(WATER).EQ.BUCKE).OR..NOT.BUCKTF) GO TO 10
  500.     BUCKTF=.FALSE.
  501.     CALL NEWSTA(BUCKE,291,BWELL,0,0)    !BUCKET AT BOTTOM.
  502. 50900    IF(AV.NE.BUCKE) RETURN            !IN BUCKET?
  503.     F=MOVETO(OROOM(BUCKE),WINNER)    !MOVE ADVENTURER.
  504.     F=RMDESC(0)                !DESCRIBE ROOM.
  505.     RETURN
  506. C OAPPLI, PAGE 9
  507. C
  508. C O121--    EATME CAKE
  509. C
  510. 51000    IF((PRSA.NE.EATW).OR.(PRSO.NE.ECAKE).OR.
  511.     1    (HERE.NE.ALICE)) GO TO 10    !EAT CAKE IN ALICEROOM?
  512.     CALL NEWSTA(ECAKE,273,0,0,0)        !VANISH CAKE.
  513.     OFLAG1(ROBOT)=OFLAG1(ROBOT).AND. .NOT.VISIBT    !VANISH ROBOT.
  514.     DO 51100 I=1,OLNT            !MAKE OBJECTS BIG.
  515.       IF((OROOM(I).NE.ALICE).OR.(OSIZE(I).EQ.10000))
  516.     1    GO TO 51100
  517.       OSIZE(I)=OSIZE(I)*64
  518.       OROOM(I)=ALISM
  519. 51100    CONTINUE
  520.     OAPPLI=MOVETO(ALISM,WINNER)        !MOVE TO ALICE SMALL.
  521.     RETURN
  522. C
  523. C O122--    ICINGS
  524. C
  525. 52000    IF(PRSA.NE.READW) GO TO 52200        !READ?
  526.     I=274                    !CANT READ.
  527.     IF(PRSI.NE.0) I=275            !THROUGH SOMETHING?
  528.     IF(PRSI.EQ.BOTTL) I=276            !THROUGH BOTTLE?
  529.     IF(PRSI.EQ.FLASK) I=277+(PRSO-ORICE)    !THROUGH FLASK?
  530.     CALL RSPEAK(I)                !READ FLASK.
  531.     RETURN
  532. C
  533. 52200    IF((PRSA.NE.THROWW).OR.(PRSO.NE.RDICE).OR.(PRSI.NE.POOL))
  534.     1    GO TO 52300            !THROW RDICE AT POOL?
  535.     CALL NEWSTA(POOL,280,0,0,0)        !VANISH POOL.
  536.     OFLAG1(SAFFR)=OFLAG1(SAFFR).OR.VISIBT    !MATERIALIZE SPICES.
  537.     RETURN
  538. C
  539. 52300    IF((HERE.NE.ALICE).AND.(HERE.NE.ALISM).AND.(HERE.NE.ALITR))
  540.     1    GO TO 10            !IN WONDERLAND?
  541.     IF(((PRSA.NE.EATW).AND.(PRSA.NE.THROWW)).OR.
  542.     1    (PRSO.NE.ORICE)) GO TO 52400    !THROW ORANGE ICE?
  543.     CALL NEWSTA(ORICE,0,0,0,0)        !VANISH ORANGE ICE.
  544.     RFLAG(HERE)=RFLAG(HERE).OR.RMUNG    !VANISH ROOM.
  545.     RRAND(HERE)=281
  546.     CALL JIGSUP(282)            !VANISH ADVENTURER.
  547.     RETURN
  548. C
  549. 52400    IF((PRSA.NE.EATW).OR.(PRSO.NE.BLICE))
  550.     1    GO TO 10            !EAT BLUE ICE?
  551.     CALL NEWSTA(BLICE,283,0,0,0)        !VANISH BLUE ICE.
  552.     IF(HERE.NE.ALISM) GO TO 52500        !IN REDUCED ROOM?
  553.     OFLAG1(ROBOT)=OFLAG1(ROBOT).OR.VISIBT    !MATERIALIZE ROBOT.
  554.     DO 52450 I=1,OLNT            !ENLARGE WORLD.
  555.       IF((OROOM(I).NE.HERE).OR.(OSIZE(I).EQ.10000))
  556.     1    GO TO 52450
  557.       OROOM(I)=ALICE
  558.       OSIZE(I)=OSIZE(I)/64
  559. 52450    CONTINUE
  560.     OAPPLI=MOVETO(ALICE,WINNER)        !RETURN
  561.     RETURN
  562. C
  563. 52500    CALL JIGSUP(284)            !ENLARGED IN WRONG ROOM.
  564.     RETURN
  565. C
  566. C O123--    BRICK
  567. C
  568. 54000    IF(PRSA.NE.BURNW) GO TO 10        !BURN?
  569.     CALL JIGSUP(150)            !BOOM!
  570.     RETURN
  571. C
  572. C O124--    MYSELF
  573. C
  574. 55000    IF(PRSA.NE.GIVEW) GO TO 55100        !GIVE?
  575.     CALL NEWSTA(PRSO,2,0,0,PLAYER)        !DONE.
  576.     RETURN
  577. C
  578. 55100    IF(PRSA.NE.TAKEW) GO TO 55200        !TAKE?
  579.     CALL RSPEAK(286)            !JOKE.
  580.     RETURN
  581. C
  582. 55200    IF((PRSA.NE.KILLW).AND.(PRSA.NE.MUNGW)) GO TO 10
  583.     CALL JIGSUP(287)            !KILL, NO JOKE.
  584.     RETURN
  585. C OAPPLI, PAGE 10
  586. C
  587. C O125--    PANELS INSIDE MIRROR
  588. C
  589. 56000    IF(PRSA.NE.PUSHW) GO TO 10        !PUSH?
  590.     IF(POLEUF.NE.0) GO TO 56100        !SHORT POLE UP?
  591.     I=731                    !NO, WONT BUDGE.
  592.     IF(MOD(MDIR,180).EQ.0) I=732        !DIFF MSG IF N-S.
  593.     CALL RSPEAK(I)                !TELL WONT MOVE.
  594.     RETURN
  595. C
  596. 56100    IF(MLOC.NE.MRG) GO TO 56200        !IN GDN ROOM?
  597.     CALL RSPEAK(733)            !YOU LOSE.
  598.     CALL JIGSUP(685)
  599.     RETURN
  600. C
  601. 56200    I=831                    !ROTATE L OR R.
  602.     IF((PRSO.EQ.RDWAL).OR.(PRSO.EQ.YLWAL)) I=830
  603.     CALL RSPEAK(I)                !TELL DIRECTION.
  604.     MDIR=MOD(MDIR+45+(270*(I-830)),360)    !CALCULATE NEW DIR.
  605.     CALL RSPSUB(734,695+(MDIR/45))        !TELL NEW DIR.
  606.     IF(WDOPNF) CALL RSPEAK(730)        !IF PANEL OPEN, CLOSE.
  607.     WDOPNF=.FALSE.
  608.     RETURN                    !DONE.
  609. C
  610. C O126--    ENDS INSIDE MIRROR
  611. C
  612. 57000    IF(PRSA.NE.PUSHW) GO TO 10        !PUSH?
  613.     IF(MOD(MDIR,180).EQ.0) GO TO 57100    !MIRROR N-S?
  614.     CALL RSPEAK(735)            !NO, WONT BUDGE.
  615.     RETURN
  616. C
  617. 57100    IF(PRSO.NE.PINDR) GO TO 57300        !PUSH PINE WALL?
  618.     IF(((MLOC.EQ.MRC).AND.(MDIR.EQ.180)).OR.
  619.     1  ((MLOC.EQ.MRD).AND.(MDIR.EQ.0)).OR.
  620.     2   (MLOC.EQ.MRG)) GO TO 57200        !IN VIEW OF GDN?
  621.     CALL RSPEAK(736)            !NO, OPENS.
  622.     WDOPNF=.TRUE.                !INDICATE OPEN.
  623.     CFLAG(CEVPIN)=.TRUE.            !TIME OPENING.
  624.     CTICK(CEVPIN)=5
  625.     RETURN
  626. C
  627. 57200    CALL RSPEAK(737)            !GDN SEES YOU, DIE.
  628.     CALL JIGSUP(685)
  629.     RETURN
  630. C
  631. 57300    NLOC=MLOC-1                !NEW LOC IF SOUTH.
  632.     IF(MDIR.EQ.0) NLOC=MLOC+1        !NEW LOC IF NORTH.
  633.     IF((NLOC.GE.MRA).AND.(NLOC.LE.MRD)) GO TO 57400
  634.     CALL RSPEAK(738)            !HAVE REACHED END.
  635.     RETURN
  636. C
  637. 57400    I=699                    !ASSUME SOUTH.
  638.     IF(MDIR.EQ.0) I=695            !NORTH.
  639.     J=739                    !ASSUME SMOOTH.
  640.     IF(POLEUF.NE.0) J=740            !POLE UP, WOBBLES.
  641.     CALL RSPSUB(J,I)            !DESCRIBE.
  642.     MLOC=NLOC
  643.     IF(MLOC.NE.MRG) RETURN            !NOW IN GDN ROOM?
  644. C
  645.     IF(POLEUF.NE.0) GO TO 57500        !POLE UP, GDN SEES.
  646.     IF(MROPNF.OR.WDOPNF) GO TO 57600    !DOOR OPEN, GDN SEES.
  647.     IF(MR1F.AND.MR2F) RETURN        !MIRRORS INTACT, OK.
  648.     CALL RSPEAK(742)            !MIRRORS BROKEN, DIE.
  649.     CALL JIGSUP(743)
  650.     RETURN
  651. C
  652. 57500    CALL RSPEAK(741)            !POLE UP, DIE.
  653.     CALL JIGSUP(743)
  654.     RETURN
  655. C
  656. 57600    CALL RSPEAK(744)            !DOOR OPEN, DIE.
  657.     CALL JIGSUP(743)
  658.     RETURN
  659. C OAPPLI, PAGE 11
  660. C
  661. C O127--    GLOBAL GUARDIANS
  662. C
  663. 58000    IF((PRSA.NE.ATTACW).AND.(PRSA.NE.KILLW).AND.
  664.     1  (PRSA.NE.MUNGW)) GO TO 58100        !AGGRESSIVE?
  665.     CALL JIGSUP(745)            !LOSE.
  666.     RETURN
  667. C
  668. 58100    IF(PRSA.NE.HELLOW) GO TO 10        !HELLO?
  669.     CALL RSPEAK(746)            !NO REPLY.
  670.     RETURN
  671. C
  672. C O128--    GLOBAL MASTER
  673. C
  674. 59000    IF((PRSA.NE.ATTACW).AND.(PRSA.NE.KILLW).AND.
  675.     1  (PRSA.NE.MUNGW)) GO TO 59100        !AGGRESSIVE?
  676.     CALL JIGSUP(747)            !BAD IDEA.
  677.     RETURN
  678. C
  679. 59100    IF(PRSA.NE.TAKEW) GO TO 10        !TAKE?
  680.     CALL RSPEAK(748)            !JOKE.
  681.     RETURN
  682. C
  683. C O129--    NUMERAL FIVE (FOR JOKE)
  684. C
  685. 60000    IF(PRSA.NE.TAKEW) GO TO 10        !TAKE FIVE?
  686.     CALL RSPEAK(419)            !TIME PASSES.
  687.     DO 60100 I=1,3                !WAIT A WHILE.
  688.       IF(CLOCKD(X)) RETURN
  689. 60100    CONTINUE
  690.     RETURN
  691. C
  692. C O130--    CRYPT FUNCTION
  693. C
  694. 61000    IF(.NOT.ENDGMF) GO TO 45000        !IF NOT EG, DIE.
  695.     IF(PRSA.NE.OPENW) GO TO 61100        !OPEN?
  696.     I=793
  697.     IF(QOPEN(TOMB)) I=794
  698.     CALL RSPEAK(I)
  699.     OFLAG2(TOMB)=OFLAG2(TOMB).OR.OPENBT    !NOW TOMB WITH VIEW.
  700.     RETURN
  701. C
  702. 61100    IF(PRSA.NE.CLOSEW) GO TO 45000        !CLOSE?
  703.     I=795
  704.     IF(QOPEN(TOMB)) I=796
  705.     CALL RSPEAK(I)
  706.     OFLAG2(TOMB)=OFLAG2(TOMB).AND..NOT.OPENBT
  707.     IF(HERE.EQ.CRYPT) CTICK(CEVSTE)=3    !IF IN CRYPT, START EG.
  708.     RETURN
  709. C OAPPLI, PAGE 12
  710. C
  711. C O131--    GLOBAL LADDER
  712. C
  713. 62000    IF((CPVEC(CPHERE+1).EQ.-2).OR.(CPVEC(CPHERE-1).EQ.-3))
  714.     1    GO TO 62100            !LADDER HERE?
  715.     CALL RSPEAK(865)            !NO, LOSE.
  716.     RETURN
  717. C
  718. 62100    IF((PRSA.EQ.CLMBW).OR.(PRSA.EQ.CLMBUW)) GO TO 62200
  719.     CALL RSPEAK(866)            !CLIMB IT?
  720.     RETURN
  721. C
  722. 62200    IF((CPHERE.EQ.10).AND.(CPVEC(CPHERE+1).EQ.-2))
  723.     1    GO TO 62300            !AT EXIT?
  724.     CALL RSPEAK(867)            !NO, HIT YOUR HEAD.
  725.     RETURN
  726. C
  727. 62300    F=MOVETO(CPANT,WINNER)        !TO ANTEROOM.
  728.     F=RMDESC(3)                !DESCRIBE.
  729.     RETURN
  730. C
  731.     END
  732.