xref: /original-bsd/contrib/dungeon/dso4.F (revision 87febec0)
1C ROBADV-- STEAL WINNER'S VALUABLES
2C
3C COPYRIGHT 1980, INFOCOM COMPUTERS AND COMMUNICATIONS, CAMBRIDGE MA. 02142
4C ALL RIGHTS RESERVED, COMMERCIAL USAGE STRICTLY PROHIBITED
5C WRITTEN BY R. M. SUPNIK
6C
7C DECLARATIONS
8C
9	INTEGER FUNCTION ROBADV(ADV,NR,NC,NA)
10	IMPLICIT INTEGER (A-Z)
11#include "objects.h"
12#include "oflags.h"
13C
14	ROBADV=0
15C						!COUNT OBJECTS
16	DO 100 I=1,OLNT
17	  IF((OADV(I).NE.ADV).OR.(OTVAL(I).LE.0).OR.
18&		(and(OFLAG2(I),SCRDBT).NE.0)) GO TO 100
19	  CALL NEWSTA(I,0,NR,NC,NA)
20C						!STEAL OBJECT
21	  ROBADV=ROBADV+1
22100	CONTINUE
23	RETURN
24	END
25C ROBRM-- STEAL ROOM VALUABLES
26C
27C DECLARATIONS
28C
29	INTEGER FUNCTION ROBRM(RM,PR,NR,NC,NA)
30	IMPLICIT INTEGER (A-Z)
31	LOGICAL PROB,QHERE
32#include "objects.h"
33#include "oflags.h"
34C
35	ROBRM=0
36C						!COUNT OBJECTS
37	DO 100 I=1,OLNT
38C						!LOOP ON OBJECTS.
39	  IF(.NOT. QHERE(I,RM)) GO TO 100
40	  IF((OTVAL(I).LE.0).OR.(and(OFLAG2(I),SCRDBT).NE.0).OR.
41&		(and(OFLAG1(I),VISIBT).EQ.0).OR.(.NOT.PROB(PR,PR)))
42&		GO TO 50
43	  CALL NEWSTA(I,0,NR,NC,NA)
44	  ROBRM=ROBRM+1
45	  OFLAG2(I)=or(OFLAG2(I),TCHBT)
46	  GO TO 100
4750	  IF(and(OFLAG2(I),ACTRBT).NE.0)
48&		ROBRM=ROBRM+ROBADV(OACTOR(I),NR,NC,NA)
49100	CONTINUE
50	RETURN
51	END
52C WINNIN-- SEE IF VILLAIN IS WINNING
53C
54C DECLARATIONS
55C
56	LOGICAL FUNCTION WINNIN(VL,HR)
57	IMPLICIT INTEGER (A-Z)
58	LOGICAL PROB
59#include "objects.h"
60C
61	VS=OCAPAC(VL)
62C						!VILLAIN STRENGTH
63	PS=VS-FIGHTS(HR,.TRUE.)
64C						!HIS MARGIN OVER HERO
65	WINNIN=PROB(90,100)
66	IF(PS.GT.3) RETURN
67C						!+3... 90% WINNING
68	WINNIN=PROB(75,85)
69	IF(PS.GT.0) RETURN
70C						!>0... 75% WINNING
71	WINNIN=PROB(50,30)
72	IF(PS.EQ.0) RETURN
73C						!=0... 50% WINNING
74	WINNIN=PROB(25,25)
75	IF(VS.GT.1) RETURN
76C						!ANY VILLAIN STRENGTH.
77	WINNIN=PROB(10,0)
78	RETURN
79	END
80C FIGHTS-- COMPUTE FIGHT STRENGTH
81C
82C DECLARATIONS
83C
84	INTEGER FUNCTION FIGHTS(H,FLG)
85	IMPLICIT INTEGER (A-Z)
86	LOGICAL FLG
87C
88C GAME STATE
89C
90#include "state.h"
91#include "advers.h"
92C
93C FUNCTIONS AND DATA
94C
95	DATA SMAX/7/,SMIN/2/
96C
97	FIGHTS=SMIN+((((SMAX-SMIN)*ASCORE(H))+(MXSCOR/2))/MXSCOR)
98	IF(FLG) FIGHTS=FIGHTS+ASTREN(H)
99	RETURN
100	END
101C VILSTR-	COMPUTE VILLAIN STRENGTH
102C
103C DECLARATIONS
104C
105	INTEGER FUNCTION VILSTR(V)
106	IMPLICIT INTEGER (A-Z)
107#include "parser.h"
108#include "objects.h"
109#include "oflags.h"
110#include "oindex.h"
111#include "villians.h"
112#include "flags.h"
113C VILSTR, PAGE 2
114C
115	VILSTR=OCAPAC(V)
116	IF(VILSTR.LE.0) RETURN
117	IF((V.NE.THIEF).OR..NOT.THFENF) GO TO 100
118	THFENF=.FALSE.
119C						!THIEF UNENGROSSED.
120	VILSTR=MIN0(VILSTR,2)
121C						!NO BETTER THAN 2.
122C
123100	DO 200 I=1,VLNT
124C						!SEE IF  BEST WEAPON.
125	  IF((VILLNS(I).EQ.V).AND.(PRSI.EQ.VBEST(I)))
126&		VILSTR=MAX0(1,VILSTR-1)
127200	CONTINUE
128	RETURN
129	END
130