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