+bool spotted_by_pirate(int i)
+{
+ if (i != PIRATE)
+ return false;
+
+ /* 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)
+ return true;
+ int 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])) {
+ return true;
+ }
+ 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;
+ }
+ 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;
+ return true;
+ }
+ if (game.odloc[PIRATE] != game.dloc[PIRATE] && PCT(20))
+ RSPEAK(127);
+ return true;
+}
+