int main(void) { printf("%d\n",bitoff(7,0)); printf("%d\n",bitoff(7,1)); printf("%d\n",bitoff(7,5)); return 0; }
/* COMBO: trying to open safe. (see comments for fee fie foe foo) */ void ivcombo() { int k, msg; k = VAL(vocab(vtxt[vrbx], MISC)) - 10; msg = 42; if (g.combo != 1 - k) { if (g.combo != 0) msg = 366; rspeak(msg); return; } g.combo = k; if (k != 3) rspeak(371); else { g.combo = 0; bitoff(SAFE, LOCKBT); biton(SAFE, OPENBT); g.prop[SAFE] = 1; if (g.prop[BOOK] < 0) { g.tally--; g.prop[BOOK] = 0; /* If remaining treasures too elusive, zap his lamp. this duplicates some code, must be done here since book is contained ins safe & tally stuff only works for thing deposited at a location. */ if ((g.tally == g.tally2) && (g.tally != 0)) g.limit = (g.limit < 35) ? g.limit : 35; } rspeak(365); } }
/* pirate stuff */ void dopirate() { int j; boolean k; if (g.newloc == g.chloc || g.prop[CHEST] >= 0) return; k = FALSE; /* Pirate won't take pyramid from plover room or dark room (too easy! ) */ for (j = 1; j < MAXOBJ; ++j) if (treasr(j) && !(j == CASK && liq(CASK) == WINE) && !(j == PYRAMID && (g.newloc == g.place[PYRAMID] || g.newloc == g.place[EMERALD]))) { if (toting(j) && athand(j)) goto stealit; if (here(j)) k = TRUE; } if (g.tally == g.tally2 + 1 && k == FALSE && g.place[CHEST] == 0 && athand(LAMP) && g.prop[LAMP] == 1) { rspeak(186); move(CHEST, g.chloc); move(MESSAGE, g.chloc2); g.dloc[DWARFMAX] = g.chloc; g.odloc[DWARFMAX] = g.chloc; g.dseen[DWARFMAX] = 0; return; } if (g.odloc[DWARFMAX] != g.dloc[DWARFMAX] && pct(30)) rspeak(127); return; stealit: rspeak(128); /* don't steal chest back from troll! */ if (g.place[MESSAGE] == 0) move(CHEST, g.chloc); move(MESSAGE, g.chloc2); for (j = 1; j < MAXOBJ; ++j) { if (!treasr(j) || !athand(j) || (j == PYRAMID && (g.newloc == plac[PYRAMID] || g.newloc == plac[EMERALD])) || (j == CASK && (liq(CASK) != WINE))) continue; if (enclosed(j)) extract(j); if (wearng(j)) { g.prop[j] = 0; bitoff(j, WEARBT); } insert(j, CHEST); } g.dloc[DWARFMAX] = g.chloc; g.odloc[DWARFMAX] = g.chloc; g.dseen[DWARFMAX] = FALSE; return; }
/* Routine to handle the passing on of one of the player's incarnations... */ void death() { int yea, j; if (!g.closing) { if (g.limit < 0) { rspeak(185); normend(); return; } yea = yes(81 + g.numdie * 2, 82 + g.numdie * 2, 54); if (++g.numdie >= MAXDIE || !yea) normend(); if (g.chase) { g.chase = FALSE; g.prop[WUMPUS] = 0; move(WUMPUS, 174); } if (toting(LAMP)) g.prop[LAMP] = 0; for (j = 1; j < MAXOBJ; ++j) { if (toting(j)) drop(j, j == LAMP ? 1 : g.oldloc2); if (wearng(j)) { g.prop[j] = 0; bitoff(j, WEARBT); } } g.newloc = 3; g.oldloc = g.loc; g.health = 100; return; } /* Closing -- no resurrection... */ rspeak(131); ++g.numdie; normend(); return; }
/* special time limit stuff... */ int stimer() { int i, spk; static int clock3; g.foobar = g.foobar > 0 ? -g.foobar : 0; g.combo = g.combo > 0 ? -g.combo : 0; if (g.turns > 310 && g.abbnum != 10000 && !g.terse) rspeak(273); /* Bump all the right clocks for reconning battery life and closing */ if (g.closed) { clock3--; if (clock3 == 0) { g.prop[PHONE] = 0; g.prop[BOOTH] = 0; rspeak(284); } else if (clock3 < -7) { rspeak(254); normend(); return (TRUE); } } if (g.tally == 0 && inside(g.loc) && g.loc != Y2) --g.clock; if (g.clock == 0) { /* Start closing the cave */ g.prop[GRATE] = 0; biton(GRATE, LOCKBT); bitoff(GRATE, OPENBT); g.prop[FISSURE] = 0; g.prop[TDOOR] = 0; biton(TDOOR, LOCKBT); bitoff(TDOOR, OPENBT); g.prop[TDOOR2] = 0; biton(TDOOR2, LOCKBT); bitoff(TDOOR2, OPENBT); for (i = 1; i <= DWARFMAX; ++i) { g.dseen[i] = FALSE; g.dloc[i] = 0; } move(TROLL, 0); move((TROLL + MAXOBJ), 0); move(TROLL2, plac[TROLL]); move((TROLL2 + MAXOBJ), fixd[TROLL]); juggle(CHASM); if (g.prop[BEAR] != 3) destroy(BEAR); g.prop[CHAIN] = 0; g.fixed[CHAIN] = 0; g.prop[AXE] = 0; g.fixed[AXE] = 0; rspeak(129); g.clock = -1; g.closing = TRUE; return (FALSE); } if (g.clock < 0) --g.clock2; if (g.clock2 == 0) { /* Set up storage room... and close the cave... */ g.prop[BOTTLE] = put(BOTTLE, 115, 8); g.holder[BOTTLE] = WATER; g.place[WATER] = -BOTTLE; g.hlink[WATER] = 0; bitoff(BOTTLE, OPENBT); g.prop[PLANT] = put(PLANT, 115, 0); g.prop[OYSTER] = put(OYSTER, 115, 0); g.prop[LAMP] = put(LAMP, 115, 0); g.prop[ROD] = put(ROD, 115, 0); g.prop[DWARF] = put(DWARF, 115, 0); g.loc = 115; g.oldloc = 115; g.newloc = 115; /* Leave the grate with normal (non-negative property). */ put(GRATE, 116, 0); biton(GRATE, LOCKBT); bitoff(GRATE, OPENBT); g.prop[SNAKE] = put(SNAKE, 116, 1); g.prop[BIRD] = put(BIRD, 116, 1); g.prop[CAGE] = put(CAGE, 116, 0); g.prop[ROD2] = put(ROD2, 116, 0); g.prop[PILLOW] = put(PILLOW, 116, 0); g.prop[BOOTH] = put(BOOTH, 116, -3); g.fixed[BOOTH] = 115; g.prop[PHONE] = put(PHONE, 212, -4); g.prop[MIRROR] = put(MIRROR, 115, 0); g.fixed[MIRROR] = 116; g.prop[BOOK2] = put(BOOK2, 115, 0); for (i = 1; i < MAXOBJ; ++i) { if (toting(i) && enclosed(i)) extract(i); if (toting(i)) destroy(i); } rspeak(132); g.closed = TRUE; clock3 = 20 + ranz(20); newtravel = TRUE; return (TRUE); } if (g.prop[LAMP] == 1) --g.limit; if (g.limit == 0) { --g.limit; g.prop[LAMP] = 0; if (here(LAMP)) rspeak(184); return (FALSE); } if (g.limit < 0 && outside(g.loc)) { rspeak(185); normend(); return (TRUE); } if (g.limit <= 40) { if (g.lmwarn || !here(LAMP)) return (FALSE); g.lmwarn = TRUE; spk = 187; if (g.prop[BATTERIES] == 1) spk = 323; if (g.place[BATTERIES] == 0) spk = 183; if (g.prop[VEND] == 1) spk = 189; rspeak(spk); return (FALSE); } return (FALSE); }
/* * * the bit offsets for each bit pattern based on the efficiency of * the sector. * * bitmap0: 0-20% * bitmap1: 21-40% * bitmap2: 41-60% * bitmap3: 61-80% * bitmap4: 81-100% */ #define bitoff(x, y) x, y static int bitmap0[] = { bitoff(-1, -1), bitoff(1, -1), bitoff(-2, 0), bitoff(0, 0), bitoff(2, 0), bitoff(-1, 1), bitoff(1, 1), bitoff(9999, 9999), }; static int bitmap1[] = { bitoff(0, -2), bitoff(-3, -1), bitoff(-1, -1), bitoff(1, -1), bitoff(3, -1), bitoff(-2, 0), bitoff(0, 0), bitoff(2, 0), bitoff(-3, 1), bitoff(-1, 1), bitoff(1, 1), bitoff(3, 1), bitoff(0, 2), bitoff(9999, 9999), }; static int bitmap2[] = {