|
DataMuseum.dkPresents historical artifacts from the history of: DKUUG/EUUG Conference tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about DKUUG/EUUG Conference tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - downloadIndex: T c
Length: 20904 (0x51a8) Types: TextFile Names: »cvact.c«
└─⟦b20c6495f⟧ Bits:30007238 EUUGD18: Wien-båndet, efterår 1987 └─⟦this⟧ »EUUGD18/General/Crystal/cvact.c«
/* cvact.c * perform actions *************************************************************************/ #include <stdio.h> #include "cvobj.h" #include "cvocab.h" #include "cvlocs.h" #include "cvmisc.h" #include "cvorcs.h" #include "cvcode.h" #include "random.h" extern int actspk[]; /* cvocab.c */ extern char *oword; extern void cvsave(); extern void putcode(); extern int mutilate(); extern void juggle(); #define OKAY(msg) {rspeak(msg); return S_okay;} #define DEFMSG OKAY(actspk[verb%1000]) #define BREAKIT {register int i; if (i = mutilate(object)) {\ newloc = &(cvloc[i]); return S_move;\ } else return S_okay; } #define FILLIT(object,liquid) {(object)->prop = (liquid) - _WATER + 1;} #define INTRANS #define TRANS 10000 + int suicide() { pspeak(SELF,1); die(); return S_show; } static void dolight(object,state) register struct cvobj *object; register int state; { if (object != LAMP) { rspeak(180); } else if (limit < 0) { rspeak(184); } else if (object->prop == state) { rspeak(182-state); /* already in that state */ } else { rspeak(40 - state); object->prop = state; if (DARK) { rspeak(16); } } return; } int drownch() { if (loc->flags & DROWN) { rspeak(120); /* You can't swim */ oldlc2 = loc; /* and all your stuff gets lost in the water */ die(); /* you guessed it! */ return TRUE; } else { return FALSE; } } void didorc() { pspeak(ORCS,3); /* the orcs agree */ ORCS->prop = 0; /* now kill THEM off */ pspeak(IDOL,2); /* idol explodes (which is what kills the orcs) */ IDOL->prop = 0; /* make idol toteable */ destr2(IDOL); /* unfix the idol */ pspeak(IDOL,0); /* report the new state of the (now small) idol */ GIANT->prop = 1; /* Now for the BAD NEWS */ pspeak(GIANT,1); /* He's after you for sure */ /* Now start giant (as the priest) and the balrog */ PRIEST->dloc = PRIEST->oloc = loc; /* he's right with you */ PRIEST->dseen = TRUE; /* of course */ BALLY->dloc = BALLY->oloc = &(cvloc[141]); /* anchor ledge */ BALLY->dseen = FALSE; /* he'll get you later */ return; } void newcon(object,p,liquid) register struct cvobj *object; register int p, liquid; { pspeak(object,p); /* tell what the new contents are */ if (HERE(ORCS) && (ORCS->prop == 1) && (liquid == _COLA)) didorc(); } int drunkbear(object) register struct cvobj *object; { BEAR->prop = 0; object->prop = (object == KEG) ? 1 : 0; move(object,loc); juggle(BEAR); move2(object,FIXED); YOGI->dseen = FALSE; YOGI->dloc = DEAD; if (AXE->prop == 1 && AXE->conn2.where == FIXED) { AXE->prop = 0; destr2(AXE); } return S_show; } int wakeking() { HELM->prop = 0; destry(HELM); ARTHUR->dseen = TRUE; ARTHUR->dloc = loc; pspeak(HELM, 2); /* oops, he's after you */ return S_okay; } int unicorn() { pspeak(UNICRN,UNICRN->prop + 2); if (UNICRN->prop == 1) { destr2(UNICRN); UNICRN->prop = 0; EINHORN->dseen = FALSE; EINHORN->dloc = EINHORN->oloc = DEAD; pspeak(UNICRN,0); } return S_okay; } \f int cvact(verb,obj,object) register int verb, obj; register struct cvobj *object; { register int k; switch ((!!obj*10000) + verb) { case TRANS DROP: case TRANS THROW: /* a few cases handled elsewhere */ case INTRANS FEED: case TRANS FEED: case INTRANS POUR: case TRANS POUR: case INTRANS FILL: case TRANS FILL: return cvatt(verb,obj,object); case INTRANS SAVE: cvsave(); OKAY(54); case INTRANS RESTOR: cvrest(); rspeak(54); return S_show; case INTRANS TAKE: /* take what? I can figure it out if there's only one thing here, but otherwise, I complain. */ if ((loc->atloc.link == NULL) || (loc->atloc.link->link != NULL)) { return S_what; } /* if there's liquid here, too, I get confused, which may just confuse the adventurer, or may give him the hint he needs */ if (LIQLOC(loc)) { return S_what; } /* if the one object is the skeleton in attack mode, there's a cutlass too, so we treat it as confusing, too */ if (HERE(SKELTN) && (SKELTN->prop == 1)) { return S_what; } /* if any creatures are here, they confuse things, too */ { register struct monster *cre; for (cre = orcs; cre->iloc != -1; ++cre) { if (cre->dloc == loc) { return S_what; } } } object = loc->atloc.link->who ; obj = (object - cvobj) + 1000 ; case TRANS TAKE: /* taking something * artifacts get destroyed (this should annoy the usual greedy players * liquids are treated specially, since they are shown as properties of places and vessels. * there are some other interesting side-effects, too! */ if ((object >= MINART) && (object <= MAXART)) BREAKIT ; if (HERE(DRAGON) && DRAGON->prop ) OKAY(203); if (object == SHOWER) { pspeak(SHOWER,1); CRAP->prop = 0 ; return S_okay; } if ((object == ROPE) && (TOTING(ROPE) || (ROPE->prop % 2) ) && HERE(ROPE2)) { obj = _ROPE2; object = ROPE2; } if (TOTING(object)) DEFMSG ; if (DARK) OKAY(202); if ((object == WINE) || (object == COLA) || (object == WATER)) { register int k; k = obj; obj = 0; if (AT(BOTTLE) && (LIQ(BOTTLE) == k )) obj = _BOTTLE ; if (AT(CUP) && (LIQ(CUP) == k)) obj = obj*100 + _CUP ; if (obj > 4000) { return S_what; } if (LIQLOC(loc) == k) { if (obj) { return S_what; } /* quibble about ambiguity */ if (TOTING(BOTTLE) && !(BOTTLE->prop)) obj = _BOTTLE ; if (TOTING(CUP) && !(CUP->prop)) obj = obj*100 + _CUP ; if (obj > 4000) { fputs("Into what?\n",stdout) ; mltcmd = FALSE ; return S_obj; } if (obj) { object = OBJ(obj); FILLIT(object,k); newcon(object, object->prop + 7, k); } else { rspeak(104) ; /* nothing to put it in */ } return S_okay ; } if (!obj) OKAY(24); object = OBJ(obj); } if (holding >= 9) OKAY(92); /* too many */ if (object == TOAD) { pspeak(TOAD,1); /* all this for fun and games! */ destry(TOAD); /* he oughtta get points just for reading this*/ return S_okay; } if (object == HANG) { pspeak(HANG,HANG->prop + 1); if (HANG->prop == 0) { HANG->prop = 2; juggle(HANG); } return S_show; } if ((object == UNICRN) && UNICRN->prop) { pspeak(UNICRN,UNICRN->prop + 2); if (UNICRN->prop != 1) return S_okay; destr2(UNICRN); /* make it not fixed any more */ EINHORN->dseen = FALSE ; EINHORN->dloc = EINHORN->oloc = DEAD; pspeak(UNICRN, (UNICRN->prop = 0)); /* make it just a collar */ return S_okay; } if (object == BOAT) object->prop += 2; /* if the object has a second location, you can't touch it! */ /* the reason given is it's beyond your power or just ridiculous */ if (object->conn2.where != LOST) OKAY(IFTREAS(object) ? 146 : 25); if ((object == RING) && (JEANNIE->dloc != DEAD)) { if (JEANNIE->dloc != loc) OKAY(146); /* beyond YOUR power (need jinni) */ carry(object); JEANNIE->oloc = JEANNIE->dloc = DEAD; JEANNIE->dseen = FALSE; OKAY(209); /* explain what happened to jinni */ } carry(object); if ((object == CROWN) && (HELM->prop)) return wakeking(); if ((object == CHEST) && (SKELTN->prop)) { rspeak(54); /* okay, but ... */ rspeak(96); /* it DOES have a side effect! */ SKELTN->prop = 1; rspeak(101); /* he always misses the first swing */ return S_miss; /* of course, everything else is just FINE! */ } OKAY(54); \f case INTRANS UNLOC: obj = 0; if (HERE(HELM) & HELM->prop) obj = _HELM; if (AT(DOOR)) { if (obj) return S_what; else obj = _DOOR; } if (HERE(CHAIN) && CHAIN->prop) { if (obj) return S_what; else obj = _CHAIN; } if (!obj) return S_what; object = OBJ(obj); case TRANS UNLOC: if (object == HELM) return wakeking(); if (object == BEAR && HERE(CHAIN) && CHAIN->prop == 2) { obj = _CHAIN; object = OBJ(obj); } if (object == CHAIN) { if (!HERE(KEY)) OKAY(31); if (CHAIN->prop == 0) OKAY(37); CHAIN->prop = 0; destr2(CHAIN); if (!HERE(BEAR) || BEAR->prop <= 2) OKAY(54); BEAR->prop -= 2; YOGI->dseen = TRUE; YOGI->dloc = loc; return S_show; } goto Leave; \f case INTRANS LOCK: if (AT(DOOR)) obj = _DOOR; if (HERE(CHAIN)) { if (obj) return S_what; else obj = _CHAIN; } if (!obj) return S_what; object = OBJ(obj); case TRANS LOCK: if (object == CHAIN) { if (!HERE(KEY)) OKAY(31); if (TOTING(CHAIN)) move(CHAIN,loc); CHAIN->prop = 1; move2(CHAIN,FIXED); return S_okay; } Leave: if (object == NULL) DEFMSG; if (object == DOOR && HERE(KEY)) { if (closing) { if (!panic) clock2 = 15; panic = TRUE; OKAY(130); } else { k = 34 + DOOR->prop; DOOR->prop = (verb == LOCK) ? 0 : 1; OKAY(k + 2*(DOOR->prop)); } } else { if (object == DOOR) OKAY(31); if (object == KEY) OKAY(55); OKAY(33); } \f case INTRANS PAY: if (loc == O_GATE->conn1.where) object = O_GATE; else OKAY(8); case TRANS PAY: if (object != O_GATE) OKAY(8); if (TOTING(RUG) && RUG->prop == 1) OKAY(117); if (!HERE(WALLET)) OKAY(20); if (WALLET->prop > 3) OKAY(21); if (O_GATE->prop == 2) OKAY(46); if (CRAP->prop) OKAY(113); (WALLET->prop)++; loc++; return S_show; case TRANS BREAK: if (object <= MINART && object >= MAXART) BREAKIT; if (object == MIRROR) { pspeak(object,object->prop + 3); bonus = !(object->prop); finish = TRUE; return S_show; } else if (object == DAM) { if (DAM->prop) return S_what; BRIDGE->prop = DAM->prop = 1; O_GATE->prop = 2; rspeak(41); if (BOAT->prop % 2) { move(BOAT,BOATPLC); k = BOAT->prop; BOAT->prop = 4; move2(BOAT,FIXED); rspeak(32); if (k == 3) { rspeak(45); die(); } } return S_show; } else DEFMSG; \f case INTRANS TEST: case TRANS TEST: if (object == ROPE) { if (HERE(ROPE) && (ROPE->prop == 4 || ROPE->prop == 6)) { ROPE->prop = 6; OKAY(54); } else OKAY(29); } if (!HERE(LAMP)) DEFMSG; printf("%d turns of life left in your lamp batteries.",limit); return S_okay; \f case INTRANS CUT: object = ROPE; if (!HERE(ROPE) && HERE(ROPE2)) object = ROPE2; else if (!HERE(ROPE) && HERE(EROPE)) object = EROPE; else if (!HERE(ROPE)) return S_what; case TRANS CUT: if (!HERE(AXE) && !HERE(SWORD)) DEFMSG; if (object != ROPE && object != ROPE2 && object != EROPE) return S_what; k = ROPE->prop > 3 ? 167 : 54; /* untie it sometimes */ if (object == EROPE) { if (object->prop <3) OKAY(108); /* It's gotta be long */ ROPE->prop = 3; /* anchored 60-foot rope */ EROPE->prop = 0; /* end of 60-foot rope */ ROPE2->prop = 2; /* loose 60-foot rope */ move(ROPE2,loc); /* bring it here */ destry(EROPE2); } else { if (object->prop % 2) OKAY(168); /* not at anchor */ if (object->prop == 2) OKAY(108); /* too short */ ROPE->prop = ROPE2->prop = 2; move(ROPE2,loc); } rspeak(k); return S_show; case INTRANS TIE: if (HERE(ROPE)) object = ROPE; if (HERE(ROPE2)) object = ROPE2; if (HERE(BOAT)) { if (object != NULL) return S_what; object = BOAT; } case TRANS TIE: if (object == BOAT) { if (object->prop == 4) OKAY(30); if (!(object->prop % 2)) OKAY(27); object->prop--; OKAY(54); } if (HERE(ROPE) && HERE(ROPE2) && ROPE->prop == 2) { ROPE->prop = 4; destry(ROPE2); destry(EROPE2); /* just in case it was rigged */ OKAY(54); } /* NOTE: fall through to RIG when tying complete rope */ case INTRANS RIG: case TRANS RIG: object = NULL; if (HERE(ROPE) && !(ROPE->prop % 2)) object = ROPE; else if (HERE(ROPE2) && ROPE2->prop == 2) object = ROPE2; else OKAY(205); /* You have no rope */ { register struct rtr *rtr; register struct cvobj *obj2; obj2 = object + 2; /* EROPE object */ k = loc - cvloc; for (rtr = rtrav; rtr->top != -1; rtr++) if (k == rtr->top) break; if (rtr->top == -1) OKAY(204); /* nothing to tie it to */ if (rtr->mid == 0 && object->prop == 2) rspeak(206); /* It won't reach */ object->prop ++; /* tie it */ if (TOTING(object)) move(object,loc); /* drop it */ move2(object,FIXED); /* fix it */ move(obj2, &(cvloc[rtr->mid])); /* move the end */ move2(obj2,FIXED); /* fix the end */ obj2->prop = 0; /* assume the bottom */ if (object==ROPE && !(rtr->bot) && ROPE->prop!=3) { if (rtr->mid == DUNGEON) { obj2->prop = 3; /* show the rest of the rope */ } else { obj2->prop = 4; /* show the rest of the rope */ } } if (rtr->bot && object == ROPE && object->prop != 3) { if (rtr->mid) { obj2 = EROPE2; EROPE->prop = (int)(ROPE->prop/4) +1; } else obj2 = EROPE; move(obj2,&(cvloc[rtr->bot])); move2(obj2,FIXED); } return S_show; } case INTRANS UNTIE: if (HERE(BOAT)) { if (HERE(ROPE) || HERE(ROPE2)) return S_what; object = BOAT; } else if (HERE(ROPE)) object = ROPE; else if (HERE(ROPE2)) object = ROPE2; case TRANS UNTIE: if (object == BOAT) { if (object->prop == 4) OKAY(30); if (object->prop % 2) OKAY(26); object->prop ++ ; OKAY(54); } if (HERE(ROPE) && (ROPE->prop == 4 || ROPE->prop == 6)) { ROPE->prop = ROPE2->prop = 2; move(ROPE2,loc); rspeak(54); return S_show; } if (HERE(EROPE) && (ROPE->prop > 3) && (EROPE->prop > 2)) { /* dividing a long rope while it's rigged */ ROPE->prop = 3; /* make it short */ EROPE->prop = 0; /* make the end short, too */ ROPE2->prop = 2; /* create a short coil */ destry(EROPE2); /* with no end */ move(ROPE2,loc); /* bring it here */ rspeak(54); return S_show; } /* now try this as an "unrig" */ if (HERE(ROPE) && (ROPE->prop % 2)) object = ROPE; else if (HERE(ROPE2) && ROPE2->prop == 3) object = ROPE2; else DEFMSG; object->prop--; destr2(object); if (object == ROPE && EROPE->prop) destry(EROPE2); destry(object+2); /* destroy the end */ return S_show; \f /* rubbing the helm gets you in trouble (but you gotta do it), rubbing the lamp gives you a ribbing, rubbing anything else is just useless */ case TRANS RUB: if (object == LAMP) DEFMSG; if (object == HELM && HELM->prop) return wakeking(); OKAY(76); case TRANS INVENT: case TRANS FIND: if (object == UNICRN && UNICRN->prop && HERE(UNICRN)) return unicorn(); if (TOTING(object)) OKAY(24); if (closed) OKAY(138); if (obj == _DWARF) { register struct monster *cre; for (cre = MINDWR; cre <= MAXDWR; ++cre) { if (cre->dloc == loc && dflag >= 2) { OKAY(94); } } } if (AT(object) || (LIQ(BOTTLE) == obj && AT(BOTTLE)) || (LIQLOC(loc) == obj)) { OKAY(94); } case INTRANS INVENT: k = FALSE; for (object = cvobj; object->desc != NULL; object++) { if (strlen(object->desc) && TOTING(object)) { if (!k) {rspeak(99); k = TRUE; } blklin = FALSE; fputs(" ",stdout); putcode(object->desc); putchar('\n'); if ((object == CUP || object == BOTTLE) && object->prop) { pspeak(object, object->prop + 3); } blklin = TRUE; } } if (!k) rspeak(98); return S_okay; case TRANS CALM: if (object == UNICRN && UNICRN->prop) return unicorn(); DEFMSG; \f case INTRANS KILL: obj = 0; if (ME->dloc == loc) obj = _SELF; if (YOGI->dloc == loc) { if (obj) return S_what; else obj = _BEAR; } if (!obj) { register struct monster *cre; for (cre = orcs; cre->iloc != -1; ++cre) { if (cre->dloc == loc) OKAY(49); } OKAY(44); } object = OBJ(obj); case TRANS KILL: if (object >= MINART && object <= MAXART) BREAKIT; if (object == SELF) return suicide(); if (object == BEAR) OKAY(165); OKAY(49); \f case INTRANS EAT: if (HERE(FOOD)) { destry(FOOD); OKAY(72); } else { return S_what; } case TRANS EAT: if (object == FOOD) { destry(FOOD); OKAY(72); } if (object == BEAR || object == SPIDER || object == SELF || object == DRAGON || object == SKELTN || object == BALROG || object == DWARF) OKAY(71); DEFMSG; \f case INTRANS DRINK: obj = LIQLOC(loc); if (HERE(CUP)) { if (obj) return S_what; else obj = LIQ(CUP); } if (HERE(BOTTLE)) { if (obj) return S_what; else obj = LIQ(BOTTLE); } if (!obj) return S_what; object = OBJ(obj); case TRANS DRINK: if (object != BOTTLE && object != CUP) { k = obj; obj = 0; if (HERE(CUP) && OBJ(LIQ(CUP)) == object) obj = _CUP; if (HERE(BOTTLE) && OBJ(LIQ(BOTTLE)) == object) { if (obj) OKAY(143); /* From what? (2 possibilities) */ obj = _BOTTLE; } if (OBJ(LIQLOC(loc)) == object) { if (obj) OKAY(143); /* From what? (2 possibilities) */ OKAY(object == WATER ? 73 : 72); } if (!obj) OKAY(143); /* from what? no possibilities */ } object = OBJ(obj); /* object is now the container */ if ((k=LIQ(object)) == 0) {pspeak(object,11); return S_okay; } rspeak(object == WATER ? 73 : 72); /* take the drink */ object->prop = 0; newcon(object, 7, k); return S_okay; \f case INTRANS SIT: if (!HERE(THRONE) || THRONE->prop == 0) { if ((HERE(BOAT) && BOAT->prop/2 == 1) || (TOTING(RUG) && RUG->prop == 1)) rspeak(192); else DEFMSG; return S_okay; } k = 0; if (HERE(SCEPT)) k++; if (HERE(CROWN)) k++; if (HERE(CAPE)) k++; if (HERE(ORB)) k++; pspeak(THRONE,2); pspeak(THRONE,k+3); oldlc2 = loc; if (k == 0) die(); if (k != 4) return S_show; /* He got it right -- cast him into new universe of adventures */ THRONE->prop = 0; destr2(THRONE); /* throne is now a treasure */ newloc = &(cvloc[124]); /* start some new monsters */ JEANNIE->dloc = RING->conn1.where; SLASHER->dloc = JEWLRY->conn1.where; EINHORN->dloc = RUG->conn1.where; return S_move; case INTRANS FLY: if (!TOTING(RUG)) DEFMSG; if (RUG->prop) OKAY(154); if (loc > &(cvloc[137])) OKAY(136); if (loc < &(cvloc[63])) OKAY(136); RUG->prop = 1; OKAY(54); case TRANS WAVE: if (!TOTING(object)) OKAY(29); if (closing) DEFMSG; if (object != SCEPT) OKAY(42); if (HERE(HELM) && HELM->prop) return wakeking(); if (ARTHUR->dloc != loc) OKAY(76); ARTHUR->dloc = DEAD; ARTHUR->dseen = FALSE; move(HELM,loc); /* bring helm here (was destroyed while Arthur was walking around */ destr2(HELM); /* make it takeable */ pspeak(HELM,6); /* crumble Arthur to dust */ newloc = loc; return S_move; \f case INTRANS BRIEF: abbnum = 10000; detail = 99; OKAY(156); case INTRANS READ: if (DARK) return S_what; if (HERE(SCROLL)) object = SCROLL; else return S_what; case TRANS READ: if (DARK) return S_dark; if (object != SCROLL) DEFMSG; OKAY(126); case INTRANS SCORE: getscore(); printf("\nIf you were to quit now (after %d moves), you would \ score %d\nout of a possible %d points.\n",turns,score,mxscore); return S_okay; case TRANS BLAST: case INTRANS BLAST: if (!closed) DEFMSG; finish = TRUE; return S_show; case INTRANS ON: if (!HERE(LAMP)) DEFMSG; object = LAMP; case TRANS ON: dolight(object,1); return S_light; case INTRANS OFF: if (!HERE(LAMP)) DEFMSG; object = LAMP; case TRANS OFF: dolight(object,0); return S_light; \f case INTRANS DESCRB: case INTRANS TOUCH: if (detail++<3) rspeak(15); wzdark = FALSE; loc->abb = 0; newloc = loc; return S_move; case TRANS TOUCH: if (object == TOAD) { pspeak(TOAD,1); destry(TOAD); return S_okay; } if (object >= MINART && object <= MAXART) BREAKIT; if (object == UNICRN && HERE(object) && object->prop) return unicorn(); /* fall through to describe */ case TRANS DESCRB: k = vocab(oword,3); if (k > 0) OKAY(k%1000); rspeak(15); wzdark = FALSE; loc->abb = 0; newloc = loc; return S_move; case INTRANS PLAY: if (!HERE(HARP)) return S_what; object = HARP; case TRANS PLAY: if (object != HARP) DEFMSG; pspeak(object,1); if (UNICRN->prop == 2 && HERE(UNICRN)) { UNICRN->prop = 1; OKAY(222); } if (UNICRN->prop != -1 && UNICRN->prop != 2) return S_okay; if ((loc >= &(cvloc[62])) && (dflag >= 2) && (EINHORN->dloc != DEAD) && (!(EINHORN->dseen)) && (!(BADPLC(loc)))) { move(UNICRN,loc); EINHORN->dloc = EINHORN->oloc = loc; EINHORN->dseen = TRUE; rspeak(222); } return S_okay; \f case INTRANS DROP: case INTRANS SAY: case INTRANS RUB: case INTRANS FIND: case INTRANS BREAK: case INTRANS THROW: case INTRANS WAVE: case INTRANS CALM: case INTRANS WAKE: case TRANS SIT: return S_what; case INTRANS HELP: rspeak(157); while (getchar() != '\n') ; rspeak(158); return S_okay; case INTRANS QUIT: if (!(gaveup = yes(22,54,54))) return S_okay; finish = TRUE; return S_show; case TRANS QUIT: case TRANS SCORE: case TRANS SAVE: case TRANS RESTOR: case TRANS BRIEF: case TRANS WALK: case TRANS FLY: case TRANS WAKE: case TRANS HELP: DEFMSG; case INTRANS NOTHI: case TRANS NOTHI: OKAY(54); default: fputs("Unknown verb.\n",stdout); return S_okay; } /* end of verb switch */ }