- game.dtotal=0;
- attack=0;
- stick=0;
- for (int i=1; i<=NDWARVES; i++) {
- int k;
- if (game.dloc[i] == 0)
- continue;
- /* Fill TK array with all the places this dwarf might go. */
- int j=1;
- kk=KEY[game.dloc[i]];
- if (kk != 0)
- do {
- game.newloc=MOD(labs(TRAVEL[kk])/1000,1000);
- /* Have we avoided a dwarf enciounter? */
- bool avoided = (game.newloc > 300 ||
- !INDEEP(game.newloc) ||
- game.newloc == game.odloc[i] ||
- (j > 1 && game.newloc == TK[j-1]) ||
- j >= 20 ||
- game.newloc == game.dloc[i] ||
- FORCED(game.newloc) ||
- (i == PIRATE && CNDBIT(game.newloc,3)) ||
- labs(TRAVEL[kk])/1000000 == 100);
- if (!avoided) {
- TK[j++] = game.newloc;
- }
- ++kk;
- } while
- (TRAVEL[kk-1] >= 0);
- TK[j]=game.odloc[i];
- if (j >= 2)
- --j;
- j=1+randrange(j);
- game.odloc[i]=game.dloc[i];
- game.dloc[i]=TK[j];
- game.dseen[i]=(game.dseen[i] && INDEEP(game.loc)) || (game.dloc[i] == game.loc || game.odloc[i] == game.loc);
- if (!game.dseen[i]) continue;
- game.dloc[i]=game.loc;
- if (i == PIRATE) {
- /* The pirate's spotted him. He leaves him alone once we've
- * found chest. K counts if a treasure is here. If not, and
- * tally=1 for an unseen chest, let the pirate be spotted.
- * Note that game.place(CHEST)=0 might mean that he's thrown
- * it to the troll, but in that case he's seen the chest
- * (game.prop=0). */
- if (game.loc == game.chloc || game.prop[CHEST] >= 0)
- continue;
- k=0;
- 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])) {
- if (HERE(j))
- k=1;
- continue;
- }
- 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;
- /* C doesn't have what the Structured rogramming
- * Theorem says we need here - multi-level loop
- * breakout. We simulate with a goto. Irreducible, alas.
- */
- goto jumpout;
- }
- 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) {
- RSPEAK(186);
- MOVE(CHEST,game.chloc);
- MOVE(MESSAG,game.chloc2);
- game.dloc[PIRATE]=game.chloc;
- game.odloc[PIRATE]=game.chloc;
- game.dseen[PIRATE]=false;
- continue;
- }
- if (game.odloc[PIRATE] != game.dloc[PIRATE] && PCT(20))
- RSPEAK(127);
- continue;
- }
-
- /* This threatening little dwarf is in the room with him! */
- ++game.dtotal;
- if (game.odloc[i] == game.dloc[i]) {
- ++attack;
- if (game.knfloc >= 0)
- game.knfloc=game.loc;
- if (randrange(1000) < 95*(game.dflag-2))
- ++stick;
- }
- jumpout:;
+ game.dtotal = 0;
+ attack = 0;
+ stick = 0;
+ for (int i = 1; i <= NDWARVES; i++) {
+ if (game.dloc[i] == 0)
+ continue;
+ /* Fill tk array with all the places this dwarf might go. */
+ int j = 1;
+ kk = KEY[game.dloc[i]];
+ if (kk != 0)
+ do {
+ game.newloc = MOD(labs(TRAVEL[kk]) / 1000, 1000);
+ /* Have we avoided a dwarf encounter? */
+ bool avoided = (SPECIAL(game.newloc) ||
+ !INDEEP(game.newloc) ||
+ game.newloc == game.odloc[i] ||
+ (j > 1 && game.newloc == tk[j - 1]) ||
+ j >= 20 ||
+ game.newloc == game.dloc[i] ||
+ FORCED(game.newloc) ||
+ (i == PIRATE && CNDBIT(game.newloc, NOARRR)) ||
+ labs(TRAVEL[kk]) / 1000000 == 100);
+ if (!avoided) {
+ tk[j++] = game.newloc;
+ }
+ ++kk;
+ } while
+ (TRAVEL[kk - 1] >= 0);
+ tk[j] = game.odloc[i];
+ if (j >= 2)
+ --j;
+ j = 1 + randrange(j);
+ game.odloc[i] = game.dloc[i];
+ game.dloc[i] = tk[j];
+ game.dseen[i] = (game.dseen[i] && INDEEP(game.loc)) || (game.dloc[i] == game.loc || game.odloc[i] == game.loc);
+ if (!game.dseen[i]) continue;
+ game.dloc[i] = game.loc;
+ if (spotted_by_pirate(i))
+ continue;
+ /* This threatening little dwarf is in the room with him! */
+ ++game.dtotal;
+ if (game.odloc[i] == game.dloc[i]) {
+ ++attack;
+ if (game.knfloc >= 0)
+ game.knfloc = game.loc;
+ if (randrange(1000) < 95 * (game.dflag - 2))
+ ++stick;
+ }