1*35973SbosticC GAME- MAIN COMMAND LOOP FOR DUNGEON 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 SUBROUTINE GAME 10*35973Sbostic IMPLICIT INTEGER (A-Z) 11*35973Sbostic LOGICAL RMDESC,VAPPLI,RAPPLI,AAPPLI 12*35973Sbostic LOGICAL F,PARSE,FINDXT,XVEHIC,LIT 13*35973Sbostic CHARACTER SECHO(4) 14*35973Sbostic CHARACTER GDTSTR(3) 15*35973Sbostic#include "parser.h" 16*35973Sbostic#include "gamestate.h" 17*35973Sbostic#include "state.h" 18*35973Sbostic#include "io.h" 19*35973Sbostic#include "rooms.h" 20*35973Sbostic#include "rindex.h" 21*35973Sbostic#include "objects.h" 22*35973Sbostic#include "oflags.h" 23*35973Sbostic#include "oindex.h" 24*35973Sbostic#include "advers.h" 25*35973Sbostic#include "verbs.h" 26*35973Sbostic#include "flags.h" 27*35973SbosticC 28*35973SbosticC FUNCTIONS AND DATA 29*35973SbosticC 30*35973Sbostic DATA SECHO/'E','C','H','O'/ 31*35973Sbostic DATA GDTSTR/'G','D','T'/ 32*35973SbosticC GAME, PAGE 2 33*35973SbosticC 34*35973SbosticC START UP, DESCRIBE CURRENT LOCATION. 35*35973SbosticC 36*35973Sbostic CALL RSPEAK(1) 37*35973SbosticC !WELCOME ABOARD. 38*35973Sbostic F=RMDESC(3) 39*35973SbosticC !START GAME. 40*35973SbosticC 41*35973SbosticC NOW LOOP, READING AND EXECUTING COMMANDS. 42*35973SbosticC 43*35973Sbostic100 WINNER=PLAYER 44*35973SbosticC !PLAYER MOVING. 45*35973Sbostic TELFLG=.FALSE. 46*35973SbosticC !ASSUME NOTHING TOLD. 47*35973Sbostic IF(PRSCON.LE.1) CALL RDLINE(INBUF,INLNT,1) 48*35973SbosticC 49*35973Sbostic DO 150 I=1,3 50*35973SbosticC !CALL ON GDT? 51*35973Sbostic IF(INBUF(I+PRSCON-1).NE.GDTSTR(I)) GO TO 200 52*35973Sbostic150 CONTINUE 53*35973Sbostic CALL GDT 54*35973SbosticC !YES, INVOKE. 55*35973Sbostic GO TO 100 56*35973SbosticC !ONWARD. 57*35973SbosticC 58*35973Sbostic200 MOVES=MOVES+1 59*35973Sbostic PRSWON=PARSE(INBUF,INLNT,.TRUE.) 60*35973Sbostic IF(.NOT.PRSWON) GO TO 400 61*35973SbosticC !PARSE LOSES? 62*35973Sbostic IF(XVEHIC(1)) GO TO 400 63*35973SbosticC !VEHICLE HANDLE? 64*35973SbosticC 65*35973Sbostic IF(PRSA.EQ.TELLW) GO TO 2000 66*35973SbosticC !TELL? 67*35973Sbostic300 IF((PRSO.EQ.VALUA).OR.(PRSO.EQ.EVERY)) GO TO 900 68*35973Sbostic IF(.NOT.VAPPLI(PRSA)) GO TO 400 69*35973SbosticC !VERB OK? 70*35973Sbostic350 IF(.NOT.ECHOF.AND.(HERE.EQ.ECHOR)) GO TO 1000 71*35973Sbostic F=RAPPLI(RACTIO(HERE)) 72*35973SbosticC 73*35973Sbostic400 CALL XENDMV(TELFLG) 74*35973SbosticC !DO END OF MOVE. 75*35973Sbostic IF(.NOT.LIT(HERE)) PRSCON=1 76*35973Sbostic GO TO 100 77*35973SbosticC 78*35973Sbostic900 CALL VALUAC(VALUA) 79*35973Sbostic GO TO 350 80*35973SbosticC GAME, PAGE 3 81*35973SbosticC 82*35973SbosticC SPECIAL CASE-- ECHO ROOM. 83*35973SbosticC IF INPUT IS NOT 'ECHO' OR A DIRECTION, JUST ECHO. 84*35973SbosticC 85*35973Sbostic1000 CALL RDLINE(INBUF,INLNT,0) 86*35973Sbostic MOVES=MOVES+1 87*35973SbosticC !CHARGE FOR MOVES. 88*35973Sbostic DO 1100 I=1,4 89*35973SbosticC !INPUT = ECHO? 90*35973Sbostic IF(INBUF(I).NE.SECHO(I)) GO TO 1300 91*35973Sbostic1100 CONTINUE 92*35973SbosticC 93*35973SbosticC Note: the following DO loop was changed from DO 1200 I=5,78 94*35973SbosticC The change was necessary because the RDLINE function was changed, 95*35973SbosticC and no longer provides a 78 character buffer padded with blanks. 96*35973SbosticC 97*35973Sbostic DO 1200 I=5,INLNT 98*35973Sbostic IF(INBUF(I).NE.' ') GO TO 1300 99*35973Sbostic1200 CONTINUE 100*35973SbosticC 101*35973Sbostic CALL RSPEAK(571) 102*35973SbosticC !KILL THE ECHO. 103*35973Sbostic ECHOF=.TRUE. 104*35973Sbostic OFLAG2(BAR)=and(OFLAG2(BAR), not(SCRDBT)) 105*35973Sbostic PRSWON=.TRUE. 106*35973SbosticC !FAKE OUT PARSER. 107*35973Sbostic PRSCON=1 108*35973SbosticC !FORCE NEW INPUT. 109*35973Sbostic GO TO 400 110*35973SbosticC 111*35973Sbostic1300 PRSWON=PARSE(INBUF,INLNT,.FALSE.) 112*35973Sbostic IF(.NOT.PRSWON .OR. (PRSA.NE.WALKW)) 113*35973Sbostic& GO TO 1400 114*35973Sbostic IF(FINDXT(PRSO,HERE)) GO TO 300 115*35973SbosticC !VALID EXIT? 116*35973SbosticC 117*35973Sbostic#ifdef PDP 118*35973Sbostic1400 call outstr(INBUF, INLNT) 119*35973Sbostic#else 120*35973Sbostic1400 WRITE(OUTCH,1410) (INBUF(J),J=1,INLNT) 121*35973Sbostic#ifdef NOCC 122*35973Sbostic1410 FORMAT(78A1) 123*35973Sbostic#else NOCC 124*35973Sbostic1410 FORMAT(1X,78A1) 125*35973Sbostic#endif NOCC 126*35973Sbostic#endif PDP 127*35973Sbostic TELFLG=.TRUE. 128*35973SbosticC !INDICATE OUTPUT. 129*35973Sbostic GO TO 1000 130*35973SbosticC !MORE ECHO ROOM. 131*35973SbosticC GAME, PAGE 4 132*35973SbosticC 133*35973SbosticC SPECIAL CASE-- TELL <ACTOR>, NEW COMMAND 134*35973SbosticC NOTE THAT WE CANNOT BE IN THE ECHO ROOM. 135*35973SbosticC 136*35973Sbostic2000 IF(and(OFLAG2(PRSO),ACTRBT).NE.0) GO TO 2100 137*35973Sbostic CALL RSPEAK(602) 138*35973SbosticC !CANT DO IT. 139*35973Sbostic GO TO 350 140*35973SbosticC !VAPPLI SUCCEEDS. 141*35973SbosticC 142*35973Sbostic2100 WINNER=OACTOR(PRSO) 143*35973SbosticC !NEW PLAYER. 144*35973Sbostic HERE=AROOM(WINNER) 145*35973SbosticC !NEW LOCATION. 146*35973Sbostic IF(PRSCON.LE.1) GO TO 2700 147*35973SbosticC !ANY INPUT? 148*35973Sbostic IF(PARSE(INBUF,INLNT,.TRUE.)) GO TO 2150 149*35973Sbostic2700 I=341 150*35973SbosticC !FAILS. 151*35973Sbostic IF(TELFLG) I=604 152*35973SbosticC !GIVE RESPONSE. 153*35973Sbostic CALL RSPEAK(I) 154*35973Sbostic2600 WINNER=PLAYER 155*35973SbosticC !RESTORE STATE. 156*35973Sbostic HERE=AROOM(WINNER) 157*35973Sbostic GO TO 350 158*35973SbosticC 159*35973Sbostic2150 IF(AAPPLI(AACTIO(WINNER))) GO TO 2400 160*35973SbosticC !ACTOR HANDLE? 161*35973Sbostic IF(XVEHIC(1)) GO TO 2400 162*35973SbosticC !VEHICLE HANDLE? 163*35973Sbostic IF((PRSO.EQ.VALUA).OR.(PRSO.EQ.EVERY)) GO TO 2900 164*35973Sbostic IF(.NOT.VAPPLI(PRSA)) GO TO 2400 165*35973SbosticC !VERB HANDLE? 166*35973Sbostic2350 F=RAPPLI(RACTIO(HERE)) 167*35973SbosticC 168*35973Sbostic2400 CALL XENDMV(TELFLG) 169*35973SbosticC !DO END OF MOVE. 170*35973Sbostic GO TO 2600 171*35973SbosticC !DONE. 172*35973SbosticC 173*35973Sbostic2900 CALL VALUAC(VALUA) 174*35973SbosticC !ALL OR VALUABLES. 175*35973Sbostic GO TO 350 176*35973SbosticC 177*35973Sbostic END 178*35973SbosticC XENDMV- EXECUTE END OF MOVE FUNCTIONS. 179*35973SbosticC 180*35973SbosticC DECLARATIONS 181*35973SbosticC 182*35973Sbostic SUBROUTINE XENDMV(FLAG) 183*35973Sbostic IMPLICIT INTEGER(A-Z) 184*35973Sbostic LOGICAL F,CLOCKD,FLAG,XVEHIC 185*35973Sbostic#include "parser.h" 186*35973Sbostic#include "villians.h" 187*35973SbosticC 188*35973Sbostic IF(.NOT.FLAG) CALL RSPEAK(341) 189*35973SbosticC !DEFAULT REMARK. 190*35973Sbostic IF(THFACT) CALL THIEFD 191*35973SbosticC !THIEF DEMON. 192*35973Sbostic IF(PRSWON) CALL FIGHTD 193*35973SbosticC !FIGHT DEMON. 194*35973Sbostic IF(SWDACT) CALL SWORDD 195*35973SbosticC !SWORD DEMON. 196*35973Sbostic IF(PRSWON) F=CLOCKD(X) 197*35973SbosticC !CLOCK DEMON. 198*35973Sbostic IF(PRSWON) F=XVEHIC(2) 199*35973SbosticC !VEHICLE READOUT. 200*35973Sbostic RETURN 201*35973Sbostic END 202*35973SbosticC XVEHIC- EXECUTE VEHICLE FUNCTION 203*35973SbosticC 204*35973SbosticC DECLARATIONS 205*35973SbosticC 206*35973Sbostic LOGICAL FUNCTION XVEHIC(N) 207*35973Sbostic IMPLICIT INTEGER(A-Z) 208*35973Sbostic LOGICAL OAPPLI 209*35973Sbostic#include "gamestate.h" 210*35973Sbostic#include "objects.h" 211*35973Sbostic#include "advers.h" 212*35973SbosticC 213*35973Sbostic XVEHIC=.FALSE. 214*35973SbosticC !ASSUME LOSES. 215*35973Sbostic AV=AVEHIC(WINNER) 216*35973SbosticC !GET VEHICLE. 217*35973Sbostic IF(AV.NE.0) XVEHIC=OAPPLI(OACTIO(AV),N) 218*35973Sbostic RETURN 219*35973Sbostic END 220