📄 verb.c
字号:
/* WEAR. Only good for jewels, ruby slippers, cloak & crown. But he might try the sword. Anything else is ridiculous. Another variant of 'CARRY'. */void vwear(){ int msg; if (object == SWORD && g.prop[SWORD] != 3) msg = 209; else if (worn(object)) { if (object == CLOAK && g.prop[CLOAK] == 2) msg = 242; else if (wearng(object)) msg = (object == SHOES) ? 227 : 210; else { g.prop[object] = 1; biton(object, WEARBT); if (enclosed(object)) extract(object); if (holding(object)) msg = 54; else { vtake(); return; } } } else { printf("Just exactly how does one wear a %s\n", otxt[objx]); return; } rspeak(msg); return;}/* HIT. If not punching out telephone, assume attack. */void vhit(){ if (at(WUMPUS) && g.prop[WUMPUS] == 0) { vwake(); return; } if (object != PHONE) { vkill(); return; } else { if (g.closed) { rspeak(282); dwarfend(); return; } if (g.prop[PHONE] == 2) rspeak(256); else { drop(SLUGS, g.loc); g.prop[PHONE] = 2; g.prop[BOOTH] = 2; rspeak(257); } } return;}/* ANSWER (telephone). Smartass for anything else. */void vanswer(){ int msg; switch (object) { case DWARF: case WUMPUS: case SNAKE: case BEAR: case DRAGON: msg = 259; break; case TROLL: msg = 258; break; case BIRD: msg = 260; break; case PHONE: if (g.prop[PHONE] != 0) msg = 269; else if (g.closed) { rspeak(283); normend(); return; } else { msg = 261; g.prop[PHONE] = 1; g.prop[BOOTH] = 2; } break; default: msg = actmsg[verb]; break; } rspeak(msg); return;}/* BLOW. Joshua fit de battle of Jericho, and de walls ... */void vblow(){ int msg, i, k; msg = actmsg[verb]; if (object != 0 && iobj != 0) { rspeak(msg); return; } if (object == 0) object = iobj; iobj = 0; if (object == 0) msg = 268; if (object == HORN) { msg = outside(g.loc) ? 277 : 266; if (at(WUMPUS)) { rspeak(msg); if (g.prop[WUMPUS] == 0) vwake(); return; } else if (g.prop[WALL] != 1 && (g.loc == 102 || g.loc == 194)) { k = g.loc == 194 ? 195 : 196; msg = 265; g.prop[WALL] = 1; for (i = 1; i < MAXOBJ; i++) if (g.place[i] == g.loc || g.fixed[i] == g.loc) move(i, k); g.newloc = k; } } rspeak(msg); return;}/* DIAL. No effect unless at phone. */void vdial(){ if (object != PHONE) actspk(verb); else if (g.closed) { rspeak(283); normend(); } else rspeak(271); return;}/* PLAY. Only for horn or lyre. */void vplay(){ int msg; msg = actmsg[verb]; if (object != 0 && iobj != 0) { rspeak(confuz()); return; } if (object == 0) object = iobj; if (object == HORN) { vblow(); return; } if (object == LYRE) { msg = 287; if (here(DOG) && !dead(DOG)) { g.prop[DOG] = 1; biton(DOG, DEADBT); g.fixed[AXE] = 0; g.prop[AXE] = 0; msg = 288; } } rspeak(msg); return;}/* PICK/ PICK UP. Can pick flower & mushrooms, But must 'PICK UP' everything else. */void vpick(){ if (object == 0) object = iobj; iobj = 0; if (object == FLOWER || object == MUSHRM || prep != 0) vtake(); else rspeak(confuz()); return;}/* PUT DOWN: equivalent to drop PUT IN: if liquid, means fill PUT ON: wear of drop */void vput(){ if (prep == 0) { printf("Where do you want to put the %s\n", otxt[objx]); return; } if (prep == PREPIN) vinsert(); else { /* PUT ON: wear or put object on iobj */ if (prep == PREPON) { if (object == 0) { object = iobj; otxt[objx] = iotxt[iobx]; iobj = 0; } if (worn(object) || object == 0) vwear(); else vdrop(); } else { /* PUT DOWN: "drop" */ if (object == 0 && iobj == 0) { if (object == 0) object = iobj; iobj = 0; vdrop(); } else rspeak(noway()); } } return;}/* turn on/off */void vturn(){ if (!prep) rspeak(confuz()); else { if (!object && iobj == LAMP) object = LAMP; if (object != LAMP) rspeak(noway()); else if (prep == PREPON) von(); else voff(); } return;}/* GET (no prep): "take" GET IN: "enter" GET OUT: "leave" */void vget(){ if (prep == 0 || prep == PREPFR) vtake(); else if (object == 0) { object = iobj; iobj = 0; prep = 0; vtake(); } return;}/* INSERT/PUT IN */void vinsert(){ int msg; if (iobj == 0) { printf("Where do you want to %s it?\n", vtxt[vrbx]); return; } msg = noway(); if (object == SWORD && iobj == ANVIL && g.prop[SWORD] == 0) msg = 350; if (!vessel(iobj)) { rspeak(msg); return; } msg = ck_obj(); if (g.fixed[object]) { rspeak(msg); return; } if (object == iobj) { rspeak(252); return; } if (iobj == BOTTLE || iobj == CASK || iobj == VASE || iobj == GRAIL || (object >= WATER && object <= WINE + 1)) { object = iobj; iobj = objs[objx]; vfill(); return; } if (!ajar(iobj)) { rspeak(358); return; } if (iobj == CHEST) { if (object == BOAT) msg = noway(); else { if (wearng(object)) bitoff(object, WEARBT); if (worn(object)) g.prop[object] = 0; if (enclosed(object)) extract(object); insert(object, iobj); msg = 54; } rspeak(msg); return; } /* Bird goes into cage and only cage */ if (object == BIRD && iobj != CAGE) { rspeak(351); return; } if (object != BIRD && iobj == CAGE) { rspeak(329); return; } if (object == BIRD) { prep = 0; vtake(); return; } /* Bar vase & pillow from safe, to force putting down on florr */ if ((object == VASE || object == PILLOW) && iobj == SAFE) { rspeak(329); return; } if (object != RADIUM && iobj == SHIELD) { rspeak(329); return; } if (iobj == PHONE) { if (object == COINS || object == SLUGS) { destroy(object); msg = 330; } else msg = 329; rspeak(msg); return; } if (iobj == VEND) { if (object == COINS || object == SLUGS) { destroy(object); move(BATTERIES, g.loc); if (g.prop[BATTERIES] == 1) { rspeak(317); g.prop[VEND] = 1; } g.prop[BATTERIES] = 0; pspeak(BATTERIES, 0); } else rspeak(noway()); return; } /* Put batteries in lamp. There is a glitch here, in that if he tries to get a third set of batteries before the second set has been inserted, the second set disappears! ***fix this some time *** */ if (iobj == LAMP) { if (object != BATTERIES || g.prop[BATTERIES] != 0) msg = noway(); else { g.prop[BATTERIES] = 1; if (enclosed(BATTERIES)) extract(BATTERIES); if (holding(BATTERIES)) drop(BATTERIES, g.loc); g.limit = 400; g.prop[LAMP] = 1; g.lmwarn = FALSE; msg = 188; } rspeak(msg); return; } if (!small(object)) msg = 329; else { if (wearng(object)) bitoff(object, WEARBT); if (worn(object)) g.prop[object] = 0; if (enclosed(object)) extract(object); insert(object, iobj); msg = 54; } rspeak(msg); return;}/* Remove or take from */void vextract(){ int msg; if (object == RING && g.prop[RING] == 2) { prep = 0; iobj = 0; vtake(); return; } msg = 343; if (iobj == 0) { if (!enclosed(object)) msg = 340; iobj = -g.place[object]; } if (g.place[object] != -iobj) msg = 341; if (!ajar(iobj)) msg = 335; if (object == WATER || object == OIL || object == WINE) msg = 342; if (!toting(object) && ((burden(0) + burden(object)) > 15)) msg = 92; if (msg == 343) { if (object == BIRD) { vdrop(); return; } extract(object); } rspeak(msg); return;}/* lock. chain, grate, chest, elfin door Here are the current lock/unlock messages & numbers: 31 you have no keys. 32 it has no lock. 34 it's already locked. 35 the grate is now locked. 36 the grate is now unlocked. 37 it was allready unlocked. 55 you can't unlock the keys. 171 The chain is now unlocked. 172 The chain is now locked. 173 There is nothing here to which the chain can be locked. 224 Your keys are all too large. 234 The wrought-iron door is now locked. 235 The tiny door is now locked. 236 The wrought-iron door is now unlocked. 237 The tiny door is now unlocked. 375 You don't have the right key. 333 the chest is now locked. 334 the chest is now unlocked. 367 The safe's door swings shut.*/void vlock(){ int msg, k; if (!hinged(object)) { printf("I don't know how to lock or unlock the %s\n", otxt[objx]); return; } else if (!locks(object)) msg = 32; else if (locked(object)) msg = 34; else if (!athand(KEYS) && !athand(SKEY) && object != SAFE) msg = 31; else { msg = 375; switch (object) { case CHAIN: if (!athand(KEYS)) break; msg = 173; if (g.loc != plac[CHAIN]) break; msg = 172; g.prop[CHAIN] = 2; if (enclosed(CHAIN)) extract(CHAIN); if (holding(CHAIN)) drop(CHAIN, g.loc); g.fixed[CHAIN] = -1; biton(CHAIN, LOCKBT); bitoff(CHAIN, OPENBT); break; case CHEST: if (!athand(KEYS)) break; msg = 334; biton(CHEST, LOCKBT); bitoff(CHEST, OPENBT); break; case TDOOR: case TDOOR2: msg = 224; if (!toting(SKEY)) break; g.prop[TDOOR] = 0; g.prop[TDOOR2] = 0; msg = 234 + (TDOOR2 - object); k = TDOOR + TDOOR2 - object; biton(k, LOCKBT); bitoff(k, OPENBT); biton(object, LOCKBT); bitoff(object, OPENBT); break; case GRATE: if (!athand(KEYS)) break; g.prop[GRATE] = 0; msg = 35; biton(GRATE, LOCKBT); bitoff(GRATE, OPENBT); break; case SAFE: g.prop[SAFE] = 0; msg = 367; biton(SAFE, LOCKBT); bitoff(SAFE, OPENBT); break; } } rspeak(msg);}/* UNLOCK. chain, grate, chest, elfin door.*/void vunlock(){ int msg, k; if (object == KEYS || object == SKEY) msg = 55; else if (!hinged(object)) { printf("I don't know how to lock or unlock the %s\n", otxt[objx]); return; } else if (!locked(object)) msg = 37; else if (!locks(object)) msg = 32; else if (object == SAFE) { if (iobj == KEYS || iobj == SKEY) msg = 368; else msg = 342; } else if (!athand(KEYS) && !athand(SKEY)) msg = 31; else { msg = 375; switch (object) { case CHAIN: if (!athand(KEYS)) break; if (g.prop[BEAR] == 0) msg = 41; else { msg = 171; g.prop[CHAIN] = 0; g.fixed[CHAIN] = 0; if (g.prop[BEAR] != 3) g.prop[BEAR] = 2; g.fixed[BEAR] = 2 - g.prop[BEAR]; bitoff(CHAIN, LOCKBT); biton(CHAIN, OPENBT); } break; case CHEST: if (athand(KEYS)) { msg = 333; bitoff(CHEST, LOCKBT); biton(CHEST, OPENBT); } break; case TDOOR: case TDOOR2: /* Elvin door stuff to lock/unlock tiny door w/special key. the damn thing is really at four places, and we want the right messages if he only has 'BIG'keys (or no keys). Also, he can unlock it either while he is big or small. */ msg = 224; if (!athand(SKEY)) break; if (g.closing) { msg = 130; if (!g.panic) g.clock2 = 15; g.panic = TRUE; } else { g.prop[TDOOR] = 1; g.prop[TDOOR2] = 1; msg = 234 + 2 + (TDOOR2 - object); k = TDOOR + (TDOOR2 - object); bitoff(k, LOCKBT); biton(k, OPENBT); bitoff(object, LOCKBT); biton(object, OPENBT); } break; case GRATE: if (!athand(KEYS)) break; if (g.closing) { msg = 130; if (!g.panic) g.clock2 = 15; g.panic = TRUE; } else { g.prop[GRATE] = 1; msg = 36; bitoff(GRATE, LOCKBT); biton(GRATE, OPENBT); } break; default: msg = 33; } } rspeak(msg);}/* LOOK.*/void vlook(){ int sloc; if (object != 0) { rspeak(confuz()); return; } /* Look into something (a container). */ if (vessel(iobj)) { if (!ajar(iobj) && opaque(iobj)) rspeak(actmsg[verb]); else if (g.holder[iobj] == 0) rspeak(359); else { putchar(' '); lookin(iobj); } /* Look at something. If written, read it. */ } else if (printed(iobj)) { object = iobj; iobj = 0; vread(); } else if (iobj == SPHERE) { if (!inside(g.loc) || athand(SAPPHIRE)) rspeak(42); else { rspeak(400); printf(" "); sloc = g.place[SAPPHIRE]; if ((g.loc_attrib[sloc] % 2 == 0 || enclosed(SAPPHIRE)) && sloc != 200 && !g.place[LAMP] == sloc && g.prop[LAMP] != 0) rspeak(401); else desclg(sloc); if (sloc == 239 && !g.flg239) { rspeak(403); g.flg239 = TRUE; } printf(" "); rspeak(402); } } else printf("I see nothing special about the %s?\n", iotxt[iobx]); return;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -