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