C RAPPL1- SPECIAL PURPOSE ROOM ROUTINES, PART 1 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 RAPPL1(RI) IMPLICIT INTEGER (A-Z) LOGICAL QOPEN,QON,QHERE,PROB,F LOGICAL MOVETO,LIT #include "parser.h" #include "gamestate.h" #include "state.h" C C SCREEN OF LIGHT C COMMON /SCREEN/ FROMDR,SCOLRM,SCOLAC COMMON /SCREEN/ SCOLDR(8),SCOLWL(12) C C MISCELLANEOUS VARIABLES C COMMON /BATS/ BATDRP(9) #include "rooms.h" #include "rflag.h" #include "rindex.h" #include "objects.h" #include "oflags.h" #include "oindex.h" #include "clock.h" #include "villians.h" #include "advers.h" #include "verbs.h" #include "flags.h" C C FUNCTIONS AND DATA C QOPEN(R)=and(OFLAG2(R),OPENBT).NE.0 QON(R)=and(OFLAG1(R),ONBT).NE.0 C RAPPL1, PAGE 2 C RAPPL1=.TRUE. C !USUALLY IGNORED. IF(RI.EQ.0) RETURN C !RETURN IF NAUGHT. C C !SET TO FALSE FOR C C !NEW DESC NEEDED. GO TO (1000,2000,3000,4000,5000,6000,7000,8000,9000,10000, & 11000,12000,13000,14000,15000,16000,17000,18000,19000,20000, & 21000,22000,23000,24000,25000,26000,27000,28000,29000,30000, & 31000,32000,33000,34000,35000,36000,37000),RI CALL BUG(1,RI) C C R1-- EAST OF HOUSE. DESCRIPTION DEPENDS ON STATE OF WINDOW C 1000 IF(PRSA.NE.LOOKW) RETURN C !LOOK? I=13 C !ASSUME CLOSED. IF(QOPEN(WINDO)) I=12 C !IF OPEN, AJAR. CALL RSPSUB(11,I) C !DESCRIBE. RETURN C C R2-- KITCHEN. SAME VIEW FROM INSIDE. C 2000 IF(PRSA.NE.LOOKW) RETURN C !LOOK? I=13 C !ASSUME CLOSED. IF(QOPEN(WINDO)) I=12 C !IF OPEN, AJAR. CALL RSPSUB(14,I) C !DESCRIBE. RETURN C C R3-- LIVING ROOM. DESCRIPTION DEPENDS ON MAGICF (STATE OF C DOOR TO CYCLOPS ROOM), RUG (MOVED OR NOT), DOOR (OPEN OR CLOSED) C 3000 IF(PRSA.NE.LOOKW) GO TO 3500 C !LOOK? I=15 C !ASSUME NO HOLE. IF(MAGICF) I=16 C !IF MAGICF, CYCLOPS HOLE. CALL RSPEAK(I) C !DESCRIBE. I=17+ORRUG C !ASSUME INITIAL STATE. IF(QOPEN(DOOR)) I=I+2 C !DOOR OPEN? CALL RSPEAK(I) C !DESCRIBE. RETURN C C NOT A LOOK WORD. REEVALUATE TROPHY CASE. C 3500 IF((PRSA.NE.TAKEW).AND.((PRSA.NE.PUTW).OR.(PRSI.NE.TCASE))) & RETURN ASCORE(WINNER)=RWSCOR C !SCORE TROPHY CASE. DO 3600 I=1,OLNT C !RETAIN RAW SCORE AS WELL. J=I C !FIND OUT IF IN CASE. 3550 J=OCAN(J) C !TRACE OWNERSHIP. IF(J.EQ.0) GO TO 3600 IF(J.NE.TCASE) GO TO 3550 C !DO ALL LEVELS. ASCORE(WINNER)=ASCORE(WINNER)+OTVAL(I) 3600 CONTINUE CALL SCRUPD(0) C !SEE IF ENDGAME TRIG. RETURN C RAPPL1, PAGE 3 C C R4-- CELLAR. SHUT DOOR AND BAR IT IF HE JUST WALKED IN. C 4000 IF(PRSA.NE.LOOKW) GO TO 4500 C !LOOK? CALL RSPEAK(21) C !DESCRIBE CELLAR. RETURN C 4500 IF(PRSA.NE.WALKIW) RETURN C !WALKIN? IF(and(OFLAG2(DOOR),(OPENBT+TCHBT)).NE.OPENBT) RETURN OFLAG2(DOOR)=and( or(OFLAG2(DOOR),TCHBT), not(OPENBT)) CALL RSPEAK(22) C !SLAM AND BOLT DOOR. RETURN C C R5-- MAZE11. DESCRIBE STATE OF GRATING. C 5000 IF(PRSA.NE.LOOKW) RETURN C !LOOK? CALL RSPEAK(23) C !DESCRIBE. I=24 C !ASSUME LOCKED. IF(GRUNLF) I=26 C !UNLOCKED? IF(QOPEN(GRATE)) I=25 C !OPEN? CALL RSPEAK(I) C !DESCRIBE GRATE. RETURN C C R6-- CLEARING. DESCRIBE CLEARING, MOVE LEAVES. C 6000 IF(PRSA.NE.LOOKW) GO TO 6500 C !LOOK? CALL RSPEAK(27) C !DESCRIBE. IF(RVCLR.EQ.0) RETURN C !LEAVES MOVED? I=28 C !YES, ASSUME GRATE CLOSED. IF(QOPEN(GRATE)) I=29 C !OPEN? CALL RSPEAK(I) C !DESCRIBE GRATE. RETURN C 6500 IF((RVCLR.NE.0).OR.(QHERE(LEAVE,CLEAR).AND. & ((PRSA.NE.MOVEW).OR.(PRSO.NE.LEAVE)))) RETURN CALL RSPEAK(30) C !MOVE LEAVES, REVEAL GRATE. RVCLR=1 C !INDICATE LEAVES MOVED. RETURN C RAPPL1, PAGE 4 C C R7-- RESERVOIR SOUTH. DESCRIPTION DEPENDS ON LOW TIDE FLAG. C 7000 IF(PRSA.NE.LOOKW) RETURN C !LOOK? I=31 C !ASSUME FULL. IF(LWTIDF) I=32 C !IF LOW TIDE, EMPTY. CALL RSPEAK(I) C !DESCRIBE. CALL RSPEAK(33) C !DESCRIBE EXITS. RETURN C C R8-- RESERVOIR. STATE DEPENDS ON LOW TIDE FLAG. C 8000 IF(PRSA.NE.LOOKW) RETURN C !LOOK? I=34 C !ASSUME FULL. IF(LWTIDF) I=35 C !IF LOW TIDE, EMTPY. CALL RSPEAK(I) C !DESCRIBE. RETURN C C R9-- RESERVOIR NORTH. ALSO DEPENDS ON LOW TIDE FLAG. C 9000 IF(PRSA.NE.LOOKW) RETURN C !LOOK? I=36 C !YOU GET THE IDEA. IF(LWTIDF) I=37 CALL RSPEAK(I) CALL RSPEAK(38) RETURN C C R10-- GLACIER ROOM. STATE DEPENDS ON MELTED, VANISHED FLAGS. C 10000 IF(PRSA.NE.LOOKW) RETURN C !LOOK? CALL RSPEAK(39) C !BASIC DESCRIPTION. I=0 C !ASSUME NO CHANGES. IF(GLACMF) I=40 C !PARTIAL MELT? IF(GLACRF) I=41 C !COMPLETE MELT? CALL RSPEAK(I) C !DESCRIBE. RETURN C C R11-- FOREST ROOM C 11000 IF(PRSA.EQ.WALKIW) CFLAG(CEVFOR)=.TRUE. C !IF WALK IN, BIRDIE. RETURN C C R12-- MIRROR ROOM. STATE DEPENDS ON MIRROR INTACT. C 12000 IF(PRSA.NE.LOOKW) RETURN C !LOOK? CALL RSPEAK(42) C !DESCRIBE. IF(MIRRMF) CALL RSPEAK(43) C !IF BROKEN, NASTY REMARK. RETURN C RAPPL1, PAGE 5 C C R13-- CAVE2 ROOM. BLOW OUT CANDLES WITH 50% PROBABILITY. C 13000 IF(PRSA.NE.WALKIW) RETURN C !WALKIN? IF(PROB(50,50).OR.(OADV(CANDL).NE.WINNER).OR. & .NOT.QON(CANDL)) RETURN OFLAG1(CANDL)=and(OFLAG1(CANDL), not(ONBT)) CALL RSPEAK(47) C !TELL OF WINDS. CFLAG(CEVCND)=.FALSE. C !HALT CANDLE COUNTDOWN. RETURN C C R14-- BOOM ROOM. BLOW HIM UP IF CARRYING FLAMING OBJECT. C 14000 J=ODESC2(CANDL) C !ASSUME CANDLE. IF((OADV(CANDL).EQ.WINNER).AND.QON(CANDL)) GO TO 14100 J=ODESC2(TORCH) C !ASSUME TORCH. IF((OADV(TORCH).EQ.WINNER).AND.QON(TORCH)) GO TO 14100 J=ODESC2(MATCH) IF((OADV(MATCH).EQ.WINNER).AND.QON(MATCH)) GO TO 14100 RETURN C !SAFE C 14100 IF(PRSA.NE.TRNONW) GO TO 14200 C !TURN ON? CALL RSPSUB(294,J) C !BOOM C ! CALL JIGSUP(44) RETURN C 14200 IF(PRSA.NE.WALKIW) RETURN C !WALKIN? CALL RSPSUB(295,J) C !BOOM C ! CALL JIGSUP(44) RETURN C C R15-- NO-OBJS. SEE IF EMPTY HANDED, SCORE LIGHT SHAFT. C 15000 EMPTHF=.TRUE. C !ASSUME TRUE. DO 15100 I=1,OLNT C !SEE IF CARRYING. IF(OADV(I).EQ.WINNER) EMPTHF=.FALSE. 15100 CONTINUE C IF((HERE.NE.BSHAF).OR.(.NOT.LIT(HERE))) RETURN CALL SCRUPD(LTSHFT) C !SCORE LIGHT SHAFT. LTSHFT=0 C !NEVER AGAIN. RETURN C RAPPL1, PAGE 6 C C R16-- MACHINE ROOM. DESCRIBE MACHINE. C 16000 IF(PRSA.NE.LOOKW) RETURN C !LOOK? I=46 C !ASSUME LID CLOSED. IF(QOPEN(MACHI)) I=12 C !IF OPEN, OPEN. CALL RSPSUB(45,I) C !DESCRIBE. RETURN C C R17-- BAT ROOM. UNLESS CARRYING GARLIC, FLY AWAY WITH ME... C 17000 IF(PRSA.NE.LOOKW) GO TO 17500 C !LOOK? CALL RSPEAK(48) C !DESCRIBE ROOM. IF(OADV(GARLI).EQ.WINNER) CALL RSPEAK(49) C !BAT HOLDS NOSE. RETURN C 17500 IF((PRSA.NE.WALKIW).OR.(OADV(GARLI).EQ.WINNER)) RETURN CALL RSPEAK(50) C !TIME TO FLY, JACK. F=MOVETO(BATDRP(RND(9)+1),WINNER) C !SELECT RANDOM DEST. RAPPL1=.FALSE. C !INDICATE NEW DESC NEEDED. RETURN C C R18-- DOME ROOM. STATE DEPENDS ON WHETHER ROPE TIED TO RAILING. C 18000 IF(PRSA.NE.LOOKW) GO TO 18500 C !LOOK? CALL RSPEAK(51) C !DESCRIBE. IF(DOMEF) CALL RSPEAK(52) C !IF ROPE, DESCRIBE. RETURN C 18500 IF(PRSA.EQ.LEAPW) CALL JIGSUP(53) C !DID HE JUMP??? RETURN C C R19-- TORCH ROOM. ALSO DEPENDS ON WHETHER ROPE TIED TO RAILING. C 19000 IF(PRSA.NE.LOOKW) RETURN C !LOOK? CALL RSPEAK(54) C !DESCRIBE. IF(DOMEF) CALL RSPEAK(55) C !IF ROPE, DESCRIBE. RETURN C C R20-- CAROUSEL ROOM. SPIN HIM OR KILL HIM. C 20000 IF(PRSA.NE.LOOKW) GO TO 20500 C !LOOK? CALL RSPEAK(56) C !DESCRIBE. IF(.NOT.CAROFF) CALL RSPEAK(57) C !IF NOT FLIPPED, SPIN. RETURN C 20500 IF((PRSA.EQ.WALKIW).AND.CAROZF) CALL JIGSUP(58) C !WALKED IN. RETURN C RAPPL1, PAGE 7 C C R21-- LLD ROOM. HANDLE EXORCISE, DESCRIPTIONS. C 21000 IF(PRSA.NE.LOOKW) GO TO 21500 C !LOOK? CALL RSPEAK(59) C !DESCRIBE. IF(.NOT.LLDF) CALL RSPEAK(60) C !IF NOT VANISHED, GHOSTS. RETURN C 21500 IF(PRSA.NE.EXORCW) RETURN C !EXORCISE? IF((OADV(BELL).EQ.WINNER).AND.(OADV(BOOK).EQ.WINNER).AND. & (OADV(CANDL).EQ.WINNER).AND.QON(CANDL)) GO TO 21600 CALL RSPEAK(62) C !NOT EQUIPPED. RETURN C 21600 IF(QHERE(GHOST,HERE)) GO TO 21700 C !GHOST HERE? CALL JIGSUP(61) C !NOPE, EXORCISE YOU. RETURN C 21700 CALL NEWSTA(GHOST,63,0,0,0) C !VANISH GHOST. LLDF=.TRUE. C !OPEN GATE. RETURN C C R22-- LLD2-ROOM. IS HIS HEAD ON A POLE? C 22000 IF(PRSA.NE.LOOKW) RETURN C !LOOK? CALL RSPEAK(64) C !DESCRIBE. IF(ONPOLF) CALL RSPEAK(65) C !ON POLE? RETURN C C R23-- DAM ROOM. DESCRIBE RESERVOIR, PANEL. C 23000 IF(PRSA.NE.LOOKW) RETURN C !LOOK? CALL RSPEAK(66) C !DESCRIBE. I=67 IF(LWTIDF) I=68 CALL RSPEAK(I) C !DESCRIBE RESERVOIR. CALL RSPEAK(69) C !DESCRIBE PANEL. IF(GATEF) CALL RSPEAK(70) C !BUBBLE IS GLOWING. RETURN C C R24-- TREE ROOM C 24000 IF(PRSA.NE.LOOKW) RETURN C !LOOK? CALL RSPEAK(660) C !DESCRIBE. I=661 C !SET FLAG FOR BELOW. DO 24200 J=1,OLNT C !DESCRIBE OBJ IN FORE3. IF(.NOT.QHERE(J,FORE3).OR.(J.EQ.FTREE)) GO TO 24200 CALL RSPEAK(I) C !SET STAGE, I=0 CALL RSPSUB(502,ODESC2(J)) C !DESCRIBE. 24200 CONTINUE RETURN C RAPPL1, PAGE 8 C C R25-- CYCLOPS-ROOM. DEPENDS ON CYCLOPS STATE, ASLEEP FLAG, MAGIC FLAG. C 25000 IF(PRSA.NE.LOOKW) RETURN C !LOOK? CALL RSPEAK(606) C !DESCRIBE. I=607 C !ASSUME BASIC STATE. IF(RVCYC.GT.0) I=608 C !>0? HUNGRY. IF(RVCYC.LT.0) I=609 C !<0? THIRSTY. IF(CYCLOF) I=610 C !ASLEEP? IF(MAGICF) I=611 C !GONE? CALL RSPEAK(I) C !DESCRIBE. IF(.NOT.CYCLOF .AND.(RVCYC.NE.0)) & CALL RSPEAK(193+IABS(RVCYC)) RETURN C C R26-- BANK BOX ROOM. C 26000 IF(PRSA.NE.WALKIW) RETURN C !SURPRISE HIM. DO 26100 I=1,8,2 C !SCOLRM DEPENDS ON IF(FROMDR.EQ.SCOLDR(I)) SCOLRM=SCOLDR(I+1) 26100 CONTINUE C !ENTRY DIRECTION. RETURN C C R27-- TREASURE ROOM. C 27000 IF((PRSA.NE.WALKIW).OR. .NOT.THFACT) & RETURN IF(OROOM(THIEF).NE.HERE) & CALL NEWSTA(THIEF,82,HERE,0,0) THFPOS=HERE C !RESET SEARCH PATTERN. OFLAG2(THIEF)=or(OFLAG2(THIEF),FITEBT) IF(OROOM(CHALI).EQ.HERE) & OFLAG1(CHALI)=and(OFLAG1(CHALI),not(TAKEBT)) C C VANISH EVERYTHING IN ROOM C J=0 C !ASSUME NOTHING TO VANISH. DO 27200 I=1,OLNT IF((I.EQ.CHALI).OR.(I.EQ.THIEF).OR..NOT.QHERE(I,HERE)) & GO TO 27200 J=83 C !FLAG BYEBYE. OFLAG1(I)=and(OFLAG1(I),not(VISIBT)) 27200 CONTINUE CALL RSPEAK(J) C !DESCRIBE. RETURN C C R28-- CLIFF FUNCTION. SEE IF CARRYING INFLATED BOAT. C 28000 DEFLAF=OADV(RBOAT).NE.WINNER C !TRUE IF NOT CARRYING. RETURN C RAPPL1, PAGE 9 C C R29-- RIVR4 ROOM. PLAY WITH BUOY. C 29000 IF(.NOT.BUOYF.OR.(OADV(BUOY).NE.WINNER)) RETURN CALL RSPEAK(84) C !GIVE HINT, BUOYF=.FALSE. C !THEN DISABLE. RETURN C C R30-- OVERFALLS. DOOM. C 30000 IF(PRSA.NE.LOOKW) CALL JIGSUP(85) C !OVER YOU GO. RETURN C C R31-- BEACH ROOM. DIG A HOLE. C 31000 IF((PRSA.NE.DIGW).OR.(PRSO.NE.SHOVE)) RETURN RVSND=RVSND+1 C !INCREMENT DIG STATE. GO TO (31100,31100,31100,31400,31500),RVSND C !PROCESS STATE. CALL BUG(2,RVSND) C 31100 CALL RSPEAK(85+RVSND) C !1-3... DISCOURAGE HIM. RETURN C 31400 I=89 C !ASSUME DISCOVERY. IF(and(OFLAG1(STATU),VISIBT).NE.0) I=88 CALL RSPEAK(I) OFLAG1(STATU)=or(OFLAG1(STATU),VISIBT) RETURN C 31500 RVSND=0 C !5... SAND COLLAPSES CALL JIGSUP(90) C !AND SO DOES HE. RETURN C C R32-- TCAVE ROOM. DIG A HOLE IN GUANO. C 32000 IF((PRSA.NE.DIGW).OR.(PRSO.NE.SHOVE)) RETURN I=91 C !ASSUME NO GUANO. IF(.NOT. QHERE(GUANO,HERE)) GO TO 32100 C !IS IT HERE? RVGUA=MIN0(4,RVGUA+1) C !YES, SET NEW STATE. I=91+RVGUA C !GET NASTY REMARK. 32100 CALL RSPEAK(I) C !DESCRIBE. RETURN C C R33-- FALLS ROOM C 33000 IF(PRSA.NE.LOOKW) RETURN C !LOOK? CALL RSPEAK(96) C !DESCRIBE. I=97 C !ASSUME NO RAINBOW. IF(RAINBF) I=98 C !GOT ONE? CALL RSPEAK(I) C !DESCRIBE. RETURN C RAPPL1, PAGE 10 C C R34-- LEDGE FUNCTION. LEDGE CAN COLLAPSE. C 34000 IF(PRSA.NE.LOOKW) RETURN C !LOOK? CALL RSPEAK(100) C !DESCRIBE. I=102 C !ASSUME SAFE ROOM OK. IF(and(RFLAG(MSAFE),RMUNG).NE.0) I=101 CALL RSPEAK(I) C !DESCRIBE. RETURN C C R35-- SAFE ROOM. STATE DEPENDS ON WHETHER SAFE BLOWN. C 35000 IF(PRSA.NE.LOOKW) RETURN C !LOOK? CALL RSPEAK(104) C !DESCRIBE. I=105 C !ASSUME OK. IF(SAFEF) I=106 C !BLOWN? CALL RSPEAK(I) C !DESCRIBE. RETURN C C R36-- MAGNET ROOM. DESCRIBE, CHECK FOR SPINDIZZY DOOM. C 36000 IF(PRSA.NE.LOOKW) GO TO 36500 C !LOOK? CALL RSPEAK(107) C !DESCRIBE. RETURN C 36500 IF((PRSA.NE.WALKIW).OR. .NOT.CAROFF) RETURN C !WALKIN ON FLIPPED? IF(CAROZF) GO TO 36600 C !ZOOM? CALL RSPEAK(108) C !NO, SPIN HIS COMPASS. RETURN C 36600 I=58 C !SPIN HIS INSIDES. IF(WINNER.NE.PLAYER) I=99 C !SPIN ROBOT. CALL JIGSUP(I) C !DEAD. RETURN C C R37-- CAGE ROOM. IF SOLVED CAGE, MOVE TO OTHER CAGE ROOM. C 37000 IF(CAGESF) F=MOVETO(CAGER,WINNER) C !IF SOLVED, MOVE. RETURN C END