|
|
1.1 root 1: /*
2: * Copyright (c) 1983 Regents of the University of California.
3: * All rights reserved. The Berkeley software License Agreement
4: * specifies the terms and conditions for redistribution.
5: */
6:
7: #ifndef lint
8: static char sccsid[] = "@(#)dr_2.c 5.1 (Berkeley) 5/29/85";
9: #endif not lint
10:
11: #include "driver.h"
12:
13: #define couldwin(f,t) (f->specs->crew2 > t->specs->crew2 * 1.5)
14:
15: thinkofgrapples()
16: {
17: register struct ship *sp, *sq;
18: char friendly;
19:
20: foreachship(sp) {
21: if (sp->file->captain[0] || sp->file->dir == 0)
22: continue;
23: foreachship(sq) {
24: friendly = sp->nationality == capship(sq)->nationality;
25: if (!friendly) {
26: if (sp->file->struck || sp->file->captured != 0)
27: continue;
28: if (range(sp, sq) != 1)
29: continue;
30: if (grappled2(sp, sq))
31: if (toughmelee(sp, sq, 0, 0))
32: ungrap(sp, sq);
33: else
34: grap(sp, sq);
35: else if (couldwin(sp, sq)) {
36: grap(sp, sq);
37: sp->file->loadwith = L_GRAPE;
38: }
39: } else
40: ungrap(sp, sq);
41: }
42: }
43: }
44:
45: checkup()
46: {
47: register struct ship *sp, *sq;
48: register char explode, sink;
49:
50: foreachship(sp) {
51: if (sp->file->dir == 0)
52: continue;
53: explode = sp->file->explode;
54: sink = sp->file->sink;
55: if (explode != 1 && sink != 1)
56: continue;
57: if (die() < 5)
58: continue;
59: Write(sink == 1 ? W_SINK : W_EXPLODE, sp, 0, 2, 0, 0, 0);
60: Write(W_DIR, sp, 0, 0, 0, 0, 0);
61: if (snagged(sp))
62: foreachship(sq)
63: cleansnag(sp, sq, 1);
64: if (sink != 1) {
65: makesignal(sp, "exploding!", (struct ship *)0);
66: foreachship(sq) {
67: if (sp != sq && sq->file->dir && range(sp, sq) < 4)
68: table(RIGGING, L_EXPLODE, sp->specs->guns/13, sq, sp, 6);
69: }
70: } else
71: makesignal(sp, "sinking!", (struct ship *)0);
72: }
73: }
74:
75: prizecheck()
76: {
77: register struct ship *sp;
78:
79: foreachship(sp) {
80: if (sp->file->captured == 0)
81: continue;
82: if (sp->file->struck || sp->file->dir == 0)
83: continue;
84: if (sp->specs->crew1 + sp->specs->crew2 + sp->specs->crew3 > sp->file->pcrew * 6) {
85: Write(W_SIGNAL, sp, 1,
86: (int)"prize crew overthrown", 0, 0, 0);
87: Write(W_POINTS, sp->file->captured, 0, sp->file->captured->file->points - 2 * sp->specs->pts, 0, 0, 0);
88: Write(W_CAPTURED, sp, 0, -1, 0, 0, 0);
89: }
90: }
91: }
92:
93: strend(str)
94: char *str;
95: {
96: register char *p;
97:
98: for (p = str; *p; p++)
99: ;
100: return p == str ? 0 : p[-1];
101: }
102:
103: closeon(from, to, command, ta, ma, af)
104: register struct ship *from, *to;
105: char command[];
106: int ma, ta, af;
107: {
108: int high;
109: char temp[10];
110:
111: temp[0] = command[0] = '\0';
112: high = -30000;
113: try(command, temp, ma, ta, af, ma, from->file->dir, from, to, &high, 0);
114: }
115:
116: int dtab[] = {0,1,1,2,3,4,4,5}; /* diagonal distances in x==y */
117:
118: score(movement, ship, to, onlytemp)
119: char movement[];
120: register struct ship *ship, *to;
121: char onlytemp;
122: {
123: char drift;
124: int row, col, dir, total, ran;
125: register struct File *fp = ship->file;
126:
127: if ((dir = fp->dir) == 0)
128: return 0;
129: row = fp->row;
130: col = fp->col;
131: drift = fp->drift;
132: move(movement, ship, &fp->dir, &fp->row, &fp->col, &drift);
133: if (!*movement)
134: (void) strcpy(movement, "d");
135:
136: ran = range(ship, to);
137: total = -50 * ran;
138: if (ran < 4 && gunsbear(ship, to))
139: total += 60;
140: if ((ran = portside(ship, to, 1) - fp->dir) == 4 || ran == -4)
141: total = -30000;
142:
143: if (!onlytemp) {
144: fp->row = row;
145: fp->col = col;
146: fp->dir = dir;
147: }
148: return total;
149: }
150:
151: move(p, ship, dir, row, col, drift)
152: register char *p;
153: register struct ship *ship;
154: register char *dir;
155: register short *row, *col;
156: register char *drift;
157: {
158: int dist;
159: char moved = 0;
160:
161: for (; *p; p++) {
162: switch (*p) {
163: case 'r':
164: if (++*dir == 9)
165: *dir = 1;
166: break;
167: case 'l':
168: if (--*dir == 0)
169: *dir = 8;
170: break;
171: case '1': case '2': case '3': case '4':
172: case '5': case '6': case '7':
173: moved++;
174: if (*dir % 2 == 0)
175: dist = dtab[*p - '0'];
176: else
177: dist = *p - '0';
178: *row -= dr[*dir] * dist;
179: *col -= dc[*dir] * dist;
180: break;
181: }
182: }
183: if (!moved) {
184: if (windspeed != 0 && ++*drift > 2) {
185: if (ship->specs->class >= 3 && !snagged(ship)
186: || (turn & 1) == 0) {
187: *row -= dr[winddir];
188: *col -= dc[winddir];
189: }
190: }
191: } else
192: *drift = 0;
193: }
194:
195: try(command, temp, ma, ta, af, vma, dir, f, t, high, rakeme)
196: register struct ship *f, *t;
197: int ma, ta, af, *high, rakeme;
198: char command[], temp[];
199: {
200: register int new, n;
201: char st[4];
202: #define rakeyou (gunsbear(f, t) && !gunsbear(t, f))
203:
204: if ((n = strend(temp)) < '1' || n > '9')
205: for (n = 1; vma - n >= 0; n++) {
206: (void) sprintf(st, "%d", n);
207: (void) strcat(temp, st);
208: new = score(temp, f, t, rakeme);
209: if (new > *high && (!rakeme || rakeyou)) {
210: *high = new;
211: (void) strcpy(command, temp);
212: }
213: try(command, temp, ma-n, ta, af, vma-n,
214: dir, f, t, high, rakeme);
215: rmend(temp);
216: }
217: if (ma > 0 && ta > 0 && (n = strend(temp)) != 'l' && n != 'r' || !strlen(temp)) {
218: (void) strcat(temp, "r");
219: new = score(temp, f, t, rakeme);
220: if (new > *high && (!rakeme || gunsbear(f, t) && !gunsbear(t, f))) {
221: *high = new;
222: (void) strcpy(command, temp);
223: }
224: try(command, temp, ma-1, ta-1, af, min(ma-1, maxmove(f, (dir == 8 ? 1 : dir+1), 0)), (dir == 8 ? 1 : dir+1),f,t,high,rakeme);
225: rmend(temp);
226: }
227: if ((ma > 0 && ta > 0 && (n = strend(temp)) != 'l' && n != 'r') || !strlen(temp)){
228: (void) strcat(temp, "l");
229: new = score(temp, f, t, rakeme);
230: if (new > *high && (!rakeme || (gunsbear(f, t) && !gunsbear(t, f)))){
231: *high = new;
232: (void) strcpy(command, temp);
233: }
234: try(command, temp, ma-1, ta-1, af, (min(ma-1,maxmove(f, (dir-1 ? dir-1 : 8), 0))), (dir-1 ? dir -1 : 8), f, t, high, rakeme);
235: rmend(temp);
236: }
237: }
238:
239: rmend(str)
240: char *str;
241: {
242: register char *p;
243:
244: for (p = str; *p; p++)
245: ;
246: if (p != str)
247: *--p = 0;
248: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.