C OAPPLI- OBJECT SPECIAL ACTION ROUTINES C C COPYRIGHT 1980, INFOCOM COMPUTERS AND COMMUNICATIONS, CAMBRIDGE MA. 02142 C ALL RIGHTS RESERVED, COMMERCIAL USAGE STRICTLY PROHIBITED C WRITTEN BY R. M. SUPNIK C C DECLARATIONS C LOGICAL FUNCTION OAPPLI(RI,ARG) IMPLICIT INTEGER (A-Z) LOGICAL SOBJS,NOBJS LOGICAL QOPEN,QON,LIT LOGICAL MOVETO,RMDESC,CLOCKD LOGICAL THIEFP,CYCLOP,TROLLP,BALLOP,LIGHTP LOGICAL QEMPTY,QHERE,F,OPNCLS C C PARSER OUTPUT C LOGICAL PRSWON COMMON /PRSVEC/ PRSA,PRSI,PRSO,PRSWON,PRSCON C C GAME STATE C LOGICAL TELFLG COMMON /PLAY/ WINNER,HERE,TELFLG COMMON /STATE/ MOVES,DEATHS,RWSCOR,MXSCOR,MXLOAD, 1 LTSHFT,BLOC,MUNGRM,HS,EGSCOR,EGMXSC C COMMON /BATS/ BATDRP(9) C C PUZZLE ROOM C COMMON /PUZZLE/ CPDR(16),CPWL(8),CPVEC(64) C C ROOMS C COMMON /ROOMS/ RLNT,RDESC2,RDESC1(200),REXIT(200), 1 RACTIO(200),RVAL(200),RFLAG(200) INTEGER RRAND(200) EQUIVALENCE (RVAL,RRAND) C COMMON /RFLAG/ RSEEN,RLIGHT,RLAND,RWATER,RAIR, 1 RSACRD,RFILL,RMUNG,RBUCK,RHOUSE,RNWALL,REND C COMMON /RINDEX/ WHOUS,LROOM,CELLA COMMON /RINDEX/ MTROL,MAZE1 COMMON /RINDEX/ MGRAT,MAZ15 COMMON /RINDEX/ FORE1,FORE3,CLEAR,RESER COMMON /RINDEX/ STREA,EGYPT,ECHOR COMMON /RINDEX/ TSHAF COMMON /RINDEX/ BSHAF,MMACH,DOME,MTORC COMMON /RINDEX/ CAROU COMMON /RINDEX/ RIDDL,LLD2,TEMP1,TEMP2,MAINT COMMON /RINDEX/ BLROO,TREAS,RIVR1,RIVR2,RIVR3,MCYCL COMMON /RINDEX/ RIVR4,RIVR5,FCHMP,FALLS,MBARR COMMON /RINDEX/ MRAIN,POG,VLBOT,VAIR1,VAIR2,VAIR3,VAIR4 COMMON /RINDEX/ LEDG2,LEDG3,LEDG4,MSAFE,CAGER COMMON /RINDEX/ CAGED,TWELL,BWELL,ALICE,ALISM,ALITR COMMON /RINDEX/ MTREE,BKENT,BKVW,BKTWI,BKVAU,BKBOX COMMON /RINDEX/ CRYPT,TSTRS,MRANT,MREYE COMMON /RINDEX/ MRA,MRB,MRC,MRG,MRD,FDOOR COMMON /RINDEX/ MRAE,MRCE,MRCW,MRGE,MRGW,MRDW,INMIR COMMON /RINDEX/ SCORR,NCORR,PARAP,CELL,PCELL,NCELL COMMON /RINDEX/ CPANT,CPOUT,CPUZZ C C OBJECTS C COMMON /OBJCTS/ OLNT,ODESC1(220),ODESC2(220),ODESCO(220), 1 OACTIO(220),OFLAG1(220),OFLAG2(220),OFVAL(220), 2 OTVAL(220),OSIZE(220),OCAPAC(220),OROOM(220), 3 OADV(220),OCAN(220),OREAD(220) C COMMON /OFLAGS/ VISIBT,READBT,TAKEBT,DOORBT,TRANBT,FOODBT, 1 NDSCBT,DRNKBT,CONTBT,LITEBT,VICTBT,BURNBT,FLAMBT, 2 TOOLBT,TURNBT,ONBT COMMON /OFLAGS/ FINDBT,SLEPBT,SCRDBT,TIEBT,CLMBBT,ACTRBT, 1 WEAPBT,FITEBT,VILLBT,STAGBT,TRYBT,NOCHBT,OPENBT, 2 TCHBT,VEHBT,SCHBT C COMMON /OINDEX/ GARLI,FOOD,GUNK,COAL,MACHI,DIAMO,TCASE,BOTTL COMMON /OINDEX/ WATER,ROPE,KNIFE,SWORD,LAMP,BLAMP,RUG COMMON /OINDEX/ LEAVE,TROLL,AXE COMMON /OINDEX/ RKNIF,KEYS,ICE,BAR COMMON /OINDEX/ COFFI,TORCH,TBASK,FBASK,IRBOX COMMON /OINDEX/ GHOST,TRUNK,BELL,BOOK,CANDL COMMON /OINDEX/ MATCH,TUBE,PUTTY,WRENC,SCREW,CYCLO,CHALI COMMON /OINDEX/ THIEF,STILL,WINDO,GRATE,DOOR COMMON /OINDEX/ HPOLE,LEAK,RBUTT,RAILI COMMON /OINDEX/ POT,STATU,IBOAT,DBOAT,PUMP,RBOAT COMMON /OINDEX/ STICK,BUOY,SHOVE,BALLO,RECEP,GUANO COMMON /OINDEX/ BROPE,HOOK1,HOOK2,SAFE,SSLOT,BRICK,FUSE COMMON /OINDEX/ GNOME,BLABE,DBALL,TOMB COMMON /OINDEX/ LCASE,CAGE,RCAGE,SPHER,SQBUT COMMON /OINDEX/ FLASK,POOL,SAFFR,BUCKE,ECAKE,ORICE,RDICE,BLICE COMMON /OINDEX/ ROBOT,FTREE,BILLS,PORTR,SCOL,ZGNOM COMMON /OINDEX/ EGG,BEGG,BAUBL,CANAR,BCANA COMMON /OINDEX/ YLWAL,RDWAL,PINDR,RBEAM COMMON /OINDEX/ ODOOR,QDOOR,CDOOR,NUM1,NUM8 COMMON /OINDEX/ WARNI,CSLIT,GCARD,STLDR COMMON /OINDEX/ HANDS,WALL,LUNGS,SAILO,AVIAT,TEETH COMMON /OINDEX/ ITOBJ,EVERY,VALUA,OPLAY,WNORT,GWATE,MASTER C C CLOCK INTERRUPTS C LOGICAL*1 CFLAG COMMON /CEVENT/ CLNT,CTICK(25),CACTIO(25),CFLAG(25) C COMMON /CINDEX/ CEVCUR,CEVMNT,CEVLNT,CEVMAT,CEVCND, 1 CEVBAL,CEVBRN,CEVFUS,CEVLED,CEVSAF,CEVVLG, 2 CEVGNO,CEVBUC,CEVSPH,CEVEGH, 3 CEVFOR,CEVSCL,CEVZGI,CEVZGO,CEVSTE, 5 CEVMRS,CEVPIN,CEVINQ,CEVFOL C C ADVENTURERS C COMMON /ADVS/ ALNT,AROOM(4),ASCORE(4),AVEHIC(4), 1 AOBJ(4),AACTIO(4),ASTREN(4),AFLAG(4) C COMMON /AINDEX/ PLAYER,AROBOT,AMASTR C C VERBS C COMMON /VINDEX/ CINTW,DEADXW,FRSTQW,INXW,OUTXW COMMON /VINDEX/ WALKIW,FIGHTW,FOOW COMMON /VINDEX/ MELTW,READW,INFLAW,DEFLAW,ALARMW,EXORCW COMMON /VINDEX/ PLUGW,KICKW,WAVEW,RAISEW,LOWERW,RUBW COMMON /VINDEX/ PUSHW,UNTIEW,TIEW,TIEUPW,TURNW,BREATW COMMON /VINDEX/ KNOCKW,LOOKW,EXAMIW,SHAKEW,MOVEW,TRNONW,TRNOFW COMMON /VINDEX/ OPENW,CLOSEW,FINDW,WAITW,SPINW,BOARDW,UNBOAW,TAKEW COMMON /VINDEX/ INVENW,FILLW,EATW,DRINKW,BURNW COMMON /VINDEX/ MUNGW,KILLW,ATTACW,SWINGW COMMON /VINDEX/ WALKW,TELLW,PUTW,DROPW,GIVEW,POURW,THROWW COMMON /VINDEX/ DIGW,LEAPW,STAYW,FOLLOW COMMON /VINDEX/ HELLOW,LOOKIW,LOOKUW,PUMPW,WINDW COMMON /VINDEX/ CLMBW,CLMBUW,CLMBDW,TRNTOW C C FLAGS C LOGICAL*1 TROLLF,CAGESF,BUCKTF,CAROFF,CAROZF,LWTIDF LOGICAL*1 DOMEF,GLACRF,ECHOF,RIDDLF,LLDF,CYCLOF LOGICAL*1 MAGICF,LITLDF,SAFEF,GNOMEF,GNODRF,MIRRMF LOGICAL*1 EGYPTF,ONPOLF,BLABF,BRIEFF,SUPERF,BUOYF LOGICAL*1 GRUNLF,GATEF,RAINBF,CAGETF,EMPTHF,DEFLAF LOGICAL*1 GLACMF,FROBZF,ENDGMF,BADLKF,THFENF,SINGSF LOGICAL*1 MRPSHF,MROPNF,WDOPNF,MR1F,MR2F,INQSTF LOGICAL*1 FOLLWF,SPELLF,CPOUTF,CPUSHF COMMON /FINDEX/ TROLLF,CAGESF,BUCKTF,CAROFF,CAROZF,LWTIDF, 1 DOMEF,GLACRF,ECHOF,RIDDLF,LLDF,CYCLOF, 2 MAGICF,LITLDF,SAFEF,GNOMEF,GNODRF,MIRRMF, 3 EGYPTF,ONPOLF,BLABF,BRIEFF,SUPERF,BUOYF, 4 GRUNLF,GATEF,RAINBF,CAGETF,EMPTHF,DEFLAF, 5 GLACMF,FROBZF,ENDGMF,BADLKF,THFENF,SINGSF, 6 MRPSHF,MROPNF,WDOPNF,MR1F,MR2F,INQSTF, 7 FOLLWF,SPELLF,CPOUTF,CPUSHF COMMON /FINDEX/ BTIEF,BINFF COMMON /FINDEX/ RVMNT,RVCLR,RVCYC,RVSND,RVGUA COMMON /FINDEX/ ORRUG,ORCAND,ORMTCH,ORLAMP COMMON /FINDEX/ MDIR,MLOC,POLEUF COMMON /FINDEX/ QUESNO,NQATT,CORRCT COMMON /FINDEX/ LCELL,PNUMB,ACELL,DCELL,CPHERE C C FUNCTIONS AND DATA C QOPEN(R)=(OFLAG2(R).AND.OPENBT).NE.0 QON(R)=(OFLAG1(R).AND.ONBT).NE.0 DATA MXSMP/99/ C OAPPLI, PAGE 2 C IF(RI.EQ.0) GO TO 10 !ZERO IS FALSE APP. IF(RI.LE.MXSMP) GO TO 100 !SIMPLE OBJECT? IF(PRSO.NE.0) ODO2=ODESC2(PRSO) IF(PRSI.NE.0) ODI2=ODESC2(PRSI) AV=AVEHIC(WINNER) FLOBTS=FLAMBT+LITEBT+ONBT OAPPLI=.TRUE. C GO TO (2000,5000,10000,11000,12000,15000,18000, 1 19000,20000,22000,25000,26000,32000,35000,39000,40000, 2 45000,47000,48000,49000,50000,51000,52000,54000,55000, 3 56000,57000,58000,59000,60000,61000,62000), 3 (RI-MXSMP) CALL BUG(6,RI) C C RETURN HERE TO DECLARE FALSE RESULT C 10 OAPPLI=.FALSE. RETURN C C SIMPLE OBJECTS, PROCESSED EXTERNALLY. C 100 IF(RI.LT.32) OAPPLI=SOBJS(RI,ARG) IF(RI.GE.32) OAPPLI=NOBJS(RI,ARG) RETURN C OAPPLI, PAGE 3 C C O100-- MACHINE FUNCTION C 2000 IF(HERE.NE.MMACH) GO TO 10 !NOT HERE? F OAPPLI=OPNCLS(MACHI,123,124) !HANDLE OPN/CLS. RETURN C C O101-- WATER FUNCTION C 5000 IF(PRSA.NE.FILLW) GO TO 5050 !FILL X WITH Y IS PRSA=PUTW !MADE INTO I=PRSI PRSI=PRSO PRSO=I !PUT Y IN X. I=ODI2 ODI2=ODO2 ODO2=I 5050 IF((PRSO.EQ.WATER).OR.(PRSO.EQ.GWATE)) GO TO 5100 CALL RSPEAK(561) !WATER IS IND OBJ, RETURN !PUNT. C 5100 IF(PRSA.NE.TAKEW) GO TO 5400 !TAKE WATER? IF((OADV(BOTTL).EQ.WINNER).AND.(OCAN(PRSO).NE.BOTTL)) 1 GO TO 5500 !TAKE, NOT IN BOTTLE. IF(OCAN(PRSO).EQ.0) GO TO 5200 !INSIDE ANYTHING? IF(QOPEN(OCAN(PRSO))) GO TO 5200 !YES, OPEN? CALL RSPEAK(525,ODESC2(OCAN(PRSO))) !INSIDE, CLOSED, PUNT. RETURN C 5200 CALL RSPEAK(615) !NOT INSIDE OR OPEN, RETURN !SLIPS THRU FINGERS. C 5400 IF(PRSA.NE.PUTW) GO TO 5700 !PUT WATER IN X? IF((AV.NE.0).AND.(PRSI.EQ.AV)) GO TO 5800 !IN VEH? IF(PRSI.EQ.BOTTL) GO TO 5500 !IN BOTTLE? CALL RSPSUB(297,ODI2) !WONT GO ELSEWHERE. CALL NEWSTA(PRSO,0,0,0,0) !VANISH WATER. RETURN C 5500 IF(QOPEN(BOTTL)) GO TO 5550 !BOTTLE OPEN? CALL RSPEAK(612) !NO, LOSE. RETURN C 5550 IF(QEMPTY(BOTTL)) GO TO 5600 !OPEN, EMPTY? CALL RSPEAK(613) !NO, ALREADY FULL. RETURN C 5600 CALL NEWSTA(WATER,614,0,BOTTL,0) !TAKE WATER TO BOTTLE. RETURN C 5700 IF((PRSA.NE.DROPW).AND.(PRSA.NE.POURW).AND. 1 (PRSA.NE.GIVEW)) GO TO 5900 !DROP, POUR, GIVE? IF(AV.NE.0) GO TO 5800 !INTO VEHICLE? CALL NEWSTA(PRSO,133,0,0,0) !NO, VANISHES. RETURN C 5800 CALL NEWSTA(WATER,0,0,AV,0) !WATER INTO VEHICLE. CALL RSPSUB(296,ODESC2(AV)) !DESCRIBE. RETURN C 5900 IF(PRSA.NE.THROWW) GO TO 10 !LAST CHANCE, THROW? CALL NEWSTA(PRSO,132,0,0,0) !VANISHES. RETURN C OAPPLI, PAGE 4 C C O102-- LEAF PILE C 10000 IF(PRSA.NE.BURNW) GO TO 10500 !BURN? IF(OROOM(PRSO).EQ.0) GO TO 10100 !WAS HE CARRYING? CALL NEWSTA(PRSO,158,0,0,0) !NO, BURN IT. RETURN C 10100 CALL NEWSTA(PRSO,0,HERE,0,0) !DROP LEAVES. CALL JIGSUP(159) !BURN HIM. RETURN C 10500 IF(PRSA.NE.MOVEW) GO TO 10600 !MOVE? CALL RSPEAK(2) !DONE. RETURN C 10600 IF((PRSA.NE.LOOKUW).OR.(RVCLR.NE.0)) GO TO 10 CALL RSPEAK(344) !LOOK UNDER? RETURN C C O103-- TROLL, DONE EXTERNALLY. C 11000 OAPPLI=TROLLP(ARG) !TROLL PROCESSOR. RETURN C C O104-- RUSTY KNIFE. C 12000 IF(PRSA.NE.TAKEW) GO TO 12100 !TAKE? IF(OADV(SWORD).EQ.WINNER) CALL RSPEAK(160) !PULSE SWORD. GO TO 10 C 12100 IF((((PRSA.NE.ATTACW).AND.(PRSA.NE.KILLW)).OR. 1 (PRSI.NE.RKNIF)).AND. 2 (((PRSA.NE.SWINGW).AND.(PRSA.NE.THROWW)).OR. 3 (PRSO.NE.RKNIF))) GO TO 10 CALL NEWSTA(RKNIF,0,0,0,0) !KILL KNIFE. CALL JIGSUP(161) !KILL HIM. RETURN C OAPPLI, PAGE 5 C C O105-- GLACIER C 15000 IF(PRSA.NE.THROWW) GO TO 15500 !THROW? IF(PRSO.NE.TORCH) GO TO 15400 !TORCH? CALL NEWSTA(ICE,169,0,0,0) !MELT ICE. ODESC1(TORCH)=174 !MUNG TORCH. ODESC2(TORCH)=173 OFLAG1(TORCH)=OFLAG1(TORCH).AND. .NOT.FLOBTS CALL NEWSTA(TORCH,0,STREA,0,0) !MOVE TORCH. GLACRF=.TRUE. !GLACIER GONE. IF(.NOT.LIT(HERE)) CALL RSPEAK(170) !IN DARK? RETURN C 15400 CALL RSPEAK(171) !JOKE IF NOT TORCH. RETURN C 15500 IF((PRSA.NE.MELTW).OR.(PRSO.NE.ICE)) GO TO 10 IF((OFLAG1(PRSI).AND.FLOBTS).EQ.FLOBTS) GO TO 15600 CALL RSPSUB(298,ODI2) !CANT MELT WITH THAT. RETURN C 15600 GLACMF=.TRUE. !PARTIAL MELT. IF(PRSI.NE.TORCH) GO TO 15700 !MELT WITH TORCH? ODESC1(TORCH)=174 !MUNG TORCH. ODESC2(TORCH)=173 OFLAG1(TORCH)=OFLAG1(TORCH).AND. .NOT.FLOBTS 15700 CALL JIGSUP(172) !DROWN. RETURN C C O106-- BLACK BOOK C 18000 IF(PRSA.NE.OPENW) GO TO 18100 !OPEN? CALL RSPEAK(180) !JOKE. RETURN C 18100 IF(PRSA.NE.CLOSEW) GO TO 18200 !CLOSE? CALL RSPEAK(181) RETURN C 18200 IF(PRSA.NE.BURNW) GO TO 10 !BURN? CALL NEWSTA(PRSO,0,0,0,0) !FATAL JOKE. CALL JIGSUP(182) RETURN C OAPPLI, PAGE 6 C C O107-- CANDLES, PROCESSED EXTERNALLY C 19000 OAPPLI=LIGHTP(CANDL) RETURN C C O108-- MATCHES, PROCESSED EXTERNALLY C 20000 OAPPLI=LIGHTP(MATCH) RETURN C C O109-- CYCLOPS, PROCESSED EXTERNALLY. C 22000 OAPPLI=CYCLOP(ARG) !CYCLOPS RETURN C C O110-- THIEF, PROCESSED EXTERNALLY C 25000 OAPPLI=THIEFP(ARG) RETURN C C O111-- WINDOW C 26000 OAPPLI=OPNCLS(WINDO,208,209) !OPEN/CLS WINDOW. RETURN C C O112-- PILE OF BODIES C 32000 IF(PRSA.NE.TAKEW) GO TO 32500 !TAKE? CALL RSPEAK(228) !CANT. RETURN C 32500 IF((PRSA.NE.BURNW).AND.(PRSA.NE.MUNGW)) GO TO 10 IF(ONPOLF) RETURN !BURN OR MUNG? ONPOLF=.TRUE. !SET HEAD ON POLE. CALL NEWSTA(HPOLE,0,LLD2,0,0) CALL JIGSUP(229) !BEHEADED. RETURN C C O113-- VAMPIRE BAT C 35000 CALL RSPEAK(50) !TIME TO FLY, JACK. F=MOVETO(BATDRP(RND(9)+1),WINNER) !SELECT RANDOM DEST. F=RMDESC(0) RETURN C OAPPLI, PAGE 7 C C O114-- STICK C 39000 IF(PRSA.NE.WAVEW) GO TO 10 !WAVE? IF(HERE.EQ.MRAIN) GO TO 39500 !ON RAINBOW? IF((HERE.EQ.POG).OR.(HERE.EQ.FALLS)) GO TO 39200 CALL RSPEAK(244) !NOTHING HAPPENS. RETURN C 39200 OFLAG1(POT)=OFLAG1(POT).OR.VISIBT !MAKE GOLD VISIBLE. RAINBF=.NOT. RAINBF !COMPLEMENT RAINBOW. I=245 !ASSUME OFF. IF(RAINBF) I=246 !IF ON, SOLID. CALL RSPEAK(I) !DESCRIBE. RETURN C 39500 RAINBF=.FALSE. !ON RAINBOW, CALL JIGSUP(247) !TAKE A FALL. RETURN C C O115-- BALLOON, HANDLED EXTERNALLY C 40000 OAPPLI=BALLOP(ARG) RETURN C C O116-- HEADS C 45000 IF(PRSA.NE.HELLOW) GO TO 45100 !HELLO HEADS? CALL RSPEAK(633) !TRULY BIZARRE. RETURN C 45100 IF(PRSA.EQ.READW) GO TO 10 !READ IS OK. CALL NEWSTA(LCASE,260,LROOM,0,0) !MAKE LARGE CASE. I=ROBADV(WINNER,0,LCASE,0)+ROBRM(HERE,100,0,LCASE,0) CALL JIGSUP(261) !KILL HIM. RETURN C OAPPLI, PAGE 8 C C O117-- SPHERE C 47000 IF(CAGESF.OR.(PRSA.NE.TAKEW)) GO TO 10 !TAKE? IF(WINNER.NE.PLAYER) GO TO 47500 !ROBOT TAKE? CALL RSPEAK(263) !NO, DROP CAGE. IF(OROOM(ROBOT).NE.HERE) GO TO 47200 !ROBOT HERE? F=MOVETO(CAGED,WINNER) !YES, MOVE INTO CAGE. CALL NEWSTA(ROBOT,0,CAGED,0,0) !MOVE ROBOT. AROOM(AROBOT)=CAGED OFLAG1(ROBOT)=OFLAG1(ROBOT).OR.NDSCBT !DONT DESCRIBE ROBOT. CTICK(CEVSPH)=10 !GET OUT IN 10 OR ELSE. RETURN C 47200 CALL NEWSTA(SPHER,0,0,0,0) !YOURE DEAD. RFLAG(CAGER)=RFLAG(CAGER).OR.RMUNG !MUNG CAGE ROOM. RRAND(CAGER)=147 CALL JIGSUP(148) !MUNG PLAYER. RETURN C 47500 CALL NEWSTA(SPHER,0,0,0,0) !ROBOT TRIED, CALL NEWSTA(ROBOT,264,0,0,0) !KILL HIM. CALL NEWSTA(CAGE,0,HERE,0,0) !INSERT MANGLED CAGE. RETURN C C O118-- GEOMETRICAL BUTTONS C 48000 IF(PRSA.NE.PUSHW) GO TO 10 !PUSH? I=PRSO-SQBUT+1 !GET BUTTON INDEX. IF((I.LE.0).OR.(I.GE.4)) GO TO 10 !A BUTTON? IF(WINNER.NE.PLAYER) GO TO (48100,48200,48300),I CALL JIGSUP(265) !YOU PUSHED, YOU DIE. RETURN C 48100 I=267 IF(CAROZF) I=266 !SPEED UP? CAROZF=.TRUE. CALL RSPEAK(I) RETURN C 48200 I=266 !ASSUME NO CHANGE. IF(CAROZF) I=268 CAROZF=.FALSE. CALL RSPEAK(I) RETURN C 48300 CAROFF=.NOT.CAROFF !FLIP CAROUSEL. IF(.NOT.QHERE(IRBOX,CAROU)) RETURN !IRON BOX IN CAROUSEL? CALL RSPEAK(269) !YES, THUMP. OFLAG1(IRBOX)=OFLAG1(IRBOX).XOR.VISIBT !COMPLEMENT VISIBILITY. IF(CAROFF) RFLAG(CAROU)=RFLAG(CAROU).AND. .NOT.RSEEN RETURN C C O119-- FLASK FUNCTION C 49000 IF(PRSA.EQ.OPENW) GO TO 49100 !OPEN? IF((PRSA.NE.MUNGW).AND.(PRSA.NE.THROWW)) GO TO 10 CALL NEWSTA(FLASK,270,0,0,0) !KILL FLASK. 49100 RFLAG(HERE)=RFLAG(HERE).OR.RMUNG !MUNG ROOM. RRAND(HERE)=271 CALL JIGSUP(272) !POISONED. RETURN C C O120-- BUCKET FUNCTION C 50000 IF(ARG.NE.2) GO TO 10 !READOUT? IF((OCAN(WATER).NE.BUCKE).OR.BUCKTF) GO TO 50500 BUCKTF=.TRUE. !BUCKET AT TOP. CTICK(CEVBUC)=100 !START COUNTDOWN. CALL NEWSTA(BUCKE,290,TWELL,0,0) !REPOSITION BUCKET. GO TO 50900 !FINISH UP. C 50500 IF((OCAN(WATER).EQ.BUCKE).OR..NOT.BUCKTF) GO TO 10 BUCKTF=.FALSE. CALL NEWSTA(BUCKE,291,BWELL,0,0) !BUCKET AT BOTTOM. 50900 IF(AV.NE.BUCKE) RETURN !IN BUCKET? F=MOVETO(OROOM(BUCKE),WINNER) !MOVE ADVENTURER. F=RMDESC(0) !DESCRIBE ROOM. RETURN C OAPPLI, PAGE 9 C C O121-- EATME CAKE C 51000 IF((PRSA.NE.EATW).OR.(PRSO.NE.ECAKE).OR. 1 (HERE.NE.ALICE)) GO TO 10 !EAT CAKE IN ALICEROOM? CALL NEWSTA(ECAKE,273,0,0,0) !VANISH CAKE. OFLAG1(ROBOT)=OFLAG1(ROBOT).AND. .NOT.VISIBT !VANISH ROBOT. DO 51100 I=1,OLNT !MAKE OBJECTS BIG. IF((OROOM(I).NE.ALICE).OR.(OSIZE(I).EQ.10000)) 1 GO TO 51100 OSIZE(I)=OSIZE(I)*64 OROOM(I)=ALISM 51100 CONTINUE OAPPLI=MOVETO(ALISM,WINNER) !MOVE TO ALICE SMALL. RETURN C C O122-- ICINGS C 52000 IF(PRSA.NE.READW) GO TO 52200 !READ? I=274 !CANT READ. IF(PRSI.NE.0) I=275 !THROUGH SOMETHING? IF(PRSI.EQ.BOTTL) I=276 !THROUGH BOTTLE? IF(PRSI.EQ.FLASK) I=277+(PRSO-ORICE) !THROUGH FLASK? CALL RSPEAK(I) !READ FLASK. RETURN C 52200 IF((PRSA.NE.THROWW).OR.(PRSO.NE.RDICE).OR.(PRSI.NE.POOL)) 1 GO TO 52300 !THROW RDICE AT POOL? CALL NEWSTA(POOL,280,0,0,0) !VANISH POOL. OFLAG1(SAFFR)=OFLAG1(SAFFR).OR.VISIBT !MATERIALIZE SPICES. RETURN C 52300 IF((HERE.NE.ALICE).AND.(HERE.NE.ALISM).AND.(HERE.NE.ALITR)) 1 GO TO 10 !IN WONDERLAND? IF(((PRSA.NE.EATW).AND.(PRSA.NE.THROWW)).OR. 1 (PRSO.NE.ORICE)) GO TO 52400 !THROW ORANGE ICE? CALL NEWSTA(ORICE,0,0,0,0) !VANISH ORANGE ICE. RFLAG(HERE)=RFLAG(HERE).OR.RMUNG !VANISH ROOM. RRAND(HERE)=281 CALL JIGSUP(282) !VANISH ADVENTURER. RETURN C 52400 IF((PRSA.NE.EATW).OR.(PRSO.NE.BLICE)) 1 GO TO 10 !EAT BLUE ICE? CALL NEWSTA(BLICE,283,0,0,0) !VANISH BLUE ICE. IF(HERE.NE.ALISM) GO TO 52500 !IN REDUCED ROOM? OFLAG1(ROBOT)=OFLAG1(ROBOT).OR.VISIBT !MATERIALIZE ROBOT. DO 52450 I=1,OLNT !ENLARGE WORLD. IF((OROOM(I).NE.HERE).OR.(OSIZE(I).EQ.10000)) 1 GO TO 52450 OROOM(I)=ALICE OSIZE(I)=OSIZE(I)/64 52450 CONTINUE OAPPLI=MOVETO(ALICE,WINNER) !RETURN RETURN C 52500 CALL JIGSUP(284) !ENLARGED IN WRONG ROOM. RETURN C C O123-- BRICK C 54000 IF(PRSA.NE.BURNW) GO TO 10 !BURN? CALL JIGSUP(150) !BOOM! RETURN C C O124-- MYSELF C 55000 IF(PRSA.NE.GIVEW) GO TO 55100 !GIVE? CALL NEWSTA(PRSO,2,0,0,PLAYER) !DONE. RETURN C 55100 IF(PRSA.NE.TAKEW) GO TO 55200 !TAKE? CALL RSPEAK(286) !JOKE. RETURN C 55200 IF((PRSA.NE.KILLW).AND.(PRSA.NE.MUNGW)) GO TO 10 CALL JIGSUP(287) !KILL, NO JOKE. RETURN C OAPPLI, PAGE 10 C C O125-- PANELS INSIDE MIRROR C 56000 IF(PRSA.NE.PUSHW) GO TO 10 !PUSH? IF(POLEUF.NE.0) GO TO 56100 !SHORT POLE UP? I=731 !NO, WONT BUDGE. IF(MOD(MDIR,180).EQ.0) I=732 !DIFF MSG IF N-S. CALL RSPEAK(I) !TELL WONT MOVE. RETURN C 56100 IF(MLOC.NE.MRG) GO TO 56200 !IN GDN ROOM? CALL RSPEAK(733) !YOU LOSE. CALL JIGSUP(685) RETURN C 56200 I=831 !ROTATE L OR R. IF((PRSO.EQ.RDWAL).OR.(PRSO.EQ.YLWAL)) I=830 CALL RSPEAK(I) !TELL DIRECTION. MDIR=MOD(MDIR+45+(270*(I-830)),360) !CALCULATE NEW DIR. CALL RSPSUB(734,695+(MDIR/45)) !TELL NEW DIR. IF(WDOPNF) CALL RSPEAK(730) !IF PANEL OPEN, CLOSE. WDOPNF=.FALSE. RETURN !DONE. C C O126-- ENDS INSIDE MIRROR C 57000 IF(PRSA.NE.PUSHW) GO TO 10 !PUSH? IF(MOD(MDIR,180).EQ.0) GO TO 57100 !MIRROR N-S? CALL RSPEAK(735) !NO, WONT BUDGE. RETURN C 57100 IF(PRSO.NE.PINDR) GO TO 57300 !PUSH PINE WALL? IF(((MLOC.EQ.MRC).AND.(MDIR.EQ.180)).OR. 1 ((MLOC.EQ.MRD).AND.(MDIR.EQ.0)).OR. 2 (MLOC.EQ.MRG)) GO TO 57200 !IN VIEW OF GDN? CALL RSPEAK(736) !NO, OPENS. WDOPNF=.TRUE. !INDICATE OPEN. CFLAG(CEVPIN)=.TRUE. !TIME OPENING. CTICK(CEVPIN)=5 RETURN C 57200 CALL RSPEAK(737) !GDN SEES YOU, DIE. CALL JIGSUP(685) RETURN C 57300 NLOC=MLOC-1 !NEW LOC IF SOUTH. IF(MDIR.EQ.0) NLOC=MLOC+1 !NEW LOC IF NORTH. IF((NLOC.GE.MRA).AND.(NLOC.LE.MRD)) GO TO 57400 CALL RSPEAK(738) !HAVE REACHED END. RETURN C 57400 I=699 !ASSUME SOUTH. IF(MDIR.EQ.0) I=695 !NORTH. J=739 !ASSUME SMOOTH. IF(POLEUF.NE.0) J=740 !POLE UP, WOBBLES. CALL RSPSUB(J,I) !DESCRIBE. MLOC=NLOC IF(MLOC.NE.MRG) RETURN !NOW IN GDN ROOM? C IF(POLEUF.NE.0) GO TO 57500 !POLE UP, GDN SEES. IF(MROPNF.OR.WDOPNF) GO TO 57600 !DOOR OPEN, GDN SEES. IF(MR1F.AND.MR2F) RETURN !MIRRORS INTACT, OK. CALL RSPEAK(742) !MIRRORS BROKEN, DIE. CALL JIGSUP(743) RETURN C 57500 CALL RSPEAK(741) !POLE UP, DIE. CALL JIGSUP(743) RETURN C 57600 CALL RSPEAK(744) !DOOR OPEN, DIE. CALL JIGSUP(743) RETURN C OAPPLI, PAGE 11 C C O127-- GLOBAL GUARDIANS C 58000 IF((PRSA.NE.ATTACW).AND.(PRSA.NE.KILLW).AND. 1 (PRSA.NE.MUNGW)) GO TO 58100 !AGGRESSIVE? CALL JIGSUP(745) !LOSE. RETURN C 58100 IF(PRSA.NE.HELLOW) GO TO 10 !HELLO? CALL RSPEAK(746) !NO REPLY. RETURN C C O128-- GLOBAL MASTER C 59000 IF((PRSA.NE.ATTACW).AND.(PRSA.NE.KILLW).AND. 1 (PRSA.NE.MUNGW)) GO TO 59100 !AGGRESSIVE? CALL JIGSUP(747) !BAD IDEA. RETURN C 59100 IF(PRSA.NE.TAKEW) GO TO 10 !TAKE? CALL RSPEAK(748) !JOKE. RETURN C C O129-- NUMERAL FIVE (FOR JOKE) C 60000 IF(PRSA.NE.TAKEW) GO TO 10 !TAKE FIVE? CALL RSPEAK(419) !TIME PASSES. DO 60100 I=1,3 !WAIT A WHILE. IF(CLOCKD(X)) RETURN 60100 CONTINUE RETURN C C O130-- CRYPT FUNCTION C 61000 IF(.NOT.ENDGMF) GO TO 45000 !IF NOT EG, DIE. IF(PRSA.NE.OPENW) GO TO 61100 !OPEN? I=793 IF(QOPEN(TOMB)) I=794 CALL RSPEAK(I) OFLAG2(TOMB)=OFLAG2(TOMB).OR.OPENBT !NOW TOMB WITH VIEW. RETURN C 61100 IF(PRSA.NE.CLOSEW) GO TO 45000 !CLOSE? I=795 IF(QOPEN(TOMB)) I=796 CALL RSPEAK(I) OFLAG2(TOMB)=OFLAG2(TOMB).AND..NOT.OPENBT IF(HERE.EQ.CRYPT) CTICK(CEVSTE)=3 !IF IN CRYPT, START EG. RETURN C OAPPLI, PAGE 12 C C O131-- GLOBAL LADDER C 62000 IF((CPVEC(CPHERE+1).EQ.-2).OR.(CPVEC(CPHERE-1).EQ.-3)) 1 GO TO 62100 !LADDER HERE? CALL RSPEAK(865) !NO, LOSE. RETURN C 62100 IF((PRSA.EQ.CLMBW).OR.(PRSA.EQ.CLMBUW)) GO TO 62200 CALL RSPEAK(866) !CLIMB IT? RETURN C 62200 IF((CPHERE.EQ.10).AND.(CPVEC(CPHERE+1).EQ.-2)) 1 GO TO 62300 !AT EXIT? CALL RSPEAK(867) !NO, HIT YOUR HEAD. RETURN C 62300 F=MOVETO(CPANT,WINNER) !TO ANTEROOM. F=RMDESC(3) !DESCRIBE. RETURN C END