Commit | Line | Data |
---|---|---|
c62e332e RH |
1 | /* Re-coding of advent in C: main program */ |
2 | ||
3 | #include "hdr.h" | |
4 | ||
01eb5674 | 5 | static char sccsid[] = " main.c 4.1 82/05/11 "; |
c62e332e RH |
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 |