home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Usenet 1994 January
/
usenetsourcesnewsgroupsinfomagicjanuary1994.iso
/
sources
/
games
/
volume2
/
dungeon
/
part06
/
nrooms.F
< prev
next >
Wrap
Text File
|
1987-09-01
|
7KB
|
359 lines
C RAPPL2- SPECIAL PURPOSE ROOM ROUTINES, PART 2
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 RAPPL2(RI)
IMPLICIT INTEGER (A-Z)
LOGICAL QOPEN,QHERE
#include "parser.h"
#include "gamestate.h"
#include "state.h"
#include "io.h"
#include "rooms.h"
#include "rflag.h"
#include "rindex.h"
#include "objects.h"
#include "oflags.h"
#include "oindex.h"
#include "xsrch.h"
#include "clock.h"
#include "advers.h"
#include "verbs.h"
#include "flags.h"
C
C FUNCTIONS AND DATA
C
QOPEN(R)=and(OFLAG2(R),OPENBT).NE.0
DATA NEWRMS/38/
C RAPPL2, PAGE 2
C
RAPPL2=.TRUE.
GO TO (38000,39000,40000,41000,42000,43000,44000,
& 45000,46000,47000,48000,49000,50000,
& 51000,52000,53000,54000,55000,56000,
& 57000,58000,59000,60000),
& (RI-NEWRMS+1)
CALL BUG(70,RI)
RETURN
C
C R38-- MIRROR D ROOM
C
38000 IF(PRSA.EQ.LOOKW) CALL LOOKTO(FDOOR,MRG,0,682,681)
RETURN
C
C R39-- MIRROR G ROOM
C
39000 IF(PRSA.EQ.WALKIW) CALL JIGSUP(685)
RETURN
C
C R40-- MIRROR C ROOM
C
40000 IF(PRSA.EQ.LOOKW) CALL LOOKTO(MRG,MRB,683,0,681)
RETURN
C
C R41-- MIRROR B ROOM
C
41000 IF(PRSA.EQ.LOOKW) CALL LOOKTO(MRC,MRA,0,0,681)
RETURN
C
C R42-- MIRROR A ROOM
C
42000 IF(PRSA.EQ.LOOKW) CALL LOOKTO(MRB,0,0,684,681)
RETURN
C RAPPL2, PAGE 3
C
C R43-- MIRROR C EAST/WEST
C
43000 IF(PRSA.EQ.LOOKW) CALL EWTELL(HERE,683)
RETURN
C
C R44-- MIRROR B EAST/WEST
C
44000 IF(PRSA.EQ.LOOKW) CALL EWTELL(HERE,686)
RETURN
C
C R45-- MIRROR A EAST/WEST
C
45000 IF(PRSA.EQ.LOOKW) CALL EWTELL(HERE,687)
RETURN
C
C R46-- INSIDE MIRROR
C
46000 IF(PRSA.NE.LOOKW) RETURN
C !LOOK?
CALL RSPEAK(688)
C !DESCRIBE
C
C NOW DESCRIBE POLE STATE.
C
C CASES 1,2-- MDIR=270 & MLOC=MRB, POLE IS UP OR IN HOLE
C CASES 3,4-- MDIR=0 V MDIR=180, POLE IS UP OR IN CHANNEL
C CASE 5-- POLE IS UP
C
I=689
C !ASSUME CASE 5.
IF((MDIR.EQ.270).AND.(MLOC.EQ.MRB))
& I=690+MIN0(POLEUF,1)
IF(MOD(MDIR,180).EQ.0)
& I=692+MIN0(POLEUF,1)
CALL RSPEAK(I)
C !DESCRIBE POLE.
CALL RSPSUB(694,695+(MDIR/45))
C !DESCRIBE ARROW.
RETURN
C RAPPL2, PAGE 4
C
C R47-- MIRROR EYE ROOM
C
47000 IF(PRSA.NE.LOOKW) RETURN
C !LOOK?
I=704
C !ASSUME BEAM STOP.
DO 47100 J=1,OLNT
IF(QHERE(J,HERE).AND.(J.NE.RBEAM)) GO TO 47200
47100 CONTINUE
I=703
47200 CALL RSPSUB(I,ODESC2(J))
C !DESCRIBE BEAM.
CALL LOOKTO(MRA,0,0,0,0)
C !LOOK NORTH.
RETURN
C
C R48-- INSIDE CRYPT
C
48000 IF(PRSA.NE.LOOKW) RETURN
C !LOOK?
I=46
C !CRYPT IS OPEN/CLOSED.
IF(QOPEN(TOMB)) I=12
CALL RSPSUB(705,I)
RETURN
C
C R49-- SOUTH CORRIDOR
C
49000 IF(PRSA.NE.LOOKW) RETURN
C !LOOK?
CALL RSPEAK(706)
C !DESCRIBE.
I=46
C !ODOOR IS OPEN/CLOSED.
IF(QOPEN(ODOOR)) I=12
IF(LCELL.EQ.4) CALL RSPSUB(707,I)
C !DESCRIBE ODOOR IF THERE.
RETURN
C
C R50-- BEHIND DOOR
C
50000 IF(PRSA.NE.WALKIW) GO TO 50100
C !WALK IN?
CFLAG(CEVFOL)=.TRUE.
C !MASTER FOLLOWS.
CTICK(CEVFOL)=-1
RETURN
C
50100 IF(PRSA.NE.LOOKW) RETURN
C !LOOK?
I=46
C !QDOOR IS OPEN/CLOSED.
IF(QOPEN(QDOOR)) I=12
CALL RSPSUB(708,I)
RETURN
C RAPPL2, PAGE 5
C
C R51-- FRONT DOOR
C
51000 IF(PRSA.EQ.WALKIW) CTICK(CEVFOL)=0
C !IF EXITS, KILL FOLLOW.
IF(PRSA.NE.LOOKW) RETURN
C !LOOK?
CALL LOOKTO(0,MRD,709,0,0)
C !DESCRIBE SOUTH.
I=46
C !PANEL IS OPEN/CLOSED.
IF(INQSTF) I=12
C !OPEN IF INQ STARTED.
J=46
C !QDOOR IS OPEN/CLOSED.
IF(QOPEN(QDOOR)) J=12
CALL RSPSB2(710,I,J)
RETURN
C
C R52-- NORTH CORRIDOR
C
52000 IF(PRSA.NE.LOOKW) RETURN
C !LOOK?
I=46
IF(QOPEN(CDOOR)) I=12
C !CDOOR IS OPEN/CLOSED.
CALL RSPSUB(711,I)
RETURN
C
C R53-- PARAPET
C
53000 IF(PRSA.EQ.LOOKW) CALL RSPSUB(712,712+PNUMB)
RETURN
C
C R54-- CELL
C
54000 IF(PRSA.NE.LOOKW) RETURN
C !LOOK?
I=721
C !CDOOR IS OPEN/CLOSED.
IF(QOPEN(CDOOR)) I=722
CALL RSPEAK(I)
I=46
C !ODOOR IS OPEN/CLOSED.
IF(QOPEN(ODOOR)) I=12
IF(LCELL.EQ.4) CALL RSPSUB(723,I)
C !DESCRIBE.
RETURN
C
C R55-- PRISON CELL
C
55000 IF(PRSA.EQ.LOOKW) CALL RSPEAK(724)
C !LOOK?
RETURN
C
C R56-- NIRVANA CELL
C
56000 IF(PRSA.NE.LOOKW) RETURN
C !LOOK?
I=46
C !ODOOR IS OPEN/CLOSED.
IF(QOPEN(ODOOR)) I=12
CALL RSPSUB(725,I)
RETURN
C RAPPL2, PAGE 6
C
C R57-- NIRVANA AND END OF GAME
C
57000 IF(PRSA.NE.WALKIW) RETURN
C !WALKIN?
CALL RSPEAK(726)
CALL SCORE(.FALSE.)
C moved to exit routine CLOSE(DBCH)
CALL EXIT
C
C R58-- TOMB ROOM
C
58000 IF(PRSA.NE.LOOKW) RETURN
C !LOOK?
I=46
C !TOMB IS OPEN/CLOSED.
IF(QOPEN(TOMB)) I=12
CALL RSPSUB(792,I)
RETURN
C
C R59-- PUZZLE SIDE ROOM
C
59000 IF(PRSA.NE.LOOKW) RETURN
C !LOOK?
I=861
C !ASSUME DOOR CLOSED.
IF(CPOUTF) I=862
C !OPEN?
CALL RSPEAK(I)
C !DESCRIBE.
RETURN
C
C R60-- PUZZLE ROOM
C
60000 IF(PRSA.NE.LOOKW) RETURN
C !LOOK?
IF(CPUSHF) GO TO 60100
C !STARTED PUZZLE?
CALL RSPEAK(868)
C !NO, DESCRIBE.
IF(and(OFLAG2(WARNI),TCHBT).NE.0) CALL RSPEAK(869)
RETURN
C
60100 CALL CPINFO(880,CPHERE)
C !DESCRIBE ROOM.
RETURN
C
END
C LOOKTO-- DESCRIBE VIEW IN MIRROR HALLWAY
C
C DECLARATIONS
C
SUBROUTINE LOOKTO(NRM,SRM,NT,ST,HT)
IMPLICIT INTEGER(A-Z)
#include "gamestate.h"
#include "flags.h"
C LOOKTO, PAGE 2
C
CALL RSPEAK(HT)
C !DESCRIBE HALL.
CALL RSPEAK(NT)
C !DESCRIBE NORTH VIEW.
CALL RSPEAK(ST)
C !DESCRIBE SOUTH VIEW.
DIR=0
C !ASSUME NO DIRECTION.
IF(IABS(MLOC-HERE).NE.1) GO TO 200
C !MIRROR TO N OR S?
IF(MLOC.EQ.NRM) DIR=695
IF(MLOC.EQ.SRM) DIR=699
C !DIR=N/S.
IF(MOD(MDIR,180).NE.0) GO TO 100
C !MIRROR N-S?
CALL RSPSUB(847,DIR)
C !YES, HE SEES PANEL
CALL RSPSB2(848,DIR,DIR)
C !AND NARROW ROOMS.
GO TO 200
C
100 M1=MRHERE(HERE)
C !WHICH MIRROR?
MRBF=0
C !ASSUME INTACT.
IF(((M1.EQ.1).AND..NOT.MR1F).OR.
& ((M1.EQ.2).AND..NOT.MR2F)) MRBF=1
CALL RSPSUB(849+MRBF,DIR)
C !DESCRIBE.
IF((M1.EQ.1).AND.MROPNF) CALL RSPEAK(823+MRBF)
IF(MRBF.NE.0) CALL RSPEAK(851)
C
200 I=0
C !ASSUME NO MORE TO DO.
IF((NT.EQ.0).AND.((DIR.EQ.0).OR.(DIR.EQ.699))) I=852
IF((ST.EQ.0).AND.((DIR.EQ.0).OR.(DIR.EQ.695))) I=853
IF((NT+ST+DIR).EQ.0) I=854
IF(HT.NE.0) CALL RSPEAK(I)
C !DESCRIBE HALLS.
RETURN
C
END
C EWTELL-- DESCRIBE E/W NARROW ROOMS
C
C DECLARATIONS
C
SUBROUTINE EWTELL(RM,ST)
IMPLICIT INTEGER(A-Z)
LOGICAL M1
C
C ROOMS
#include "rindex.h"
#include "flags.h"
C EWTELL, PAGE 2
C
C NOTE THAT WE ARE EAST OR WEST OF MIRROR, AND
C MIRROR MUST BE N-S.
C
M1=(MDIR+(MOD(RM-MRAE,2)*180)).EQ.180
I=819+MOD(RM-MRAE,2)
C !GET BASIC E/W STRING.
IF((M1.AND..NOT.MR1F).OR.(.NOT.M1.AND..NOT.MR2F))
& I=I+2
CALL RSPEAK(I)
IF(M1.AND.MROPNF) CALL RSPEAK(823+((I-819)/2))
CALL RSPEAK(825)
CALL RSPEAK(ST)
RETURN
C
END