xref: /original-bsd/games/battlestar/com1.c (revision fbb2a877)
1 /*
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
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.
16  */
17 
18 #ifndef lint
19 static char sccsid[] = "@(#)com1.c	5.2 (Berkeley) 06/19/88";
20 #endif /* not lint */
21 
22 #include "externs.h"
23 
24 move(thataway, token)
25 int 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])
41 		puts("You aren't able to move; you better drop something.");
42 	else
43 		puts("You are out of fuel; now you will rot in space forever!");
44 	return(1);
45 }
46 
47 convert(tothis)		/* Converts day to night and vice versa. 	    */
48 int tothis;		/* Day objects are permanent.  Night objects are added*/
49 {			/* at dusk, and subtracted at dawn.		*/
50 	register struct objs *p;
51 	register i, j;
52 
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];
57 		for (p = nightobjs; p->room != 0; p++)
58 			setbit(nightfile[p->room].objects, p->obj);
59 		location = nightfile;
60 	} else {
61 		for (i = 1; i <= NUMOFROOMS; i++)
62 			for (j = 0; j < NUMOFWORDS; j++)
63 				dayfile[i].objects[j] = nightfile[i].objects[j];
64 		for (p = nightobjs; p->room != 0; p++)
65 			clearbit(dayfile[p->room].objects, p->obj);
66 		location = dayfile;
67 	}
68 }
69 
70 news()
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");
78 		puts("frozen void of space and killed.");
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)
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 			}
106 		}
107 		rythmn = time - time % CYCLE;
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;
112 			puts("The three amulets glow and reenforce each other in power.\nYou are now a wizard.");
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);
163 		sleep(1);
164 		if (!visual()){
165 			hurt = rnd(NUMOFINJURIES);
166 			injuries[hurt] = 1;
167 			puts("Laser blasts sear the cockpit, and the alien veers off in a victory roll.");
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 
204 crash()
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){
215 				puts("Your viper strikes the ground and explodes into firey fragments.");
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 }
235