1: C RAPPL2- SPECIAL PURPOSE ROOM ROUTINES, PART 2 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 RAPPL2(RI) 10: IMPLICIT INTEGER (A-Z) 11: LOGICAL QOPEN,QHERE 12: #include "parser.h" 13: #include "gamestate.h" 14: #include "state.h" 15: #include "io.h" 16: #include "rooms.h" 17: #include "rflag.h" 18: #include "rindex.h" 19: #include "objects.h" 20: #include "oflags.h" 21: #include "oindex.h" 22: #include "xsrch.h" 23: #include "clock.h" 24: #include "advers.h" 25: #include "verbs.h" 26: #include "flags.h" 27: C 28: C FUNCTIONS AND DATA 29: C 30: QOPEN(R)=and(OFLAG2(R),OPENBT).NE.0 31: DATA NEWRMS/38/ 32: C RAPPL2, PAGE 2 33: C 34: RAPPL2=.TRUE. 35: GO TO (38000,39000,40000,41000,42000,43000,44000, 36: & 45000,46000,47000,48000,49000,50000, 37: & 51000,52000,53000,54000,55000,56000, 38: & 57000,58000,59000,60000), 39: & (RI-NEWRMS+1) 40: CALL BUG(70,RI) 41: RETURN 42: C 43: C R38-- MIRROR D ROOM 44: C 45: 38000 IF(PRSA.EQ.LOOKW) CALL LOOKTO(FDOOR,MRG,0,682,681) 46: RETURN 47: C 48: C R39-- MIRROR G ROOM 49: C 50: 39000 IF(PRSA.EQ.WALKIW) CALL JIGSUP(685) 51: RETURN 52: C 53: C R40-- MIRROR C ROOM 54: C 55: 40000 IF(PRSA.EQ.LOOKW) CALL LOOKTO(MRG,MRB,683,0,681) 56: RETURN 57: C 58: C R41-- MIRROR B ROOM 59: C 60: 41000 IF(PRSA.EQ.LOOKW) CALL LOOKTO(MRC,MRA,0,0,681) 61: RETURN 62: C 63: C R42-- MIRROR A ROOM 64: C 65: 42000 IF(PRSA.EQ.LOOKW) CALL LOOKTO(MRB,0,0,684,681) 66: RETURN 67: C RAPPL2, PAGE 3 68: C 69: C R43-- MIRROR C EAST/WEST 70: C 71: 43000 IF(PRSA.EQ.LOOKW) CALL EWTELL(HERE,683) 72: RETURN 73: C 74: C R44-- MIRROR B EAST/WEST 75: C 76: 44000 IF(PRSA.EQ.LOOKW) CALL EWTELL(HERE,686) 77: RETURN 78: C 79: C R45-- MIRROR A EAST/WEST 80: C 81: 45000 IF(PRSA.EQ.LOOKW) CALL EWTELL(HERE,687) 82: RETURN 83: C 84: C R46-- INSIDE MIRROR 85: C 86: 46000 IF(PRSA.NE.LOOKW) RETURN 87: C !LOOK? 88: CALL RSPEAK(688) 89: C !DESCRIBE 90: C 91: C NOW DESCRIBE POLE STATE. 92: C 93: C CASES 1,2-- MDIR=270 & MLOC=MRB, POLE IS UP OR IN HOLE 94: C CASES 3,4-- MDIR=0 V MDIR=180, POLE IS UP OR IN CHANNEL 95: C CASE 5-- POLE IS UP 96: C 97: I=689 98: C !ASSUME CASE 5. 99: IF((MDIR.EQ.270).AND.(MLOC.EQ.MRB)) 100: & I=690+MIN0(POLEUF,1) 101: IF(MOD(MDIR,180).EQ.0) 102: & I=692+MIN0(POLEUF,1) 103: CALL RSPEAK(I) 104: C !DESCRIBE POLE. 105: CALL RSPSUB(694,695+(MDIR/45)) 106: C !DESCRIBE ARROW. 107: RETURN 108: C RAPPL2, PAGE 4 109: C 110: C R47-- MIRROR EYE ROOM 111: C 112: 47000 IF(PRSA.NE.LOOKW) RETURN 113: C !LOOK? 114: I=704 115: C !ASSUME BEAM STOP. 116: DO 47100 J=1,OLNT 117: IF(QHERE(J,HERE).AND.(J.NE.RBEAM)) GO TO 47200 118: 47100 CONTINUE 119: I=703 120: 47200 CALL RSPSUB(I,ODESC2(J)) 121: C !DESCRIBE BEAM. 122: CALL LOOKTO(MRA,0,0,0,0) 123: C !LOOK NORTH. 124: RETURN 125: C 126: C R48-- INSIDE CRYPT 127: C 128: 48000 IF(PRSA.NE.LOOKW) RETURN 129: C !LOOK? 130: I=46 131: C !CRYPT IS OPEN/CLOSED. 132: IF(QOPEN(TOMB)) I=12 133: CALL RSPSUB(705,I) 134: RETURN 135: C 136: C R49-- SOUTH CORRIDOR 137: C 138: 49000 IF(PRSA.NE.LOOKW) RETURN 139: C !LOOK? 140: CALL RSPEAK(706) 141: C !DESCRIBE. 142: I=46 143: C !ODOOR IS OPEN/CLOSED. 144: IF(QOPEN(ODOOR)) I=12 145: IF(LCELL.EQ.4) CALL RSPSUB(707,I) 146: C !DESCRIBE ODOOR IF THERE. 147: RETURN 148: C 149: C R50-- BEHIND DOOR 150: C 151: 50000 IF(PRSA.NE.WALKIW) GO TO 50100 152: C !WALK IN? 153: CFLAG(CEVFOL)=.TRUE. 154: C !MASTER FOLLOWS. 155: CTICK(CEVFOL)=-1 156: RETURN 157: C 158: 50100 IF(PRSA.NE.LOOKW) RETURN 159: C !LOOK? 160: I=46 161: C !QDOOR IS OPEN/CLOSED. 162: IF(QOPEN(QDOOR)) I=12 163: CALL RSPSUB(708,I) 164: RETURN 165: C RAPPL2, PAGE 5 166: C 167: C R51-- FRONT DOOR 168: C 169: 51000 IF(PRSA.EQ.WALKIW) CTICK(CEVFOL)=0 170: C !IF EXITS, KILL FOLLOW. 171: IF(PRSA.NE.LOOKW) RETURN 172: C !LOOK? 173: CALL LOOKTO(0,MRD,709,0,0) 174: C !DESCRIBE SOUTH. 175: I=46 176: C !PANEL IS OPEN/CLOSED. 177: IF(INQSTF) I=12 178: C !OPEN IF INQ STARTED. 179: J=46 180: C !QDOOR IS OPEN/CLOSED. 181: IF(QOPEN(QDOOR)) J=12 182: CALL RSPSB2(710,I,J) 183: RETURN 184: C 185: C R52-- NORTH CORRIDOR 186: C 187: 52000 IF(PRSA.NE.LOOKW) RETURN 188: C !LOOK? 189: I=46 190: IF(QOPEN(CDOOR)) I=12 191: C !CDOOR IS OPEN/CLOSED. 192: CALL RSPSUB(711,I) 193: RETURN 194: C 195: C R53-- PARAPET 196: C 197: 53000 IF(PRSA.EQ.LOOKW) CALL RSPSUB(712,712+PNUMB) 198: RETURN 199: C 200: C R54-- CELL 201: C 202: 54000 IF(PRSA.NE.LOOKW) RETURN 203: C !LOOK? 204: I=721 205: C !CDOOR IS OPEN/CLOSED. 206: IF(QOPEN(CDOOR)) I=722 207: CALL RSPEAK(I) 208: I=46 209: C !ODOOR IS OPEN/CLOSED. 210: IF(QOPEN(ODOOR)) I=12 211: IF(LCELL.EQ.4) CALL RSPSUB(723,I) 212: C !DESCRIBE. 213: RETURN 214: C 215: C R55-- PRISON CELL 216: C 217: 55000 IF(PRSA.EQ.LOOKW) CALL RSPEAK(724) 218: C !LOOK? 219: RETURN 220: C 221: C R56-- NIRVANA CELL 222: C 223: 56000 IF(PRSA.NE.LOOKW) RETURN 224: C !LOOK? 225: I=46 226: C !ODOOR IS OPEN/CLOSED. 227: IF(QOPEN(ODOOR)) I=12 228: CALL RSPSUB(725,I) 229: RETURN 230: C RAPPL2, PAGE 6 231: C 232: C R57-- NIRVANA AND END OF GAME 233: C 234: 57000 IF(PRSA.NE.WALKIW) RETURN 235: C !WALKIN? 236: CALL RSPEAK(726) 237: CALL SCORE(.FALSE.) 238: C moved to exit routine CLOSE(DBCH) 239: CALL EXIT 240: C 241: C R58-- TOMB ROOM 242: C 243: 58000 IF(PRSA.NE.LOOKW) RETURN 244: C !LOOK? 245: I=46 246: C !TOMB IS OPEN/CLOSED. 247: IF(QOPEN(TOMB)) I=12 248: CALL RSPSUB(792,I) 249: RETURN 250: C 251: C R59-- PUZZLE SIDE ROOM 252: C 253: 59000 IF(PRSA.NE.LOOKW) RETURN 254: C !LOOK? 255: I=861 256: C !ASSUME DOOR CLOSED. 257: IF(CPOUTF) I=862 258: C !OPEN? 259: CALL RSPEAK(I) 260: C !DESCRIBE. 261: RETURN 262: C 263: C R60-- PUZZLE ROOM 264: C 265: 60000 IF(PRSA.NE.LOOKW) RETURN 266: C !LOOK? 267: IF(CPUSHF) GO TO 60100 268: C !STARTED PUZZLE? 269: CALL RSPEAK(868) 270: C !NO, DESCRIBE. 271: IF(and(OFLAG2(WARNI),TCHBT).NE.0) CALL RSPEAK(869) 272: RETURN 273: C 274: 60100 CALL CPINFO(880,CPHERE) 275: C !DESCRIBE ROOM. 276: RETURN 277: C 278: END 279: C LOOKTO-- DESCRIBE VIEW IN MIRROR HALLWAY 280: C 281: C DECLARATIONS 282: C 283: SUBROUTINE LOOKTO(NRM,SRM,NT,ST,HT) 284: IMPLICIT INTEGER(A-Z) 285: #include "gamestate.h" 286: #include "flags.h" 287: C LOOKTO, PAGE 2 288: C 289: CALL RSPEAK(HT) 290: C !DESCRIBE HALL. 291: CALL RSPEAK(NT) 292: C !DESCRIBE NORTH VIEW. 293: CALL RSPEAK(ST) 294: C !DESCRIBE SOUTH VIEW. 295: DIR=0 296: C !ASSUME NO DIRECTION. 297: IF(IABS(MLOC-HERE).NE.1) GO TO 200 298: C !MIRROR TO N OR S? 299: IF(MLOC.EQ.NRM) DIR=695 300: IF(MLOC.EQ.SRM) DIR=699 301: C !DIR=N/S. 302: IF(MOD(MDIR,180).NE.0) GO TO 100 303: C !MIRROR N-S? 304: CALL RSPSUB(847,DIR) 305: C !YES, HE SEES PANEL 306: CALL RSPSB2(848,DIR,DIR) 307: C !AND NARROW ROOMS. 308: GO TO 200 309: C 310: 100 M1=MRHERE(HERE) 311: C !WHICH MIRROR? 312: MRBF=0 313: C !ASSUME INTACT. 314: IF(((M1.EQ.1).AND..NOT.MR1F).OR. 315: & ((M1.EQ.2).AND..NOT.MR2F)) MRBF=1 316: CALL RSPSUB(849+MRBF,DIR) 317: C !DESCRIBE. 318: IF((M1.EQ.1).AND.MROPNF) CALL RSPEAK(823+MRBF) 319: IF(MRBF.NE.0) CALL RSPEAK(851) 320: C 321: 200 I=0 322: C !ASSUME NO MORE TO DO. 323: IF((NT.EQ.0).AND.((DIR.EQ.0).OR.(DIR.EQ.699))) I=852 324: IF((ST.EQ.0).AND.((DIR.EQ.0).OR.(DIR.EQ.695))) I=853 325: IF((NT+ST+DIR).EQ.0) I=854 326: IF(HT.NE.0) CALL RSPEAK(I) 327: C !DESCRIBE HALLS. 328: RETURN 329: C 330: END 331: C EWTELL-- DESCRIBE E/W NARROW ROOMS 332: C 333: C DECLARATIONS 334: C 335: SUBROUTINE EWTELL(RM,ST) 336: IMPLICIT INTEGER(A-Z) 337: LOGICAL M1 338: C 339: C ROOMS 340: #include "rindex.h" 341: #include "flags.h" 342: C EWTELL, PAGE 2 343: C 344: C NOTE THAT WE ARE EAST OR WEST OF MIRROR, AND 345: C MIRROR MUST BE N-S. 346: C 347: M1=(MDIR+(MOD(RM-MRAE,2)*180)).EQ.180 348: I=819+MOD(RM-MRAE,2) 349: C !GET BASIC E/W STRING. 350: IF((M1.AND..NOT.MR1F).OR.(.NOT.M1.AND..NOT.MR2F)) 351: & I=I+2 352: CALL RSPEAK(I) 353: IF(M1.AND.MROPNF) CALL RSPEAK(823+((I-819)/2)) 354: CALL RSPEAK(825) 355: CALL RSPEAK(ST) 356: RETURN 357: C 358: END