1 /* MOVETO- MOVE PLAYER TO NEW ROOM */
2 
3 /*COPYRIGHT 1980, INFOCOM COMPUTERS AND COMMUNICATIONS, CAMBRIDGE MA. 02142*/
4 /* ALL RIGHTS RESERVED, COMMERCIAL USAGE STRICTLY PROHIBITED */
5 /* WRITTEN BY R. M. SUPNIK */
6 
7 #include <stdio.h>
8 #include "funcs.h"
9 #include "vars.h"
10 
moveto_(nr,who)11 logical moveto_(nr, who)
12 integer nr;
13 integer who;
14 {
15     /* System generated locals */
16     logical ret_val;
17 
18     /* Local variables */
19     integer j;
20     logical lhr;
21     logical lnr, nlv;
22     integer bits;
23 
24     ret_val = FALSE_;
25 /* 						!ASSUME FAILS. */
26     lhr = (rooms_1.rflag[play_1.here - 1] & RLAND) != 0;
27     lnr = (rooms_1.rflag[nr - 1] & RLAND) != 0;
28     j = advs_1.avehic[who - 1];
29 /* 						!HIS VEHICLE */
30 
31     if (j != 0) {
32 	goto L100;
33     }
34 /* 						!IN VEHICLE? */
35     if (lnr) {
36 	goto L500;
37     }
38 /* 						!NO, GOING TO LAND? */
39     rspeak_(427);
40 /* 						!CAN'T GO WITHOUT VEHICLE. */
41     return ret_val;
42 
43 L100:
44     bits = 0;
45 /* 						!ASSUME NOWHERE. */
46     if (j == oindex_1.rboat) {
47 	bits = RWATER;
48     }
49 /* 						!IN BOAT? */
50     if (j == oindex_1.ballo) {
51 	bits = RAIR;
52     }
53 /* 						!IN BALLOON? */
54     if (j == oindex_1.bucke) {
55 	bits = RBUCK;
56     }
57 /* 						!IN BUCKET? */
58     nlv = (rooms_1.rflag[nr - 1] & bits) == 0;
59     if (! lnr && nlv || lnr && lhr && nlv && bits != RLAND) {
60 	goto L800;
61     }
62 
63 L500:
64     ret_val = TRUE_;
65 /* 						!MOVE SHOULD SUCCEED. */
66     if ((rooms_1.rflag[nr - 1] & RMUNG) == 0) {
67 	goto L600;
68     }
69     rspeak_(rrand[nr - 1]);
70 /* 						!YES, TELL HOW. */
71     return ret_val;
72 
73 L600:
74     if (who != aindex_1.player) {
75 	newsta_(advs_1.aobj[who - 1], 0, nr, 0, 0);
76     }
77     if (j != 0) {
78 	newsta_(j, 0, nr, 0, 0);
79     }
80     play_1.here = nr;
81     advs_1.aroom[who - 1] = play_1.here;
82     scrupd_(rooms_1.rval[nr - 1]);
83 /* 						!SCORE ROOM */
84     rooms_1.rval[nr - 1] = 0;
85     return ret_val;
86 
87 L800:
88     rspsub_(428, objcts_1.odesc2[j - 1]);
89 /* 						!WRONG VEHICLE. */
90     return ret_val;
91 } /* moveto_ */
92 
93 /* SCORE-- PRINT OUT CURRENT SCORE */
94 
95 /* DECLARATIONS */
96 
score_(flg)97 void score_(flg)
98 logical flg;
99 {
100     /* Initialized data */
101 
102     static const integer rank[10] = { 20,19,18,16,12,8,4,2,1,0 };
103     static const integer erank[5] = { 20,15,10,5,0 };
104 
105     /* System generated locals */
106     integer i__1;
107 
108     /* Local variables */
109     integer i, as;
110 
111     as = advs_1.ascore[play_1.winner - 1];
112 
113     if (findex_1.endgmf) {
114 	goto L60;
115     }
116 /* 						!ENDGAME? */
117     more_output(NULL);
118     printf("Your score ");
119     if (flg)
120 	printf("would be");
121     else
122 	printf("is");
123     printf(" %d [total of %d points], in %d move", as, state_1.mxscor,
124 	    state_1.moves);
125     if (state_1.moves != 1)
126 	printf("s");
127     printf(".\n");
128 
129     for (i = 1; i <= 10; ++i) {
130 	if (as * 20 / state_1.mxscor >= rank[i - 1]) {
131 	    goto L50;
132 	}
133 /* L10: */
134     }
135 L50:
136     i__1 = i + 484;
137     rspeak_(i__1);
138     return;
139 
140 L60:
141     more_output(NULL);
142     printf("Your score in the endgame ");
143     if (flg)
144 	printf("would be");
145     else
146 	printf("is");
147     printf(" %d [total of %d points], in %d moves.\n", state_1.egscor,
148 	   state_1.egmxsc, state_1.moves);
149 
150     for (i = 1; i <= 5; ++i) {
151 	if (state_1.egscor * 20 / state_1.egmxsc >= erank[i - 1]) {
152 	    goto L80;
153 	}
154 /* L70: */
155     }
156 L80:
157     i__1 = i + 786;
158     rspeak_(i__1);
159 } /* score_ */
160 
161 /* SCRUPD- UPDATE WINNER'S SCORE */
162 
163 /* DECLARATIONS */
164 
scrupd_(n)165 void scrupd_(n)
166 integer n;
167 {
168     if (findex_1.endgmf) {
169 	goto L100;
170     }
171 /* 						!ENDGAME? */
172     advs_1.ascore[play_1.winner - 1] += n;
173 /* 						!UPDATE SCORE */
174     state_1.rwscor += n;
175 /* 						!UPDATE RAW SCORE */
176     if (advs_1.ascore[play_1.winner - 1] < state_1.mxscor - state_1.deaths *
177 	    10) {
178 	return;
179     }
180     cevent_1.cflag[cindex_1.cevegh - 1] = TRUE_;
181 /* 						!TURN ON END GAME */
182     cevent_1.ctick[cindex_1.cevegh - 1] = 15;
183     return;
184 
185 L100:
186     state_1.egscor += n;
187 /* 						!UPDATE EG SCORE. */
188 } /* scrupd_ */
189