allow command to be appended; redo perror messages to use strerror
[unix-history] / usr / src / games / battlestar / com1.c
CommitLineData
fdc7d56f 1/*
e95fc82a
KB
2 * Copyright (c) 1983 Regents of the University of California.
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms are permitted
28c5bacc
KB
6 * provided that the above copyright notice and this paragraph are
7 * duplicated in all such forms and that any documentation,
8 * advertising materials, and other materials related to such
9 * distribution and use acknowledge that the software was developed
10 * by the University of California, Berkeley. The name of the
11 * University may not be used to endorse or promote products derived
12 * from this software without specific prior written permission.
13 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
14 * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
15 * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
fdc7d56f
EW
16 */
17
6bd0a3e3 18#ifndef lint
28c5bacc 19static char sccsid[] = "@(#)com1.c 5.2 (Berkeley) %G%";
e95fc82a 20#endif /* not lint */
6bd0a3e3
EW
21
22#include "externs.h"
23
24move(thataway, token)
25int thataway, token;
26{
27 wordnumber++;
28 if ((!notes[CANTMOVE] && !notes[LAUNCHED]) || testbit(location[position].objects, LAND) || fuel > 0 && notes[LAUNCHED])
29 if (thataway) {
30 position = thataway;
31 newway(token);
32 time++;
33 }
34 else {
35 puts("You can't go this way.");
36 newway(token);
37 whichway(location[position]);
38 return(0);
39 }
40 else if (notes[CANTMOVE] && !notes[LAUNCHED])
a7c71d1e 41 puts("You aren't able to move; you better drop something.");
6bd0a3e3 42 else
a7c71d1e 43 puts("You are out of fuel; now you will rot in space forever!");
6bd0a3e3
EW
44 return(1);
45}
46
47convert(tothis) /* Converts day to night and vice versa. */
48int tothis; /* Day objects are permanent. Night objects are added*/
49{ /* at dusk, and subtracted at dawn. */
50 register struct objs *p;
a7c71d1e 51 register i, j;
6bd0a3e3 52
a7c71d1e
EW
53 if (tothis == TONIGHT) {
54 for (i = 1; i <= NUMOFROOMS; i++)
55 for (j = 0; j < NUMOFWORDS; j++)
56 nightfile[i].objects[j] = dayfile[i].objects[j];
6bd0a3e3 57 for (p = nightobjs; p->room != 0; p++)
a7c71d1e
EW
58 setbit(nightfile[p->room].objects, p->obj);
59 location = nightfile;
6bd0a3e3 60 } else {
a7c71d1e
EW
61 for (i = 1; i <= NUMOFROOMS; i++)
62 for (j = 0; j < NUMOFWORDS; j++)
63 dayfile[i].objects[j] = nightfile[i].objects[j];
6bd0a3e3 64 for (p = nightobjs; p->room != 0; p++)
a7c71d1e
EW
65 clearbit(dayfile[p->room].objects, p->obj);
66 location = dayfile;
6bd0a3e3
EW
67 }
68}
69
70news()
71{
72 register int n;
73 int hurt;
74
75 if (time > 30 && position < 32){
76 puts("An explosion of shuddering magnitude splinters bulkheads and");
77 puts("ruptures the battlestar's hull. You are sucked out into the");
a7c71d1e 78 puts("frozen void of space and killed.");
6bd0a3e3
EW
79 die();
80 }
81 if (time > 20 && position < 32)
82 puts("Explosions rock the battlestar.");
83 if (time > snooze){
84 puts("You drop from exhaustion...");
85 zzz();
86 }
87 if (time > snooze - 5)
a7c71d1e
EW
88 puts("You're getting tired.");
89 if (time > (rythmn + CYCLE)) {
90 if (location == nightfile) {
91 convert(TODAY);
92 if (OUTSIDE && time - rythmn - CYCLE < 10) {
93 puts("Dew lit sunbeams stretch out from a watery sunrise and herald the dawn.");
94 puts("You awake from a misty dream-world into stark reality.");
95 puts("It is day.");
96 }
97 } else {
98 convert(TONIGHT);
99 clearbit(location[POOLS].objects, BATHGOD);
100 if (OUTSIDE && time - rythmn - CYCLE < 10) {
101 puts("The dying sun sinks into the ocean, leaving a blood stained sunset.");
102 puts("The sky slowly fades from orange to violet to black. A few stars");
103 puts("flicker on, and it is night.");
104 puts("The world seems completly different at night.");
105 }
6bd0a3e3 106 }
a7c71d1e 107 rythmn = time - time % CYCLE;
6bd0a3e3
EW
108 }
109 if (!wiz && !tempwiz)
110 if ((testbit(inven,TALISMAN) || testbit(wear,TALISMAN)) && (testbit(inven,MEDALION) || testbit(wear,MEDALION)) && (testbit(inven,AMULET) || testbit(wear,AMULET))){
111 tempwiz = 1;
a7c71d1e 112 puts("The three amulets glow and reenforce each other in power.\nYou are now a wizard.");
6bd0a3e3
EW
113 }
114 if (testbit(location[position].objects,ELF)){
115 printf("%s\n",objdes[ELF]);
116 fight(ELF,rnd(30));
117 }
118 if (testbit(location[position].objects,DARK)){
119 printf("%s\n",objdes[DARK]);
120 fight(DARK,100);
121 }
122 if (testbit(location[position].objects,WOODSMAN)){
123 printf("%s\n",objdes[WOODSMAN]);
124 fight(WOODSMAN,50);
125 }
126 switch(position){
127
128 case 267:
129 case 257: /* entering a cave */
130 case 274:
131 case 246:
132 notes[CANTSEE] = 1;
133 break;
134 case 160:
135 case 216: /* leaving a cave */
136 case 230:
137 case 231:
138 case 232:
139 notes[CANTSEE] = 0;
140 break;
141 }
142 if (testbit(location[position].objects, GIRL))
143 meetgirl = 1;
144 if (meetgirl && CYCLE * 1.5 - time < 10){
145 setbit(location[GARDEN].objects,GIRLTALK);
146 setbit(location[GARDEN].objects,LAMPON);
147 setbit(location[GARDEN].objects,ROPE);
148 }
149 if (position == DOCK && (beenthere[position] || time > CYCLE)){
150 clearbit(location[DOCK].objects, GIRL);
151 clearbit(location[DOCK].objects,MAN);
152 }
153 if (meetgirl && time - CYCLE * 1.5 > 10){
154 clearbit(location[GARDEN].objects,GIRLTALK);
155 clearbit(location[GARDEN].objects,LAMPON);
156 clearbit(location[GARDEN].objects,ROPE);
157 meetgirl = 0;
158 }
159 if (testbit(location[position].objects,CYLON)){
160 puts("Oh my God, you're being shot at by an alien spacecraft!");
161 printf("The targeting computer says we have %d seconds to attack!\n",clock);
162 fflush(stdout);
a7c71d1e 163 sleep(1);
6bd0a3e3
EW
164 if (!visual()){
165 hurt = rnd(NUMOFINJURIES);
166 injuries[hurt] = 1;
a7c71d1e 167 puts("Laser blasts sear the cockpit, and the alien veers off in a victory roll.");
6bd0a3e3
EW
168 puts("The viper shudders under a terrible explosion.");
169 printf("I'm afraid you have suffered %s.\n", ouch[hurt]);
170 }
171 else
172 clearbit(location[position].objects,CYLON);
173 }
174 if (injuries[SKULL] && injuries[INCISE] && injuries[NECK]){
175 puts("I'm afraid you have suffered fatal injuries.");
176 die();
177 }
178 for (n=0; n < NUMOFINJURIES; n++)
179 if (injuries[n] == 1){
180 injuries[n] = 2;
181 if (WEIGHT > 5)
182 WEIGHT -= 5;
183 else
184 WEIGHT = 0;
185 }
186 if (injuries[ARM] == 2){
187 CUMBER -= 5;
188 injuries[ARM]++;
189 }
190 if (injuries[RIBS] == 2){
191 CUMBER -= 2;
192 injuries[RIBS]++;
193 }
194 if (injuries[SPINE] == 2){
195 WEIGHT = 0;
196 injuries[SPINE]++;
197 }
198 if (carrying > WEIGHT || encumber > CUMBER)
199 notes[CANTMOVE] = 1;
200 else
201 notes[CANTMOVE] = 0;
202}
203
204crash()
205{
206 int hurt1,hurt2;
207
208 fuel--;
209 if (!location[position].flyhere || (testbit(location[position].objects,LAND) && fuel <= 0)){
210 if (!location[position].flyhere)
211 puts("You're flying too low. We're going to crash!");
212 else{
213 puts("You're out of fuel. We'll have to crash land!");
214 if (!location[position].down){
a7c71d1e 215 puts("Your viper strikes the ground and explodes into firey fragments.");
6bd0a3e3
EW
216 puts("Thick black smoke billows up from the wreckage.");
217 die();
218 }
219 position = location[position].down;
220 }
221 notes[LAUNCHED] = 0;
222 setbit(location[position].objects,CRASH);
223 time += rnd(CYCLE/4);
224 puts("The viper explodes into the ground and you lose consciousness...");
225 zzz();
226 hurt1 = rnd(NUMOFINJURIES - 2) + 2;
227 hurt2 = rnd(NUMOFINJURIES - 2) + 2;
228 injuries[hurt1] = 1;
229 injuries[hurt2] = 1;
230 injuries[0] = 1; /* abrasions */
231 injuries[1] = 1; /* lacerations */
232 printf("I'm afraid you have suffered %s and %s.\n",ouch[hurt1],ouch[hurt2]);
233 }
234}