|
|
1.1 root 1: /* Re-coding of advent in C: main program */
2:
3: #include "hdr.h"
4:
5: static char sccsid[] = " main.c 4.1 82/05/11 ";
6:
7: int datfd = -1;
8: main(argc,argv)
9: int argc;
10: char **argv;
11: { register int i;
12: int rval,ll;
13: struct text *kk;
14: extern trapdel();
15: static reenter;
16: if ((datfd = getcmd(argv[0])) < 0) {
17: write(2, "No adventure just now\n", 22);
18: exit(1);
19: }
20: reenter++;
21: setuid(getuid());
22: switch (setup) {
23: case 0:
24: init(argv[0]); /* set up initial variables */
25: /* NOTREACHED */
26: case 1:
27: startup(); /* prepare for a user */
28: signal(2,trapdel);
29: break;
30: case -1: /* restarting game : 8305 */
31: yea=start(0);
32: setup=3;
33: k=null;
34: goto l8;
35: default:
36: printf("Your forged file dissappears in a puff of greasy black smoke! (poof)\n");
37: unlink(argv[0]);
38: exit(1);
39: }
40:
41: for (;;) /* main command loop (label 2) */
42: { if (newloc<9 && newloc!=0 && closng)
43: { rspeak(130); /* if closing leave only by */
44: newloc=loc; /* main office */
45: if (!panic) clock2=15;
46: panic=TRUE;
47: }
48:
49: rval=fdwarf(); /* dwarf stuff */
50: if (rval==99) die(99);
51:
52: l2000: if (loc==0) die(99); /* label 2000 */
53: kk = &stext[loc];
54: if ((abb[loc]%abbnum)==0 || kk->seekadr==0)
55: kk = <ext[loc];
56: if (!forced(loc) && dark(0))
57: { if (wzdark && pct(35))
58: { die(90);
59: goto l2000;
60: }
61: kk = &rtext[16];
62: }
63: l2001: if (toting(bear)) rspeak(141); /* 2001 */
64: speak(kk);
65: k=1;
66: if (forced(loc))
67: goto l8;
68: if (loc==33 && pct(25)&&!closng) rspeak(8);
69: if (!dark(0))
70: { abb[loc]++;
71: for (i=atloc[loc]; i!=0; i=link[i]) /*2004 */
72: { obj=i;
73: if (obj>100) obj -= 100;
74: if (obj==steps && toting(nugget)) continue;
75: if (prop[obj]<0)
76: { if (closed) continue;
77: prop[obj]=0;
78: if (obj==rug||obj==chain)
79: prop[obj]=1;
80: tally--;
81: if (tally==tally2 && tally != 0)
82: if (limit>35) limit=35;
83: }
84: kk=(struct text *) prop[obj]; /* 2006 */
85: if (obj==steps && loc==fixed[steps])kk=(struct text *)1;
86: pspeak(obj,kk);
87: } /* 2008 */
88: goto l2012;
89: l2009: k=54; /* 2009 */
90: l2010: spk=k;
91: l2011: rspeak(spk);
92: }
93: l2012: verb=0; /* 2012 */
94: obj=0;
95: l2600: checkhints(); /* to 2600-2602 */
96: if (closed)
97: { if (prop[oyster]<0 && toting(oyster))
98: pspeak(oyster,1);
99: for (i=1; i<100; i++)
100: if (toting(i)&&prop[i]<0) /*2604 */
101: prop[i] = -1-prop[i];
102: }
103: wzdark=dark(0); /* 2605 */
104: if (knfloc>0 && knfloc!=loc) knfloc=1;
105: getin(&wd1,&wd2);
106: if (delhit) /* user typed a DEL */
107: { delhit=0; /* reset counter */
108: copystr("quit",wd1); /* pretend he's quitting*/
109: *wd2=0;
110: }
111: l2608: if ((foobar = -foobar)>0) foobar=0; /* 2608 */
112: /* should check here for "magic mode" */
113: turns++;
114: if (demo && turns>=SHORT) done(1); /* to 13000 */
115:
116: if (verb==say && *wd2!=0) verb=0;
117: if (verb==say)
118: goto l4090;
119: if (tally==0 && loc>=15 && loc!=33) clock1--;
120: if (clock1==0)
121: { closing(); /* to 10000 */
122: goto l19999;
123: }
124: if (clock1<0) clock2--;
125: if (clock2==0)
126: { caveclose(); /* to 11000 */
127: continue; /* back to 2 */
128: }
129: if (prop[lamp]==1) limit--;
130: if (limit<=30 && here(batter) && prop[batter]==0
131: && here(lamp))
132: { rspeak(188); /* 12000 */
133: prop[batter]=1;
134: if (toting(batter)) drop(batter,loc);
135: limit=limit+2500;
136: lmwarn=FALSE;
137: goto l19999;
138: }
139: if (limit==0)
140: { limit = -1; /* 12400 */
141: prop[lamp]=0;
142: rspeak(184);
143: goto l19999;
144: }
145: if (limit<0&&loc<=8)
146: { rspeak(185); /* 12600 */
147: gaveup=TRUE;
148: done(2); /* to 20000 */
149: }
150: if (limit<=30)
151: { if (lmwarn|| !here(lamp)) goto l19999; /*12200*/
152: lmwarn=TRUE;
153: spk=187;
154: if (place[batter]==0) spk=183;
155: if (prop[batter]==1) spk=189;
156: rspeak(spk);
157: }
158: l19999: k=43;
159: if (liqloc(loc)==water) k=70;
160: if (weq(wd1,"enter") &&
161: (weq(wd2,"strea")||weq(wd2,"water")))
162: goto l2010;
163: if (weq(wd1,"enter") && *wd2!=0) goto l2800;
164: if ((!weq(wd1,"water")&&!weq(wd1,"oil"))
165: || (!weq(wd2,"plant")&&!weq(wd2,"door")))
166: goto l2610;
167: if (at(vocab(wd2,1))) copystr("pour",wd2);
168: l2610: if (weq(wd1,"west"))
169: if (++iwest==10) rspeak(17);
170: l2630: i=vocab(wd1,-1);
171: if (i== -1)
172: { spk=60; /* 3000 */
173: if (pct(20)) spk=61;
174: if (pct(20)) spk=13;
175: rspeak(spk);
176: goto l2600;
177: }
178: k=i%1000;
179: kq=i/1000+1;
180: switch(kq)
181: { case 1: goto l8;
182: case 2: goto l5000;
183: case 3: goto l4000;
184: case 4: goto l2010;
185: default:
186: printf("Error 22\n");
187: exit(0);
188: }
189:
190: l8:
191: switch(march())
192: { case 2: continue; /* i.e. goto l2 */
193: case 99:
194: switch(die(99))
195: { case 2000: goto l2000;
196: default: bug(111);
197: }
198: default: bug(110);
199: }
200:
201: l2800: copystr(wd2,wd1);
202: *wd2=0;
203: goto l2610;
204:
205: l4000: verb=k;
206: spk=actspk[verb];
207: if (*wd2!=0 && verb!=say) goto l2800;
208: if (verb==say) obj= *wd2;
209: if (obj!=0) goto l4090;
210: l4080:
211: switch(verb)
212: { case 1: /* take = 8010 */
213: if (atloc[loc]==0||link[atloc[loc]]!=0) goto l8000;
214: for (i=1; i<=5; i++)
215: if (dloc[i]==loc&&dflag>=2) goto l8000;
216: obj=atloc[loc];
217: goto l9010;
218: case 2: case 3: case 9: /* 8000 : drop,say,wave */
219: case 10: case 16: case 17: /* calm,rub,toss */
220: case 19: case 21: case 28: /* find,feed,break */
221: case 29: /* wake */
222: l8000: printf("%s what?\n",wd1);
223: obj=0;
224: goto l2600;
225: case 4: case 6: /* 8040 open,lock */
226: spk=28;
227: if (here(clam)) obj=clam;
228: if (here(oyster)) obj=oyster;
229: if (at(door)) obj=door;
230: if (at(grate)) obj=grate;
231: if (obj!=0 && here(chain)) goto l8000;
232: if (here(chain)) obj=chain;
233: if (obj==0) goto l2011;
234: goto l9040;
235: case 5: goto l2009; /* nothing */
236: case 7: goto l9070; /* on */
237: case 8: goto l9080; /* off */
238: case 11: goto l8000; /* walk */
239: case 12: goto l9120; /* kill */
240: case 13: goto l9130; /* pour */
241: case 14: /* eat: 8140 */
242: if (!here(food)) goto l8000;
243: l8142: dstroy(food);
244: spk=72;
245: goto l2011;
246: case 15: goto l9150; /* drink */
247: case 18: /* quit: 8180 */
248: gaveup=yes(22,54,54);
249: if (gaveup) done(2); /* 8185 */
250: goto l2012;
251: case 20: /* invent=8200 */
252: spk=98;
253: for (i=1; i<=100; i++)
254: { if (i!=bear && toting(i))
255: { if (spk==98) rspeak(99);
256: blklin=FALSE;
257: pspeak(i,-1);
258: blklin=TRUE;
259: spk=0;
260: }
261: }
262: if (toting(bear)) spk=141;
263: goto l2011;
264: case 22: goto l9220; /* fill */
265: case 23: goto l9230; /* blast */
266: case 24: /* score: 8240 */
267: scorng=TRUE;
268: printf("If you were to quit now, you would score");
269: printf(" %d out of a possible ",score());
270: printf("%d.",mxscor);
271: scorng=FALSE;
272: gaveup=yes(143,54,54);
273: if (gaveup) done(2);
274: goto l2012;
275: case 25: /* foo: 8250 */
276: k=vocab(wd1,3);
277: spk=42;
278: if (foobar==1-k) goto l8252;
279: if (foobar!=0) spk=151;
280: goto l2011;
281: l8252: foobar=k;
282: if (k!=4) goto l2009;
283: foobar=0;
284: if (place[eggs]==plac[eggs]
285: ||(toting(eggs)&&loc==plac[eggs])) goto l2011;
286: if (place[eggs]==0&&place[troll]==0&&prop[troll]==0)
287: prop[troll]=1;
288: k=2;
289: if (here(eggs)) k=1;
290: if (loc==plac[eggs]) k=0;
291: move(eggs,plac[eggs]);
292: pspeak(eggs,k);
293: goto l2012;
294: case 26: /* brief=8260 */
295: spk=156;
296: abbnum=10000;
297: detail=3;
298: goto l2011;
299: case 27: /* read=8270 */
300: if (here(magzin)) obj=magzin;
301: if (here(tablet)) obj=obj*100+tablet;
302: if (here(messag)) obj=obj*100+messag;
303: if (closed&&toting(oyster)) obj=oyster;
304: if (obj>100||obj==0||dark(0)) goto l8000;
305: goto l9270;
306: case 30: /* suspend=8300 */
307: spk=201;
308: if (demo) goto l2011;
309: printf("I can suspend your adventure for you so");
310: printf(" you can resume later, but\n");
311: printf("you will have to wait at least");
312: printf(" %d minutes before continuing.",latncy);
313: if (!yes(200,54,54)) goto l2012;
314: datime(&saved,&savet);
315: setup = -1;
316: ciao(argv[0]);
317: continue;
318: case 31: /* hours=8310 */
319: printf("Colossal cave is closed 9am-5pm Mon ");
320: printf("through Fri except holidays.\n");
321: goto l2012;
322: default: bug(23);
323: }
324:
325: l4090:
326: switch(verb)
327: { case 1: /* take = 9010 */
328: l9010: switch(trtake())
329: { case 2011: goto l2011;
330: case 9220: goto l9220;
331: case 2009: goto l2009;
332: case 2012: goto l2012;
333: default: bug(102);
334: }
335: l9020: case 2: /* drop = 9020 */
336: switch(trdrop())
337: { case 2011: goto l2011;
338: case 19000: done(3);
339: case 2012: goto l2012;
340: default: bug(105);
341: }
342: l9030: case 3:
343: switch(trsay())
344: { case 2012: goto l2012;
345: case 2630: goto l2630;
346: default: bug(107);
347: }
348: l9040: case 4: case 6: /* open, close */
349: switch(tropen())
350: { case 2011: goto l2011;
351: case 2010: goto l2010;
352: default: bug(106);
353: }
354: case 5: goto l2009; /* nothing */
355: case 7: /* on 9070 */
356: l9070: if (!here(lamp)) goto l2011;
357: spk=184;
358: if (limit<0) goto l2011;
359: prop[lamp]=1;
360: rspeak(39);
361: if (wzdark) goto l2000;
362: goto l2012;
363:
364: case 8: /* off */
365: l9080: if (!here(lamp)) goto l2011;
366: prop[lamp]=0;
367: rspeak(40);
368: if (dark(0)) rspeak(16);
369: goto l2012;
370:
371: case 9: /* wave */
372: if ((!toting(obj))&&(obj!=rod||!toting(rod2)))
373: spk=29;
374: if (obj!=rod||!at(fissur)||!toting(obj)||closng)
375: goto l2011;
376: prop[fissur]=1-prop[fissur];
377: pspeak(fissur,2-prop[fissur]);
378: goto l2012;
379: case 10: case 11: case 18: /* calm, walk, quit */
380: case 24: case 25: case 26: /* score, foo, brief */
381: case 30: case 31: /* suspend, hours */
382: goto l2011;
383: l9120: case 12: /* kill */
384: switch(trkill())
385: { case 8000: goto l8000;
386: case 8: goto l8;
387: case 2011: goto l2011;
388: case 2608: goto l2608;
389: case 19000: done(3);
390: default: bug(112);
391: }
392: l9130: case 13: /* pour */
393: if (obj==bottle||obj==0) obj=liq(0);
394: if (obj==0) goto l8000;
395: if (!toting(obj)) goto l2011;
396: spk=78;
397: if (obj!=oil&&obj!=water) goto l2011;
398: prop[bottle]=1;
399: place[obj]=0;
400: spk=77;
401: if (!(at(plant)||at(door))) goto l2011;
402: if (at(door))
403: { prop[door]=0; /* 9132 */
404: if (obj==oil) prop[door]=1;
405: spk=113+prop[door];
406: goto l2011;
407: }
408: spk=112;
409: if (obj!=water) goto l2011;
410: pspeak(plant,prop[plant]+1);
411: prop[plant]=(prop[plant]+2)% 6;
412: prop[plant2]=prop[plant]/2;
413: k=null;
414: goto l8;
415: case 14: /* 9140 - eat */
416: if (obj==food) goto l8142;
417: if (obj==bird||obj==snake||obj==clam||obj==oyster
418: ||obj==dwarf||obj==dragon||obj==troll
419: ||obj==bear) spk=71;
420: goto l2011;
421: l9150: case 15: /* 9150 - drink */
422: if (obj==0&&liqloc(loc)!=water&&(liq(0)!=water
423: ||!here(bottle))) goto l8000;
424: if (obj!=0&&obj!=water) spk=110;
425: if (spk==110||liq(0)!=water||!here(bottle))
426: goto l2011;
427: prop[bottle]=1;
428: place[water]=0;
429: spk=74;
430: goto l2011;
431: case 16: /* 9160: rub */
432: if (obj!=lamp) spk=76;
433: goto l2011;
434: case 17: /* 9170: throw */
435: switch(trtoss())
436: { case 2011: goto l2011;
437: case 9020: goto l9020;
438: case 9120: goto l9120;
439: case 8: goto l8;
440: case 9210: goto l9210;
441: default: bug(113);
442: }
443: case 19: case 20: /* 9190: find, invent */
444: if (at(obj)||(liq(0)==obj&&at(bottle))
445: ||k==liqloc(loc)) spk=94;
446: for (i=1; i<=5; i++)
447: if (dloc[i]==loc&&dflag>=2&&obj==dwarf)
448: spk=94;
449: if (closed) spk=138;
450: if (toting(obj)) spk=24;
451: goto l2011;
452: l9210: case 21: /* feed */
453: switch(trfeed())
454: { case 2011: goto l2011;
455: default: bug(114);
456: }
457: l9220: case 22: /* fill */
458: switch(trfill())
459: { case 2011: goto l2011;
460: case 8000: goto l8000;
461: case 9020: goto l9020;
462: default: bug(115);
463: }
464: l9230: case 23: /* blast */
465: if (prop[rod2]<0||!closed) goto l2011;
466: bonus=133;
467: if (loc==115) bonus=134;
468: if (here(rod2)) bonus=135;
469: rspeak(bonus);
470: done(2);
471: l9270: case 27: /* read */
472: if (dark(0)) goto l5190;
473: if (obj==magzin) spk=190;
474: if (obj==tablet) spk=196;
475: if (obj==messag) spk=191;
476: if (obj==oyster&&hinted[2]&&toting(oyster)) spk=194;
477: if (obj!=oyster||hinted[2]||!toting(oyster)
478: ||!closed) goto l2011;
479: hinted[2]=yes(192,193,54);
480: goto l2012;
481: l9280: case 28: /* break */
482: if (obj==mirror) spk=148;
483: if (obj==vase&&prop[vase]==0)
484: { spk=198;
485: if (toting(vase)) drop(vase,loc);
486: prop[vase]=2;
487: fixed[vase]= -1;
488: goto l2011;
489: }
490: if (obj!=mirror||!closed) goto l2011;
491: rspeak(197);
492: done(3);
493:
494: l9290: case 29: /* wake */
495: if (obj!=dwarf||!closed) goto l2011;
496: rspeak(199);
497: done(3);
498:
499: default: bug(24);
500: }
501:
502: l5000:
503: obj=k;
504: if (fixed[k]!=loc && !here(k)) goto l5100;
505: l5010: if (*wd2!=0) goto l2800;
506: if (verb!=0) goto l4090;
507: printf("What do you want to do with the %s?\n",wd1);
508: goto l2600;
509: l5100: if (k!=grate) goto l5110;
510: if (loc==1||loc==4||loc==7) k=dprssn;
511: if (loc>9&&loc<15) k=entrnc;
512: if (k!=grate) goto l8;
513: l5110: if (k!=dwarf) goto l5120;
514: for (i=1; i<=5; i++)
515: if (dloc[i]==loc&&dflag>=2) goto l5010;
516: l5120: if ((liq(0)==k&&here(bottle))||k==liqloc(loc)) goto l5010;
517: if (obj!=plant||!at(plant2)||prop[plant2]==0) goto l5130;
518: obj=plant2;
519: goto l5010;
520: l5130: if (obj!=knife||knfloc!=loc) goto l5140;
521: knfloc = -1;
522: spk=116;
523: goto l2011;
524: l5140: if (obj!=rod||!here(rod2)) goto l5190;
525: obj=rod2;
526: goto l5010;
527: l5190: if ((verb==find||verb==invent)&&*wd2==0) goto l5010;
528: printf("I see no %s here\n",wd1);
529: goto l2012;
530: }
531: }
532:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.