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

C TROLLP-	TROLL FUNCTION
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 TROLLP(ARG)
	IMPLICIT INTEGER (A-Z)
	LOGICAL QHERE,PROB
#include "parser.h"
#include "gamestate.h"
#include "objects.h"
#include "oflags.h"
#include "oindex.h"
#include "verbs.h"
#include "flags.h"
C TROLLP, PAGE 2
C
	TROLLP=.TRUE.
C						!ASSUME WINS.
	IF(PRSA.NE.FIGHTW) GO TO 1100
C						!FIGHT?
	IF(OCAN(AXE).EQ.TROLL) GO TO 10
C						!GOT AXE?  NOTHING.
	I=433
C						!ASSUME CANT GET.
	IF(.NOT.QHERE(AXE,HERE)) GO TO 1050
C						!HERE?
	I=434
C						!YES, RECOVER.
	CALL NEWSTA(AXE,0,0,TROLL,0)
1050	IF(QHERE(TROLL,HERE)) CALL RSPEAK(I)
C						!IF PLAYER HERE.
	RETURN
C
1100	IF(PRSA.NE.DEADXW) GO TO 1200
C						!DEAD?
	TROLLF=.TRUE.
C						!PERMIT EXITS.
	RETURN
C
1200	IF(PRSA.NE.OUTXW) GO TO 1300
C						!OUT?
	TROLLF=.TRUE.
C						!PERMIT EXITS.
	OFLAG1(AXE)=and(OFLAG1(AXE), not(VISIBT))
	ODESC1(TROLL)=435
C						!TROLL OUT.
	RETURN
C
1300	IF(PRSA.NE.INXW) GO TO 1400
C						!WAKE UP?
	TROLLF=.FALSE.
C						!FORBID EXITS.
	OFLAG1(AXE)=or(OFLAG1(AXE),VISIBT)
	ODESC1(TROLL)=436
C						!TROLL IN.
	IF(QHERE(TROLL,HERE)) CALL RSPEAK(437)
	RETURN
C
1400	IF(PRSA.NE.FRSTQW) GO TO 1500
C						!FIRST ENCOUNTER?
	TROLLP=PROB(33,66)
C						!33% TRUE UNLESS BADLK.
	RETURN
C
1500	IF((PRSA.NE.MOVEW).AND.(PRSA.NE.TAKEW).AND.(PRSA.NE.MUNGW)
&		.AND.(PRSA.NE.THROWW).AND.(PRSA.NE.GIVEW)) GO TO 2000
	IF(OCAPAC(TROLL).GE.0) GO TO 1550
C						!TROLL OUT?
	OCAPAC(TROLL)=-OCAPAC(TROLL)
C						!YES, WAKE HIM.
	OFLAG1(AXE)=or(OFLAG1(AXE),VISIBT)
	TROLLF=.FALSE.
	ODESC1(TROLL)=436
	CALL RSPEAK(437)
C
1550	IF((PRSA.NE.TAKEW).AND.(PRSA.NE.MOVEW)) GO TO 1600
	CALL RSPEAK(438)
C						!JOKE.
	RETURN
C
1600	IF(PRSA.NE.MUNGW) GO TO 1700
C						!MUNG?
	CALL RSPEAK(439)
C						!JOKE.
	RETURN
C
1700	IF(PRSO.EQ.0) GO TO 10
C						!NO OBJECT?
	I=440
C						!ASSUME THROW.
	IF(PRSA.EQ.GIVEW) I=441
C						!GIVE?
	CALL RSPSUB(I,ODESC2(PRSO))
C						!TROLL TAKES.
	IF(PRSO.EQ.KNIFE) GO TO 1900
C						!OBJ KNIFE?
	CALL NEWSTA(PRSO,442,0,0,0)
C						!NO, EATS IT.
	RETURN
C
1900	CALL RSPEAK(443)
C						!KNIFE, THROWS IT BACK
	OFLAG2(TROLL)=or(OFLAG2(TROLL),FITEBT)
	RETURN
C
2000	IF(.NOT.TROLLF.OR.(PRSA.NE.HELLOW)) GO TO 10
	CALL RSPEAK(366)
C						!TROLL OUT.
	RETURN
C
10	TROLLP=.FALSE.
C						!COULDNT HANDLE IT.
	RETURN
	END
C CYCLOP-	CYCLOPS FUNCTION
C
C DECLARATIONS
C
	LOGICAL FUNCTION CYCLOP(ARG)
	IMPLICIT INTEGER (A-Z)
#include "parser.h"
#include "gamestate.h"
#include "objects.h"
#include "oflags.h"
#include "oindex.h"
#include "verbs.h"
#include "flags.h"
C CYCLOP, PAGE 2
C
	CYCLOP=.TRUE.
C						!ASSUME WINS.
	IF(.NOT.CYCLOF) GO TO 100
C						!ASLEEP?
	IF((PRSA.NE.ALARMW).AND.(PRSA.NE.MUNGW).AND.(PRSA.NE.HELLOW).AND.
&		(PRSA.NE.BURNW).AND.(PRSA.NE.KILLW).AND.(PRSA.NE.ATTACW))
&		 GO TO 10
	CYCLOF=.FALSE.
C						!WAKE CYCLOPS.
	CALL RSPEAK(187)
C						!DESCRIBE.
	RVCYC=IABS(RVCYC)
	OFLAG2(CYCLO)=and(or(OFLAG2(CYCLO),FITEBT),not(SLEPBT))
	RETURN
C
100	IF((PRSA.EQ.FIGHTW).OR.(PRSA.EQ.FRSTQW)) GO TO 10
	IF(IABS(RVCYC).LE.5) GO TO 200
C						!ANNOYED TOO MUCH?
	RVCYC=0
C						!RESTART COUNT.
	CALL JIGSUP(188)
C						!YES, EATS PLAYER.
	RETURN
C
200	IF(PRSA.NE.GIVEW) GO TO 500
C						!GIVE?
	IF((PRSO.NE.FOOD).OR.(RVCYC.LT.0)) GO TO 300
C						!FOOD WHEN HUNGRY?
	CALL NEWSTA(FOOD,189,0,0,0)
C						!EATS PEPPERS.
	RVCYC=MIN0(-1,-RVCYC)
C						!GETS THIRSTY.
	RETURN
C
300	IF(PRSO.NE.WATER) GO TO 400
C						!DRINK WHEN THIRSTY?
	IF(RVCYC.GE.0) GO TO 350
	CALL NEWSTA(PRSO,190,0,0,0)
C						!DRINKS AND
	CYCLOF=.TRUE.
C						!FALLS ASLEEP.
	OFLAG2(CYCLO)=and(or(OFLAG2(CYCLO),SLEPBT),not(FITEBT))
	RETURN
C
350	CALL RSPEAK(191)
C						!NOT THIRSTY.
10	CYCLOP=.FALSE.
C						!FAILS.
	RETURN
C
400	I=192
C						!ASSUME INEDIBLE.
	IF(PRSO.EQ.GARLI) I=193
C						!GARLIC IS JOKE.
450	CALL RSPEAK(I)
C						!DISDAIN IT.
	IF(RVCYC.LT.0) RVCYC=RVCYC-1
	IF(RVCYC.GE.0) RVCYC=RVCYC+1
	IF(.NOT.CYCLOF) CALL RSPEAK(193+IABS(RVCYC))
	RETURN
C
500	I=0
C						!ASSUME NOT HANDLED.
	IF(PRSA.EQ.HELLOW) GO TO 450
C						!HELLO IS NO GO.
	IF((PRSA.EQ.THROWW).OR.(PRSA.EQ.MUNGW)) I=200+RND(2)
	IF(PRSA.EQ.TAKEW) I=202
	IF(PRSA.EQ.TIEW) I=203
	IF(I) 10,10,450
C						!SEE IF HANDLED.
C
	END
C THIEFP-	THIEF FUNCTION
C
C DECLARATIONS
C
	LOGICAL FUNCTION THIEFP(ARG)
	IMPLICIT INTEGER (A-Z)
	LOGICAL QHERE,PROB
#include "parser.h"
#include "gamestate.h"
C
C ROOMS
#include "rindex.h"
#include "objects.h"
#include "oflags.h"
#include "oindex.h"
#include "clock.h"

#include "villians.h"
#include "verbs.h"
#include "flags.h"
C THIEFP, PAGE 2
C
	THIEFP=.TRUE.
C						!ASSUME WINS.
	IF(PRSA.NE.FIGHTW) GO TO 100
C						!FIGHT?
	IF(OCAN(STILL).EQ.THIEF) GO TO 10
C						!GOT STILLETTO?  F.
	IF(QHERE(STILL,THFPOS)) GO TO 50
C						!CAN HE RECOVER IT?
	CALL NEWSTA(THIEF,0,0,0,0)
C						!NO, VANISH.
	IF(QHERE(THIEF,HERE)) CALL RSPEAK(498)
C						!IF HERO, TELL.
	RETURN
C
50	CALL NEWSTA(STILL,0,0,THIEF,0)
C						!YES, RECOVER.
	IF(QHERE(THIEF,HERE)) CALL RSPEAK(499)
C						!IF HERO, TELL.
	RETURN
C
100	IF(PRSA.NE.DEADXW) GO TO 200
C						!DEAD?
	THFACT=.FALSE.
C						!DISABLE DEMON.
	OFLAG1(CHALI)=or(OFLAG1(CHALI),TAKEBT)
	J=0
	DO 125 I=1,OLNT
C						!CARRYING ANYTHING?
125	  IF(OADV(I).EQ.-THIEF) J=500
	CALL RSPEAK(J)
C						!TELL IF BOOTY REAPPEARS.
C
	J=501
	DO 150 I=1,OLNT
C						!LOOP.
	  IF((I.EQ.CHALI).OR.(I.EQ.THIEF).OR.(HERE.NE.TREAS)
&		.OR. .NOT.QHERE(I,HERE)) GO TO 135
	  OFLAG1(I)=or(OFLAG1(I),VISIBT)
	  CALL RSPSUB(J,ODESC2(I))
C						!DESCRIBE.
	  J=502
	  GO TO 150
C
135	  IF(OADV(I).EQ.-THIEF) CALL NEWSTA(I,0,HERE,0,0)
150	CONTINUE
	RETURN
C
200	IF(PRSA.NE.FRSTQW) GO TO 250
C						!FIRST ENCOUNTER?
	THIEFP=PROB(20,75)
	RETURN
C
250	IF((PRSA.NE.HELLOW).OR.(ODESC1(THIEF).NE.504))
&		GO TO 300
	CALL RSPEAK(626)
	RETURN
C
300	IF(PRSA.NE.OUTXW) GO TO 400
C						!OUT?
	THFACT=.FALSE.
C						!DISABLE DEMON.
	ODESC1(THIEF)=504
C						!CHANGE DESCRIPTION.
	OFLAG1(STILL)=and(OFLAG1(STILL),not(VISIBT))
	OFLAG1(CHALI)=or(OFLAG1(CHALI),TAKEBT)
	RETURN
C
400	IF(PRSA.NE.INXW) GO TO 500
C						!IN?
	IF(QHERE(THIEF,HERE)) CALL RSPEAK(505)
C						!CAN HERO SEE?
	THFACT=.TRUE.
C						!ENABLE DEMON.
	ODESC1(THIEF)=503
C						!CHANGE DESCRIPTION.
	OFLAG1(STILL)=or(OFLAG1(STILL),VISIBT)
	IF((HERE.EQ.TREAS).AND.QHERE(CHALI,HERE))
&		OFLAG1(CHALI)=and(OFLAG1(CHALI),not(TAKEBT))
	RETURN
C
500	IF(PRSA.NE.TAKEW) GO TO 600
C						!TAKE?
	CALL RSPEAK(506)
C						!JOKE.
	RETURN
C
600	IF((PRSA.NE.THROWW).OR.(PRSO.NE.KNIFE).OR.
&		(and(OFLAG2(THIEF),FITEBT).NE.0)) GO TO 700
	IF(PROB(10)) GO TO 650
C						!THREW KNIFE, 10%?
	CALL RSPEAK(507)
C						!NO, JUST MAKES
	OFLAG2(THIEF)=or(OFLAG2(THIEF),FITEBT)
	RETURN
C
650	J=508
C						!THIEF DROPS STUFF.
	DO 675 I=1,OLNT
	  IF(OADV(I).NE.-THIEF) GO TO 675
C						!THIEF CARRYING?
	  J=509
	  CALL NEWSTA(I,0,HERE,0,0)
675	CONTINUE
	CALL NEWSTA(THIEF,J,0,0,0)
C						!THIEF VANISHES.
	RETURN
C
700	IF(((PRSA.NE.THROWW).AND.(PRSA.NE.GIVEW)).OR.(PRSO.EQ.0).OR.
&		(PRSO.EQ.THIEF)) GO TO 10
	IF(OCAPAC(THIEF).GE.0) GO TO 750
C						!WAKE HIM UP.
	OCAPAC(THIEF)=-OCAPAC(THIEF)
	THFACT=.TRUE.
	OFLAG1(STILL)=or(OFLAG1(STILL),VISIBT)
	ODESC1(THIEF)=503
	CALL RSPEAK(510)
C
750	IF((PRSO.NE.BRICK).OR.(OCAN(FUSE).NE.BRICK).OR.
&		(CTICK(CEVFUS).EQ.0)) GO TO 800
	CALL RSPEAK(511)
C						!THIEF REFUSES BOMB.
	RETURN
C
800	CALL NEWSTA(PRSO,0,0,0,-THIEF)
C						!THIEF TAKES GIFT.
	IF(OTVAL(PRSO).GT.0) GO TO 900
C						!A TREASURE?
	CALL RSPSUB(512,ODESC2(PRSO))
	RETURN
C
900	CALL RSPSUB(627,ODESC2(PRSO))
C						!THIEF ENGROSSED.
	THFENF=.TRUE.
	RETURN
C
10	THIEFP=.FALSE.
	RETURN
	END