C OAPPLI- OBJECT SPECIAL ACTION ROUTINES
C COPYRIGHT 1980, INFOCOM COMPUTERS AND COMMUNICATIONS, CAMBRIDGE MA. 02142
C ALL RIGHTS RESERVED, COMMERCIAL USAGE STRICTLY PROHIBITED
C WRITTEN BY R. M. SUPNIK
LOGICAL FUNCTION OAPPLI(RI,ARG)
LOGICAL MOVETO,RMDESC,CLOCKD
LOGICAL THIEFP,CYCLOP,TROLLP,BALLOP,LIGHTP
LOGICAL QEMPTY,QHERE,F,OPNCLS
COMMON /PUZZLE/ CPDR(16),CPWL(8),CPVEC(64)
QOPEN(R)=and(OFLAG2(R),OPENBT).NE.0
QON(R)=and(OFLAG1(R),ONBT).NE.0
IF(RI.LE.MXSMP) GO TO 100
IF(PRSO.NE.0) ODO2=ODESC2(PRSO)
5 IF(PRSI.NE.0) ODI2=ODESC2(PRSI)
FLOBTS=FLAMBT+LITEBT+ONBT
GO TO (2000,5000,10000,11000,12000,15000,18000,
& 19000,20000,22000,25000,26000,32000,35000,39000,40000,
& 45000,47000,48000,49000,50000,51000,52000,54000,55000,
& 56000,57000,58000,59000,60000,61000,62000),
C RETURN HERE TO DECLARE FALSE RESULT
C SIMPLE OBJECTS, PROCESSED EXTERNALLY.
100 IF(RI.LT.32) OAPPLI=SOBJS(RI,ARG)
IF(RI.GE.32) OAPPLI=NOBJS(RI,ARG)
C O100-- MACHINE FUNCTION
2000 IF(HERE.NE.MMACH) GO TO 10
OAPPLI=OPNCLS(MACHI,123,124)
5000 IF(PRSA.NE.FILLW) GO TO 5050
5050 IF((PRSO.EQ.WATER).OR.(PRSO.EQ.GWATE)) GO TO 5100
5100 IF(PRSA.NE.TAKEW) GO TO 5400
IF((OADV(BOTTL).EQ.WINNER).AND.(OCAN(PRSO).NE.BOTTL))
IF(OCAN(PRSO).EQ.0) GO TO 5200
IF(QOPEN(OCAN(PRSO))) GO TO 5200
CALL RSPEAK(525,ODESC2(OCAN(PRSO)))
5400 IF(PRSA.NE.PUTW) GO TO 5700
IF((AV.NE.0).AND.(PRSI.EQ.AV)) GO TO 5800
IF(PRSI.EQ.BOTTL) GO TO 5500
CALL NEWSTA(PRSO,0,0,0,0)
5500 IF(QOPEN(BOTTL)) GO TO 5550
5550 IF(QEMPTY(BOTTL)) GO TO 5600
5600 CALL NEWSTA(WATER,614,0,BOTTL,0)
5700 IF((PRSA.NE.DROPW).AND.(PRSA.NE.POURW).AND.
& (PRSA.NE.GIVEW)) GO TO 5900
CALL NEWSTA(PRSO,133,0,0,0)
5800 CALL NEWSTA(WATER,0,0,AV,0)
CALL RSPSUB(296,ODESC2(AV))
5900 IF(PRSA.NE.THROWW) GO TO 10
CALL NEWSTA(PRSO,132,0,0,0)
10000 IF(PRSA.NE.BURNW) GO TO 10500
IF(OROOM(PRSO).EQ.0) GO TO 10100
CALL NEWSTA(PRSO,158,0,0,0)
10100 CALL NEWSTA(PRSO,0,HERE,0,0)
10500 IF(PRSA.NE.MOVEW) GO TO 10600
10600 IF((PRSA.NE.LOOKUW).OR.(RVCLR.NE.0)) GO TO 10
C O103-- TROLL, DONE EXTERNALLY.
12000 IF(PRSA.NE.TAKEW) GO TO 12100
IF(OADV(SWORD).EQ.WINNER) CALL RSPEAK(160)
12100 IF((((PRSA.NE.ATTACW).AND.(PRSA.NE.KILLW)).OR.
& (((PRSA.NE.SWINGW).AND.(PRSA.NE.THROWW)).OR.
& (PRSO.NE.RKNIF))) GO TO 10
CALL NEWSTA(RKNIF,0,0,0,0)
15000 IF(PRSA.NE.THROWW) GO TO 15500
IF(PRSO.NE.TORCH) GO TO 15400
CALL NEWSTA(ICE,169,0,0,0)
OFLAG1(TORCH)=and(OFLAG1(TORCH), not(FLOBTS))
CALL NEWSTA(TORCH,0,STREA,0,0)
IF(.NOT.LIT(HERE)) CALL RSPEAK(170)
15500 IF((PRSA.NE.MELTW).OR.(PRSO.NE.ICE)) GO TO 10
IF(and(OFLAG1(PRSI),FLOBTS).EQ.FLOBTS) GO TO 15600
IF(PRSI.NE.TORCH) GO TO 15700
OFLAG1(TORCH)=and(OFLAG1(TORCH), not(FLOBTS))
18000 IF(PRSA.NE.OPENW) GO TO 18100
18100 IF(PRSA.NE.CLOSEW) GO TO 18200
18200 IF(PRSA.NE.BURNW) GO TO 10
CALL NEWSTA(PRSO,0,0,0,0)
C O107-- CANDLES, PROCESSED EXTERNALLY
19000 OAPPLI=LIGHTP(CANDL)
C O108-- MATCHES, PROCESSED EXTERNALLY
20000 OAPPLI=LIGHTP(MATCH)
C O109-- CYCLOPS, PROCESSED EXTERNALLY.
C O110-- THIEF, PROCESSED EXTERNALLY
26000 OAPPLI=OPNCLS(WINDO,208,209)
32000 IF(PRSA.NE.TAKEW) GO TO 32500
32500 IF((PRSA.NE.BURNW).AND.(PRSA.NE.MUNGW)) GO TO 10
CALL NEWSTA(HPOLE,0,LLD2,0,0)
F=MOVETO(BATDRP(RND(9)+1),WINNER)
39000 IF(PRSA.NE.WAVEW) GO TO 10
IF(HERE.EQ.MRAIN) GO TO 39500
IF((HERE.EQ.POG).OR.(HERE.EQ.FALLS)) GO TO 39200
39200 OFLAG1(POT)=or(OFLAG1(POT),VISIBT)
C O115-- BALLOON, HANDLED EXTERNALLY
45000 IF(PRSA.NE.HELLOW) GO TO 45100
45100 IF(PRSA.EQ.READW) GO TO 10
CALL NEWSTA(LCASE,260,LROOM,0,0)
I=ROBADV(WINNER,0,LCASE,0)+ROBRM(HERE,100,0,LCASE,0)
47000 IF(CAGESF.OR.(PRSA.NE.TAKEW)) GO TO 10
IF(WINNER.NE.PLAYER) GO TO 47500
IF(OROOM(ROBOT).NE.HERE) GO TO 47200
CALL NEWSTA(ROBOT,0,CAGED,0,0)
OFLAG1(ROBOT)=or(OFLAG1(ROBOT),NDSCBT)
C !GET OUT IN 10 OR ELSE.
47200 CALL NEWSTA(SPHER,0,0,0,0)
RFLAG(CAGER)=or(RFLAG(CAGER),RMUNG)
47500 CALL NEWSTA(SPHER,0,0,0,0)
CALL NEWSTA(ROBOT,264,0,0,0)
CALL NEWSTA(CAGE,0,HERE,0,0)
C O118-- GEOMETRICAL BUTTONS
48000 IF(PRSA.NE.PUSHW) GO TO 10
IF((I.LE.0).OR.(I.GE.4)) GO TO 10
IF(WINNER.NE.PLAYER) GO TO (48100,48200,48300),I
IF(.NOT.QHERE(IRBOX,CAROU)) RETURN
OFLAG1(IRBOX)=xor(OFLAG1(IRBOX),VISIBT)
IF(CAROFF) RFLAG(CAROU)=and(RFLAG(CAROU), not(RSEEN))
49000 IF(PRSA.EQ.OPENW) GO TO 49100
IF((PRSA.NE.MUNGW).AND.(PRSA.NE.THROWW)) GO TO 10
CALL NEWSTA(FLASK,270,0,0,0)
49100 RFLAG(HERE)=or(RFLAG(HERE),RMUNG)
50000 IF(ARG.NE.2) GO TO 10
IF((OCAN(WATER).NE.BUCKE).OR.BUCKTF) GO TO 50500
CALL NEWSTA(BUCKE,290,TWELL,0,0)
50500 IF((OCAN(WATER).EQ.BUCKE).OR..NOT.BUCKTF) GO TO 10
CALL NEWSTA(BUCKE,291,BWELL,0,0)
50900 IF(AV.NE.BUCKE) RETURN
F=MOVETO(OROOM(BUCKE),WINNER)
51000 IF((PRSA.NE.EATW).OR.(PRSO.NE.ECAKE).OR.
& (HERE.NE.ALICE)) GO TO 10
CALL NEWSTA(ECAKE,273,0,0,0)
OFLAG1(ROBOT)=and(OFLAG1(ROBOT), not(VISIBT))
OAPPLI=MOVETO(ALISM,WINNER)
52000 IF(PRSA.NE.READW) GO TO 52200
IF(PRSI.EQ.FLASK) I=277+(PRSO-ORICE)
52200 IF((PRSA.NE.THROWW).OR.(PRSO.NE.RDICE).OR.(PRSI.NE.POOL))
CALL NEWSTA(POOL,280,0,0,0)
OFLAG1(SAFFR)=or(OFLAG1(SAFFR),VISIBT)
52300 IF((HERE.NE.ALICE).AND.(HERE.NE.ALISM).AND.(HERE.NE.ALITR))
IF(((PRSA.NE.EATW).AND.(PRSA.NE.THROWW)).OR.
& (PRSO.NE.ORICE)) GO TO 52400
CALL NEWSTA(ORICE,0,0,0,0)
RFLAG(HERE)=or(RFLAG(HERE),RMUNG)
52400 IF((PRSA.NE.EATW).OR.(PRSO.NE.BLICE))
CALL NEWSTA(BLICE,283,0,0,0)
IF(HERE.NE.ALISM) GO TO 52500
OFLAG1(ROBOT)=or(OFLAG1(ROBOT),VISIBT)
OAPPLI=MOVETO(ALICE,WINNER)
C Do a size change, common loop used also by code at 51000
IF((OROOM(I).NE.IO).OR.(OSIZE(I).EQ.10000))
C !ENLARGED IN WRONG ROOM.
54000 IF(PRSA.NE.BURNW) GO TO 10
55000 IF(PRSA.NE.GIVEW) GO TO 55100
CALL NEWSTA(PRSO,2,0,0,PLAYER)
55100 IF(PRSA.NE.TAKEW) GO TO 55200
55200 IF((PRSA.NE.KILLW).AND.(PRSA.NE.MUNGW)) GO TO 10
C O125-- PANELS INSIDE MIRROR
56000 IF(PRSA.NE.PUSHW) GO TO 10
IF(POLEUF.NE.0) GO TO 56100
IF(MOD(MDIR,180).EQ.0) I=732
56100 IF(MLOC.NE.MRG) GO TO 56200
IF((PRSO.EQ.RDWAL).OR.(PRSO.EQ.YLWAL)) I=830
MDIR=MOD(MDIR+45+(270*(I-830)),360)
CALL RSPSUB(734,695+(MDIR/45))
IF(WDOPNF) CALL RSPEAK(730)
C O126-- ENDS INSIDE MIRROR
57000 IF(PRSA.NE.PUSHW) GO TO 10
IF(MOD(MDIR,180).EQ.0) GO TO 57100
57100 IF(PRSO.NE.PINDR) GO TO 57300
IF(((MLOC.EQ.MRC).AND.(MDIR.EQ.180)).OR.
& ((MLOC.EQ.MRD).AND.(MDIR.EQ.0)).OR.
& (MLOC.EQ.MRG)) GO TO 57200
IF(MDIR.EQ.0) NLOC=MLOC+1
IF((NLOC.GE.MRA).AND.(NLOC.LE.MRD)) GO TO 57400
IF(POLEUF.NE.0) GO TO 57500
IF(MROPNF.OR.WDOPNF) GO TO 57600
C O127-- GLOBAL GUARDIANS
58000 IF((PRSA.NE.ATTACW).AND.(PRSA.NE.KILLW).AND.
& (PRSA.NE.MUNGW)) GO TO 58100
58100 IF(PRSA.NE.HELLOW) GO TO 10
59000 IF((PRSA.NE.ATTACW).AND.(PRSA.NE.KILLW).AND.
& (PRSA.NE.MUNGW)) GO TO 59100
59100 IF(PRSA.NE.TAKEW) GO TO 10
C O129-- NUMERAL FIVE (FOR JOKE)
60000 IF(PRSA.NE.TAKEW) GO TO 10
61000 IF(.NOT.ENDGMF) GO TO 45000
IF(PRSA.NE.OPENW) GO TO 61100
OFLAG2(TOMB)=or(OFLAG2(TOMB),OPENBT)
61100 IF(PRSA.NE.CLOSEW) GO TO 45000
OFLAG2(TOMB)=and(OFLAG2(TOMB),not(OPENBT))
IF(HERE.EQ.CRYPT) CTICK(CEVSTE)=3
C !IF IN CRYPT, START EG.
62000 IF((CPVEC(CPHERE+1).EQ.-2).OR.(CPVEC(CPHERE-1).EQ.-3))
62100 IF((PRSA.EQ.CLMBW).OR.(PRSA.EQ.CLMBUW)) GO TO 62200
62200 IF((CPHERE.EQ.10).AND.(CPVEC(CPHERE+1).EQ.-2))
62300 F=MOVETO(CPANT,WINNER)