📄 turn.c
字号:
locations outside or meet the bear or following him into dead end in maze. And of couse, dead dwarves don't do much of anything. */ dtotal = attack = stick = 0; for (i = 1; i <= DWARFMAX; ++i) { if (g.dloc[i] == 0) continue; /* Move a dwarf at random. we don't have a matrix around to do it as in the original version... */ do j = ranz(106) + 15; /* allowed area */ while (j == g.odloc[i] || j == g.dloc[i] || g.loc_attrib[j] & NOPIRAT); if (j == 0) bug(36); g.odloc[i] = g.dloc[i]; g.dloc[i] = j; g.dseen[i] = ((g.dseen[i] && inside(g.newloc)) || g.dloc[i] == g.newloc || g.odloc[i] == g.newloc); if (g.dseen[i]) { g.dloc[i] = g.newloc; if (i == DWARFMAX) dopirate(); else { ++dtotal; if (g.odloc[i] == g.dloc[i]) { ++attack; if (g.knfloc >= 0) g.knfloc = g.newloc; if (ranz(1000) < (45 * (g.dflag - 2))) ++stick; } } } } /* Now we know shat's happing, let's tell the poor sucker about it */ if (dtotal == 0) return; if (dtotal > 1) printf("There are %d threatening little dwarves in the room with you!\n", dtotal); else rspeak(4); if (attack == 0) return; if (g.dflag == 2) ++g.dflag; if (attack > 1) { printf("%d of them throw knives at you!!\n", attack); k = 6; } else { rspeak(5); k = 52; } if (stick <= 1) { rspeak(stick + k); if (stick == 0) return; } else printf("%d of them get you !!!\n", stick); g.oldloc2 = g.newloc; death(); return;}/* 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;}/* 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);}/* HINTS come here if he's been long enough at required location(s) for some unused hint, hint number is in variable "hint". Branch to quick test for additional conditions, then do neet stuff. If conditions are met and we want to offer hint. Clear hintlc if no action is taken. */#define MASE 1#define DARK 2#define WITT 3#define H_SWORD 4#define SLIDE 5#define H_GRATE 6#define H_BIRD 7#define H_ELFIN 8#define RNBOW 9#define STYX 10#define H_SNAKE 11#define CASTLE 12void do_hint(hint)int hint;{ g.hintlc[hint] = 0; switch (hint + 1 - HNTMIN) { case MASE: if (!at(g.loc) && !at(g.oldloc) && !at(g.loc) && burden(0) > 1) break; else return; case DARK: if (g.prop[EMERALD] != -1 && g.prop[PYRAMID] == -1) break; else return; case WITT: break; case H_SWORD: if ((g.prop[SWORD] == 1 || g.prop[SWORD] == 5) && !toting(CROWN)) break; else return; case SLIDE: break; case H_GRATE: if (g.prop[GRATE] == 0 && !athand(KEYS)) break; else return; case H_BIRD: if (here(BIRD) && athand(ROD) && object == BIRD) break; else return; case H_ELFIN: if (!g.visited[159]) break; else return; case RNBOW: if (!toting(SHOES) || g.visited[205]) break; else return; case STYX: if (!athand(LYRE) && g.prop[DOG] != 1) break; else return; case H_SNAKE: if (here(SNAKE) && !here(BIRD)) break; else return; case CASTLE: break; default: printf(" TRYING TO PRINT HINT # %d\n", hint); bug(27); } if (!yes(g.hints[hint][3], 0, 54)) return; printf("\nI am prepared to give you a hint,"); printf(" but it will cost you %2d points\n", g.hints[hint][2]); g.hinted[hint] = yes(175, g.hints[hint][4], 54); if (g.hinted[hint] && g.limit > 30) g.limit += 30 * g.hints[hint][2]; return;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -