bool oldstyle = false;
bool editline = true;
bool prompt = true;
-lcg_state lcgstate;
extern void initialise();
extern void score(long);
/* Initialize our LCG PRNG with parameters tested against
* Knuth vol. 2. by the original authors */
- lcgstate.a = 1093;
- lcgstate.c = 221587;
- lcgstate.m = 1048576;
+ game.lcg_a = 1093;
+ game.lcg_c = 221587;
+ game.lcg_m = 1048576;
srand(time(NULL));
long seedval = (long)rand();
set_seed(seedval);
* (game.prop=0). */
if (game.loc == game.chloc || game.prop[CHEST] >= 0)
return true;
- int k=0;
+ int snarfed=0;
+ bool movechest = false, robplayer = false;
for (int j=MINTRS; j<=MAXTRS; j++) {
/* Pirate won't take pyramid from plover room or dark
* room (too easy!). */
if (j==PYRAM && (game.loc==PLAC[PYRAM] || game.loc==PLAC[EMRALD])) {
- return true;
+ continue;
}
+ if (TOTING(j) || HERE(j))
+ ++snarfed;
if (TOTING(j)) {
- if (game.place[CHEST] == 0) {
- /* Install chest only once, to insure it is
- * the last treasure in the list. */
- MOVE(CHEST,game.chloc);
- MOVE(MESSAG,game.chloc2);
- }
- RSPEAK(128);
- for (int j=MINTRS; j<=MAXTRS; j++) {
- if (!(j == PYRAM && (game.loc == PLAC[PYRAM] || game.loc == PLAC[EMRALD]))) {
- if (AT(j) && game.fixed[j] == 0)
- CARRY(j,game.loc);
- if (TOTING(j))
- DROP(j,game.chloc);
- }
- }
- game.dloc[PIRATE]=game.chloc;
- game.odloc[PIRATE]=game.chloc;
- game.dseen[PIRATE]=false;
- return true;
+ movechest = true;
+ robplayer = true;
}
- if (HERE(j))
- k=1;
}
/* Force chest placement before player finds last treasure */
- if (game.tally == 1 && k == 0 && game.place[CHEST] == 0 && HERE(LAMP) && game.prop[LAMP] == 1) {
+ if (game.tally == 1 && snarfed == 0 && game.place[CHEST] == 0 && HERE(LAMP) && game.prop[LAMP] == 1) {
RSPEAK(186);
+ movechest = true;
+ }
+ /* Do things in this order (chest move before robbery) so chest is listed
+ * last at the maze location. */
+ if (movechest) {
MOVE(CHEST,game.chloc);
MOVE(MESSAG,game.chloc2);
game.dloc[PIRATE]=game.chloc;
game.odloc[PIRATE]=game.chloc;
game.dseen[PIRATE]=false;
- return true;
+ } else {
+ /* You might get a hint of the pirate's presence even if the
+ * chest doesn't move... */
+ if (game.odloc[PIRATE] != game.dloc[PIRATE] && PCT(20))
+ RSPEAK(127);
+ }
+ if (robplayer) {
+ RSPEAK(128);
+ for (int j=MINTRS; j<=MAXTRS; j++) {
+ if (!(j == PYRAM && (game.loc == PLAC[PYRAM] || game.loc == PLAC[EMRALD]))) {
+ if (AT(j) && game.fixed[j] == 0)
+ CARRY(j,game.loc);
+ if (TOTING(j))
+ DROP(j,game.chloc);
+ }
+ }
}
- if (game.odloc[PIRATE] != game.dloc[PIRATE] && PCT(20))
- RSPEAK(127);
+
return true;
}
* get full score. */
{
if (!DARK(game.loc)) {
- long obj;
++game.abbrev[game.loc];
for (int i=game.atloc[game.loc]; i != 0; i=game.link[i]) {
- obj=i;
+ long obj=i;
if (obj > NOBJECTS)obj=obj-NOBJECTS;
if (obj == STEPS && TOTING(NUGGET))
continue;