4.4BSD/usr/src/contrib/dungeon/rooms.F

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