mirror of https://github.com/sean-m/zork
189 lines
3.7 KiB
C
189 lines
3.7 KiB
C
/* MOVETO- MOVE PLAYER TO NEW ROOM */
|
|
|
|
/*COPYRIGHT 1980, INFOCOM COMPUTERS AND COMMUNICATIONS, CAMBRIDGE MA. 02142*/
|
|
/* ALL RIGHTS RESERVED, COMMERCIAL USAGE STRICTLY PROHIBITED */
|
|
/* WRITTEN BY R. M. SUPNIK */
|
|
|
|
#include <stdio.h>
|
|
#include "funcs.h"
|
|
#include "vars.h"
|
|
|
|
logical moveto_(nr, who)
|
|
integer nr;
|
|
integer who;
|
|
{
|
|
/* System generated locals */
|
|
logical ret_val;
|
|
|
|
/* Local variables */
|
|
integer j;
|
|
logical lhr;
|
|
logical lnr, nlv;
|
|
integer bits;
|
|
|
|
ret_val = FALSE_;
|
|
/* !ASSUME FAILS. */
|
|
lhr = (rooms_1.rflag[play_1.here - 1] & RLAND) != 0;
|
|
lnr = (rooms_1.rflag[nr - 1] & RLAND) != 0;
|
|
j = advs_1.avehic[who - 1];
|
|
/* !HIS VEHICLE */
|
|
|
|
if (j != 0) {
|
|
goto L100;
|
|
}
|
|
/* !IN VEHICLE? */
|
|
if (lnr) {
|
|
goto L500;
|
|
}
|
|
/* !NO, GOING TO LAND? */
|
|
rspeak_(427);
|
|
/* !CAN'T GO WITHOUT VEHICLE. */
|
|
return ret_val;
|
|
|
|
L100:
|
|
bits = 0;
|
|
/* !ASSUME NOWHERE. */
|
|
if (j == oindex_1.rboat) {
|
|
bits = RWATER;
|
|
}
|
|
/* !IN BOAT? */
|
|
if (j == oindex_1.ballo) {
|
|
bits = RAIR;
|
|
}
|
|
/* !IN BALLOON? */
|
|
if (j == oindex_1.bucke) {
|
|
bits = RBUCK;
|
|
}
|
|
/* !IN BUCKET? */
|
|
nlv = (rooms_1.rflag[nr - 1] & bits) == 0;
|
|
if (! lnr && nlv || lnr && lhr && nlv && bits != RLAND) {
|
|
goto L800;
|
|
}
|
|
|
|
L500:
|
|
ret_val = TRUE_;
|
|
/* !MOVE SHOULD SUCCEED. */
|
|
if ((rooms_1.rflag[nr - 1] & RMUNG) == 0) {
|
|
goto L600;
|
|
}
|
|
rspeak_(rrand[nr - 1]);
|
|
/* !YES, TELL HOW. */
|
|
return ret_val;
|
|
|
|
L600:
|
|
if (who != aindex_1.player) {
|
|
newsta_(advs_1.aobj[who - 1], 0, nr, 0, 0);
|
|
}
|
|
if (j != 0) {
|
|
newsta_(j, 0, nr, 0, 0);
|
|
}
|
|
play_1.here = nr;
|
|
advs_1.aroom[who - 1] = play_1.here;
|
|
scrupd_(rooms_1.rval[nr - 1]);
|
|
/* !SCORE ROOM */
|
|
rooms_1.rval[nr - 1] = 0;
|
|
return ret_val;
|
|
|
|
L800:
|
|
rspsub_(428, objcts_1.odesc2[j - 1]);
|
|
/* !WRONG VEHICLE. */
|
|
return ret_val;
|
|
} /* moveto_ */
|
|
|
|
/* SCORE-- PRINT OUT CURRENT SCORE */
|
|
|
|
/* DECLARATIONS */
|
|
|
|
void score_(flg)
|
|
logical flg;
|
|
{
|
|
/* Initialized data */
|
|
|
|
static const integer rank[10] = { 20,19,18,16,12,8,4,2,1,0 };
|
|
static const integer erank[5] = { 20,15,10,5,0 };
|
|
|
|
/* System generated locals */
|
|
integer i__1;
|
|
|
|
/* Local variables */
|
|
integer i, as;
|
|
|
|
as = advs_1.ascore[play_1.winner - 1];
|
|
|
|
if (findex_1.endgmf) {
|
|
goto L60;
|
|
}
|
|
/* !ENDGAME? */
|
|
more_output(NULL);
|
|
printf("Your score ");
|
|
if (flg)
|
|
printf("would be");
|
|
else
|
|
printf("is");
|
|
printf(" %d [total of %d points], in %d move", as, state_1.mxscor,
|
|
state_1.moves);
|
|
if (state_1.moves != 1)
|
|
printf("s");
|
|
printf(".\n");
|
|
|
|
for (i = 1; i <= 10; ++i) {
|
|
if (as * 20 / state_1.mxscor >= rank[i - 1]) {
|
|
goto L50;
|
|
}
|
|
/* L10: */
|
|
}
|
|
L50:
|
|
i__1 = i + 484;
|
|
rspeak_(i__1);
|
|
return;
|
|
|
|
L60:
|
|
more_output(NULL);
|
|
printf("Your score in the endgame ");
|
|
if (flg)
|
|
printf("would be");
|
|
else
|
|
printf("is");
|
|
printf(" %d [total of %d points], in %d moves.\n", state_1.egscor,
|
|
state_1.egmxsc, state_1.moves);
|
|
|
|
for (i = 1; i <= 5; ++i) {
|
|
if (state_1.egscor * 20 / state_1.egmxsc >= erank[i - 1]) {
|
|
goto L80;
|
|
}
|
|
/* L70: */
|
|
}
|
|
L80:
|
|
i__1 = i + 786;
|
|
rspeak_(i__1);
|
|
} /* score_ */
|
|
|
|
/* SCRUPD- UPDATE WINNER'S SCORE */
|
|
|
|
/* DECLARATIONS */
|
|
|
|
void scrupd_(n)
|
|
integer n;
|
|
{
|
|
if (findex_1.endgmf) {
|
|
goto L100;
|
|
}
|
|
/* !ENDGAME? */
|
|
advs_1.ascore[play_1.winner - 1] += n;
|
|
/* !UPDATE SCORE */
|
|
state_1.rwscor += n;
|
|
/* !UPDATE RAW SCORE */
|
|
if (advs_1.ascore[play_1.winner - 1] < state_1.mxscor - state_1.deaths *
|
|
10) {
|
|
return;
|
|
}
|
|
cevent_1.cflag[cindex_1.cevegh - 1] = TRUE_;
|
|
/* !TURN ON END GAME */
|
|
cevent_1.ctick[cindex_1.cevegh - 1] = 15;
|
|
return;
|
|
|
|
L100:
|
|
state_1.egscor += n;
|
|
/* !UPDATE EG SCORE. */
|
|
} /* scrupd_ */
|