1*35973SbosticC AAPPLI- APPLICABLES FOR ADVENTURERS 2*35973SbosticC 3*35973SbosticC COPYRIGHT 1980, INFOCOM COMPUTERS AND COMMUNICATIONS, CAMBRIDGE MA. 02142 4*35973SbosticC ALL RIGHTS RESERVED, COMMERCIAL USAGE STRICTLY PROHIBITED 5*35973SbosticC WRITTEN BY R. M. SUPNIK 6*35973SbosticC 7*35973SbosticC DECLARATIONS 8*35973SbosticC 9*35973Sbostic LOGICAL FUNCTION AAPPLI(RI) 10*35973Sbostic IMPLICIT INTEGER (A-Z) 11*35973Sbostic LOGICAL F,MOVETO 12*35973Sbostic#include "parser.h" 13*35973Sbostic#include "gamestate.h" 14*35973Sbostic#include "rooms.h" 15*35973Sbostic#include "rflag.h" 16*35973Sbostic#include "rindex.h" 17*35973Sbostic#include "xsrch.h" 18*35973Sbostic#include "objects.h" 19*35973Sbostic#include "oflags.h" 20*35973Sbostic#include "oindex.h" 21*35973Sbostic#include "clock.h" 22*35973Sbostic#include "advers.h" 23*35973Sbostic#include "verbs.h" 24*35973Sbostic#include "flags.h" 25*35973SbosticC AAPPLI, PAGE 2 26*35973SbosticC 27*35973Sbostic IF(RI.EQ.0) GO TO 10 28*35973SbosticC !IF ZERO, NO APP. 29*35973Sbostic AAPPLI=.TRUE. 30*35973SbosticC !ASSUME WINS. 31*35973Sbostic GO TO (1000,2000),RI 32*35973SbosticC !BRANCH ON ADV. 33*35973Sbostic CALL BUG(11,RI) 34*35973SbosticC 35*35973SbosticC COMMON FALSE RETURN. 36*35973SbosticC 37*35973Sbostic10 AAPPLI=.FALSE. 38*35973Sbostic RETURN 39*35973SbosticC 40*35973SbosticC A1-- ROBOT. PROCESS MOST COMMANDS GIVEN TO ROBOT. 41*35973SbosticC 42*35973Sbostic1000 IF((PRSA.NE.RAISEW).OR.(PRSO.NE.RCAGE)) GO TO 1200 43*35973Sbostic CFLAG(CEVSPH)=.FALSE. 44*35973SbosticC !ROBOT RAISED CAGE. 45*35973Sbostic WINNER=PLAYER 46*35973SbosticC !RESET FOR PLAYER. 47*35973Sbostic F=MOVETO(CAGER,WINNER) 48*35973SbosticC !MOVE TO NEW ROOM. 49*35973Sbostic CALL NEWSTA(CAGE,567,CAGER,0,0) 50*35973SbosticC !INSTALL CAGE IN ROOM. 51*35973Sbostic CALL NEWSTA(ROBOT,0,CAGER,0,0) 52*35973SbosticC !INSTALL ROBOT IN ROOM. 53*35973Sbostic AROOM(AROBOT)=CAGER 54*35973SbosticC !ALSO MOVE ROBOT/ADV. 55*35973Sbostic CAGESF=.TRUE. 56*35973SbosticC !CAGE SOLVED. 57*35973Sbostic OFLAG1(ROBOT)=and(OFLAG1(ROBOT),not(NDSCBT)) 58*35973Sbostic OFLAG1(SPHER)=or(OFLAG1(SPHER),TAKEBT) 59*35973Sbostic RETURN 60*35973SbosticC 61*35973Sbostic1200 IF((PRSA.NE.DRINKW).AND.(PRSA.NE.EATW)) GO TO 1300 62*35973Sbostic CALL RSPEAK(568) 63*35973SbosticC !EAT OR DRINK, JOKE. 64*35973Sbostic RETURN 65*35973SbosticC 66*35973Sbostic1300 IF(PRSA.NE.READW) GO TO 1400 67*35973SbosticC !READ, 68*35973Sbostic CALL RSPEAK(569) 69*35973SbosticC !JOKE. 70*35973Sbostic RETURN 71*35973SbosticC 72*35973Sbostic1400 IF((PRSA.EQ.WALKW).OR.(PRSA.EQ.TAKEW).OR.(PRSA.EQ.DROPW) 73*35973Sbostic& .OR.(PRSA.EQ.PUTW).OR.(PRSA.EQ.PUSHW).OR.(PRSA.EQ.THROWW) 74*35973Sbostic& .OR.(PRSA.EQ.TURNW).OR.(PRSA.EQ.LEAPW)) GO TO 10 75*35973Sbostic CALL RSPEAK(570) 76*35973SbosticC !JOKE. 77*35973Sbostic RETURN 78*35973SbosticC AAPPLI, PAGE 3 79*35973SbosticC 80*35973SbosticC A2-- MASTER. PROCESS MOST COMMANDS GIVEN TO MASTER. 81*35973SbosticC 82*35973Sbostic2000 IF(and(OFLAG2(QDOOR),OPENBT).NE.0) GO TO 2100 83*35973Sbostic CALL RSPEAK(783) 84*35973SbosticC !NO MASTER YET. 85*35973Sbostic RETURN 86*35973SbosticC 87*35973Sbostic2100 IF(PRSA.NE.WALKW) GO TO 2200 88*35973SbosticC !WALK? 89*35973Sbostic I=784 90*35973SbosticC !ASSUME WONT. 91*35973Sbostic IF(((HERE.EQ.SCORR).AND. 92*35973Sbostic& ((PRSO.EQ.XNORTH).OR.(PRSO.EQ.XENTER))).OR. 93*35973Sbostic& ((HERE.EQ.NCORR).AND. 94*35973Sbostic& ((PRSO.EQ.XSOUTH).OR.(PRSO.EQ.XENTER)))) 95*35973Sbostic& I=785 96*35973Sbostic CALL RSPEAK(I) 97*35973Sbostic RETURN 98*35973SbosticC 99*35973Sbostic2200 IF((PRSA.EQ.TAKEW).OR.(PRSA.EQ.DROPW).OR.(PRSA.EQ.PUTW).OR. 100*35973Sbostic& (PRSA.EQ.THROWW).OR.(PRSA.EQ.PUSHW).OR.(PRSA.EQ.TURNW).OR. 101*35973Sbostic& (PRSA.EQ.SPINW).OR.(PRSA.EQ.TRNTOW).OR.(PRSA.EQ.FOLLOW).OR. 102*35973Sbostic& (PRSA.EQ.STAYW).OR.(PRSA.EQ.OPENW).OR.(PRSA.EQ.CLOSEW).OR. 103*35973Sbostic& (PRSA.EQ.KILLW)) GO TO 10 104*35973Sbostic CALL RSPEAK(786) 105*35973SbosticC !MASTER CANT DO IT. 106*35973Sbostic RETURN 107*35973SbosticC 108*35973Sbostic END 109*35973SbosticC THIEFD- INTERMOVE THIEF DEMON 110*35973SbosticC 111*35973SbosticC DECLARATIONS 112*35973SbosticC 113*35973Sbostic SUBROUTINE THIEFD 114*35973Sbostic IMPLICIT INTEGER (A-Z) 115*35973Sbostic LOGICAL ONCE,PROB,QHERE,QSTILL,LIT,WINNIN 116*35973Sbostic#include "gamestate.h" 117*35973SbosticC 118*35973Sbostic#include "debug.h" 119*35973Sbostic#include "rooms.h" 120*35973Sbostic#include "rflag.h" 121*35973Sbostic#include "rindex.h" 122*35973Sbostic#include "objects.h" 123*35973Sbostic#include "oflags.h" 124*35973Sbostic#include "oindex.h" 125*35973Sbostic#include "villians.h" 126*35973Sbostic#include "flags.h" 127*35973SbosticC 128*35973SbosticC FUNCTIONS AND DATA 129*35973SbosticC 130*35973Sbostic QSTILL(R)=(QHERE(STILL,R).OR.(OADV(STILL).EQ.-THIEF)) 131*35973SbosticC THIEFD, PAGE 2 132*35973SbosticC 133*35973Sbostic#ifdef debug 134*35973Sbostic DFLAG=and(PRSFLG, 32768).NE.0 135*35973Sbostic#endif debug 136*35973SbosticC !SET UP DETAIL FLAG. 137*35973Sbostic ONCE=.FALSE. 138*35973SbosticC !INIT FLAG. 139*35973Sbostic1025 RHERE=OROOM(THIEF) 140*35973SbosticC !VISIBLE POS. 141*35973Sbostic IF(RHERE.NE.0) THFPOS=RHERE 142*35973SbosticC 143*35973Sbostic IF(THFPOS.EQ.HERE) GO TO 1100 144*35973SbosticC !THIEF IN WIN RM? 145*35973Sbostic IF(THFPOS.NE.TREAS) GO TO 1400 146*35973SbosticC !THIEF NOT IN TREAS? 147*35973SbosticC 148*35973SbosticC THIEF IS IN TREASURE ROOM, AND WINNER IS NOT. 149*35973SbosticC 150*35973Sbostic#ifdef debug 151*35973Sbostic IF(DFLAG) PRINT 10 152*35973Sbostic#ifdef NOCC 153*35973Sbostic10 FORMAT('THIEFD-- IN TREASURE ROOM') 154*35973Sbostic#else NOCC 155*35973Sbostic10 FORMAT(' THIEFD-- IN TREASURE ROOM') 156*35973Sbostic#endif 157*35973Sbostic#endif debug 158*35973Sbostic IF(RHERE.EQ.0) GO TO 1050 159*35973SbosticC !VISIBLE? 160*35973Sbostic CALL NEWSTA(THIEF,0,0,0,0) 161*35973SbosticC !YES, VANISH. 162*35973Sbostic RHERE=0 163*35973Sbostic IF(QSTILL(TREAS)) CALL NEWSTA(STILL,0,0,THIEF,0) 164*35973Sbostic1050 I=ROBADV(-THIEF,THFPOS,0,0) 165*35973SbosticC !DROP VALUABLES. 166*35973Sbostic IF(QHERE(EGG,THFPOS)) OFLAG2(EGG)=or(OFLAG2(EGG),OPENBT) 167*35973Sbostic GO TO 1700 168*35973SbosticC 169*35973SbosticC THIEF AND WINNER IN SAME ROOM. 170*35973SbosticC 171*35973Sbostic1100 IF(THFPOS.EQ.TREAS) GO TO 1700 172*35973SbosticC !IF TREAS ROOM, NOTHING. 173*35973Sbostic IF(and(RFLAG(THFPOS),RLIGHT).NE.0) GO TO 1400 174*35973Sbostic#ifdef debug 175*35973Sbostic IF(DFLAG) PRINT 20 176*35973Sbostic#ifdef NOCC 177*35973Sbostic20 FORMAT('THIEFD-- IN ADV ROOM') 178*35973Sbostic#else NOCC 179*35973Sbostic20 FORMAT(' THIEFD-- IN ADV ROOM') 180*35973Sbostic#endif NOCC 181*35973Sbostic#endif debug 182*35973Sbostic IF(THFFLG) GO TO 1300 183*35973SbosticC !THIEF ANNOUNCED? 184*35973Sbostic IF((RHERE.NE.0).OR.PROB(70,70)) GO TO 1150 185*35973SbosticC !IF INVIS AND 30%. 186*35973Sbostic IF(OCAN(STILL).NE.THIEF) GO TO 1700 187*35973SbosticC !ABORT IF NO STILLETTO. 188*35973Sbostic CALL NEWSTA(THIEF,583,THFPOS,0,0) 189*35973SbosticC !INSERT THIEF INTO ROOM. 190*35973Sbostic THFFLG=.TRUE. 191*35973SbosticC !THIEF IS ANNOUNCED. 192*35973Sbostic RETURN 193*35973SbosticC 194*35973Sbostic1150 IF((RHERE.EQ.0).OR.(and(OFLAG2(THIEF),FITEBT).EQ.0)) 195*35973Sbostic& GO TO 1200 196*35973Sbostic IF(WINNIN(THIEF,WINNER)) GO TO 1175 197*35973SbosticC !WINNING? 198*35973Sbostic CALL NEWSTA(THIEF,584,0,0,0) 199*35973SbosticC !NO, VANISH THIEF. 200*35973Sbostic OFLAG2(THIEF)=and(OFLAG2(THIEF), not(FITEBT)) 201*35973Sbostic IF(QSTILL(THFPOS)) CALL NEWSTA(STILL,0,0,THIEF,0) 202*35973Sbostic RETURN 203*35973SbosticC 204*35973Sbostic1175 IF(PROB(90,90)) GO TO 1700 205*35973SbosticC !90% CHANCE TO STAY. 206*35973SbosticC 207*35973Sbostic1200 IF((RHERE.EQ.0).OR.PROB(70,70)) GO TO 1250 208*35973SbosticC !IF VISIBLE AND 30% 209*35973Sbostic CALL NEWSTA(THIEF,585,0,0,0) 210*35973SbosticC !VANISH THIEF. 211*35973Sbostic IF(QSTILL(THFPOS)) CALL NEWSTA(STILL,0,0,THIEF,0) 212*35973Sbostic RETURN 213*35973SbosticC 214*35973Sbostic1300 IF(RHERE.EQ.0) GO TO 1700 215*35973SbosticC !ANNOUNCED. VISIBLE? 216*35973Sbostic1250 IF(PROB(70,70)) RETURN 217*35973SbosticC !70% CHANCE TO DO NOTHING. 218*35973Sbostic THFFLG=.TRUE. 219*35973Sbostic NR=ROBRM(THFPOS,100,0,0,-THIEF)+ROBADV(WINNER,0,0,-THIEF) 220*35973Sbostic I=586 221*35973SbosticC !ROBBED EM. 222*35973Sbostic IF(RHERE.NE.0) I=588 223*35973SbosticC !WAS HE VISIBLE? 224*35973Sbostic IF(NR.NE.0) I=I+1 225*35973SbosticC !DID HE GET ANYTHING? 226*35973Sbostic CALL NEWSTA(THIEF,I,0,0,0) 227*35973SbosticC !VANISH THIEF. 228*35973Sbostic IF(QSTILL(THFPOS)) 229*35973Sbostic& CALL NEWSTA(STILL,0,0,THIEF,0) 230*35973Sbostic IF((NR.NE.0).AND..NOT.LIT(THFPOS)) CALL RSPEAK(406) 231*35973Sbostic RHERE=0 232*35973Sbostic GO TO 1700 233*35973SbosticC !ONWARD. 234*35973SbosticC 235*35973SbosticC NOT IN ADVENTURERS ROOM. 236*35973SbosticC 237*35973Sbostic1400 CALL NEWSTA(THIEF,0,0,0,0) 238*35973SbosticC !VANISH. 239*35973Sbostic RHERE=0 240*35973Sbostic#ifdef debug 241*35973Sbostic IF(DFLAG) PRINT 30,THFPOS 242*35973Sbostic#ifdef NOCC 243*35973Sbostic30 FORMAT('THIEFD-- IN ROOM ',I4) 244*35973Sbostic#else NOCC 245*35973Sbostic30 FORMAT(' THIEFD-- IN ROOM ',I4) 246*35973Sbostic#endif NOCC 247*35973Sbostic#endif debug 248*35973Sbostic IF(QSTILL(THFPOS)) 249*35973Sbostic& CALL NEWSTA(STILL,0,0,THIEF,0) 250*35973Sbostic IF(and(RFLAG(THFPOS),RSEEN).EQ.0) GO TO 1700 251*35973Sbostic I=ROBRM(THFPOS,75,0,0,-THIEF) 252*35973SbosticC !ROB ROOM 75%. 253*35973Sbostic IF((THFPOS.LT.MAZE1).OR.(THFPOS.GT.MAZ15).OR. 254*35973Sbostic& (HERE.LT.MAZE1).OR.(HERE.GT.MAZ15)) GO TO 1500 255*35973Sbostic DO 1450 I=1,OLNT 256*35973SbosticC !BOTH IN MAZE. 257*35973Sbostic IF(.NOT.QHERE(I,THFPOS).OR.PROB(60,60).OR. 258*35973Sbostic& (and(OFLAG1(I),(VISIBT+TAKEBT)).NE.(VISIBT+TAKEBT))) 259*35973Sbostic& GO TO 1450 260*35973Sbostic CALL RSPSUB(590,ODESC2(I)) 261*35973SbosticC !TAKE OBJECT. 262*35973Sbostic IF(PROB(40,20)) GO TO 1700 263*35973Sbostic CALL NEWSTA(I,0,0,0,-THIEF) 264*35973SbosticC !MOST OF THE TIME. 265*35973Sbostic OFLAG2(I)=or(OFLAG2(I),TCHBT) 266*35973Sbostic GO TO 1700 267*35973Sbostic1450 CONTINUE 268*35973Sbostic GO TO 1700 269*35973SbosticC 270*35973Sbostic1500 DO 1550 I=1,OLNT 271*35973SbosticC !NOT IN MAZE. 272*35973Sbostic IF(.NOT.QHERE(I,THFPOS).OR.(OTVAL(I).NE.0).OR.PROB(80,60).OR. 273*35973Sbostic& (and(OFLAG1(I),(VISIBT+TAKEBT)).NE.(VISIBT+TAKEBT))) 274*35973Sbostic& GO TO 1550 275*35973Sbostic CALL NEWSTA(I,0,0,0,-THIEF) 276*35973Sbostic OFLAG2(I)=or(OFLAG2(I),TCHBT) 277*35973Sbostic GO TO 1700 278*35973Sbostic1550 CONTINUE 279*35973SbosticC 280*35973SbosticC NOW MOVE TO NEW ROOM. 281*35973SbosticC 282*35973Sbostic1700 IF(OADV(ROPE).EQ.-THIEF) DOMEF=.FALSE. 283*35973Sbostic IF(ONCE) GO TO 1800 284*35973Sbostic ONCE=.NOT.ONCE 285*35973Sbostic1750 THFPOS=THFPOS-1 286*35973SbosticC !NEXT ROOM. 287*35973Sbostic IF(THFPOS.LE.0) THFPOS=RLNT 288*35973Sbostic IF(and(RFLAG(THFPOS),(RLAND+RSACRD+REND)).NE.RLAND) 289*35973Sbostic& GO TO 1750 290*35973Sbostic THFFLG=.FALSE. 291*35973SbosticC !NOT ANNOUNCED. 292*35973Sbostic GO TO 1025 293*35973SbosticC !ONCE MORE. 294*35973SbosticC 295*35973SbosticC ALL DONE. 296*35973SbosticC 297*35973Sbostic1800 IF(THFPOS.EQ.TREAS) RETURN 298*35973SbosticC !IN TREASURE ROOM? 299*35973Sbostic J=591 300*35973SbosticC !NO, DROP STUFF. 301*35973Sbostic IF(THFPOS.NE.HERE) J=0 302*35973Sbostic DO 1850 I=1,OLNT 303*35973Sbostic IF((OADV(I).NE.-THIEF).OR.PROB(70,70).OR. 304*35973Sbostic& (OTVAL(I).GT.0)) GO TO 1850 305*35973Sbostic CALL NEWSTA(I,J,THFPOS,0,0) 306*35973Sbostic J=0 307*35973Sbostic1850 CONTINUE 308*35973Sbostic RETURN 309*35973SbosticC 310*35973Sbostic END 311