zork/dso7.c

165 lines
3.3 KiB
C

/* ENCRYP-- ENCRYPT PASSWORD */
/*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"
void encryp_(inw, outw)
const char *inw;
char *outw;
{
/* Initialized data */
const char *keyw = "ECORMS";
integer i, j, uinw[6], usum;
char ukeyw[1*6];
integer uinws, ukeyws;
/* Parameter adjustments */
--outw;
--inw;
/* Function Body */
uinws = 0;
/* !UNBIASED INW SUM. */
ukeyws = 0;
/* !UNBIASED KEYW SUM. */
j = 1;
/* !POINTER IN KEYWORD. */
for (i = 1; i <= 6; ++i) {
/* !UNBIAS, COMPUTE SUMS. */
ukeyw[i - 1] = (keyw[i - 1] - 64);
if (inw[j] <= '@') {
j = 1;
}
uinw[i - 1] = inw[j] - 64;
ukeyws += ukeyw[i - 1];
uinws += uinw[i - 1];
++j;
/* L100: */
}
usum = uinws % 8 + (ukeyws % 8 << 3);
/* !COMPUTE MASK. */
for (i = 1; i <= 6; ++i) {
j = (uinw[i - 1] ^ ukeyw[i - 1] ^ usum) & 31;
usum = (usum + 1) % 32;
if (j > 26) {
j %= 26;
}
outw[i] = (max(1,j) + 64);
/* L200: */
}
} /* encryp_ */
/* CPGOTO-- MOVE TO NEXT STATE IN PUZZLE ROOM */
/* DECLARATIONS */
void cpgoto_(st)
integer st;
{
/* System generated locals */
integer i__1, i__2;
/* Local variables */
integer i;
rooms_1.rflag[rindex_1.cpuzz - 1] &= ~ RSEEN;
i__1 = objcts_1.olnt;
for (i = 1; i <= i__1; ++i) {
/* !RELOCATE OBJECTS. */
if (objcts_1.oroom[i - 1] == rindex_1.cpuzz && (objcts_1.oflag2[i - 1]
& ACTRBT + VILLBT) == 0) {
i__2 = findex_1.cphere * hyper_1.hfactr;
newsta_(i, 0, i__2, 0, 0);
}
if (objcts_1.oroom[i - 1] == st * hyper_1.hfactr) {
newsta_(i, 0, rindex_1.cpuzz, 0, 0);
}
/* L100: */
}
findex_1.cphere = st;
} /* cpgoto_ */
/* CPINFO-- DESCRIBE PUZZLE ROOM */
/* DECLARATIONS */
void cpinfo_(rmk, st)
integer rmk;
integer st;
{
/* Initialized data */
static const integer dgmoft[8] = { -9,-8,-7,-1,1,7,8,9 };
const char *pict = "SSS M";
/* Local variables */
integer i, j, k, l;
char dgm[1*8];
rspeak_(rmk);
for (i = 1; i <= 8; ++i) {
j = dgmoft[i - 1];
dgm[i - 1] = pict[puzzle_1.cpvec[st + j - 1] + 3];
/* !GET PICTURE ELEMENT. */
if (abs(j) == 1 || abs(j) == 8) {
goto L100;
}
k = 8;
if (j < 0) {
k = -8;
}
/* !GET ORTHO DIR. */
l = j - k;
if (puzzle_1.cpvec[st + k - 1] != 0 && puzzle_1.cpvec[st + l - 1] !=
0) {
dgm[i - 1] = '?';
}
L100:
;
}
more_output(NULL);
printf(" |%c%c %c%c %c%c|\n", dgm[0], dgm[0], dgm[1], dgm[1],
dgm[2], dgm[2]);
more_output(NULL);
printf(" West |%c%c .. %c%c| East\n", dgm[3], dgm[3], dgm[4], dgm[4]);
more_output(NULL);
printf(" |%c%c %c%c %c%c|\n", dgm[5], dgm[5], dgm[6], dgm[6],
dgm[7], dgm[7]);
if (st == 10) {
rspeak_(870);
}
/* !AT HOLE? */
if (st == 37) {
rspeak_(871);
}
/* !AT NICHE? */
i = 872;
/* !DOOR OPEN? */
if (findex_1.cpoutf) {
i = 873;
}
if (st == 52) {
rspeak_(i);
}
/* !AT DOOR? */
if (puzzle_1.cpvec[st] == -2) {
rspeak_(874);
}
/* !EAST LADDER? */
if (puzzle_1.cpvec[st - 2] == -3) {
rspeak_(875);
}
/* !WEST LADDER? */
} /* cpinfo_ */