|
|
1.1 root 1: #ifndef lint
2: static char *sccsid = "@(#)driver2.c 1.1 83/03/17";
3: #endif
4: #define EXPLODE 5
5: #include "externs.h"
6:
7: #define couldwin(from, to) (specs[scene[game].ship[from].shipnum].crew2 > specs[scene[game].ship[to].shipnum].crew2 * 1.5)
8:
9: thinkofgrapples()
10: {
11: register int n, l, friendly;
12:
13: for (n=0; n < scene[game].vessels; n++){
14: if (!scene[game].ship[n].file -> captain[0] && pos[n].dir){
15: for (l=0; l < scene[game].vessels; l++){
16: if ((friendly = scene[game].ship[l].file -> captured) < 0)
17: friendly = scene[game].ship[n].nationality == scene[game].ship[l].nationality;
18: else
19: friendly = scene[game].ship[n].nationality == scene[game].ship[friendly].nationality;
20: if (!friendly){
21: if (range(n,l) == 1 && !scene[game].ship[n].file -> struck && scene[game].ship[n].file -> captured < 0){
22: if (grapple(n,l))
23: if (toughmelee(n,l,0,0))
24: ungrap(n, l);
25: else
26: grap(n, l);
27: else if (couldwin(n,l)){
28: grap(n, l);
29: loadwith[n] = GRAPE;
30: }
31: }
32: }
33: else
34: ungrap(n,l);
35: }
36: }
37: }
38: }
39:
40:
41: checkup()
42: {
43: register int k, n, explode, sink;
44:
45: readpos();
46: for (n=0; n < scene[game].vessels; n++){
47: explode = scene[game].ship[n].file -> explode;
48: sink = scene[game].ship[n].file -> sink;
49: if (die() >= 5 && (explode == 1 || sink == 1)){
50: explode = 2;
51: if (sink != 1)
52: Write(FILES + n, 0, 232, explode);
53: else
54: Write(FILES + n, 0, 234, explode);
55: pos[n].dir = 0; /* hopefully enough to kill ship */
56: Write(n, 0, 10, 0);
57: if (fouled(n) || grappled(n)){
58: for (k=0; k < 10; k++){
59: if (scene[game].ship[n].file -> fouls[k].turnfoul)
60: cleanfoul(n,scene[game].ship[n].file -> fouls[k].toship,k);
61: }
62: for (k=0; k < 10; k++){
63: if (scene[game].ship[n].file -> grapples[k].turnfoul)
64: cleangrapple(n,scene[game].ship[n].file -> grapples[k].toship,k);
65: }
66: }
67: if (sink != 1){
68: makesignal("exploding!", 0, n);
69: for (k=0; k < scene[game].vessels; k++)
70: if (k != n && pos[k].dir && range(n,k) < 4)
71: table(RIGGING, EXPLODE, specs[scene[game].ship[n].shipnum].guns/13, k, n, 6);
72: }
73: else {
74: makesignal("sinking!", 0, n);
75: }
76: }
77: }
78: }
79:
80: prizecheck()
81: {
82: register int n, captured, pc, prisoners, points;
83: struct shipspecs *ptr;
84: struct File *ptr1;
85:
86: for (n=0; n < scene[game].vessels; n++){
87: ptr1 = scene[game].ship[n].file;
88: if ((captured = ptr1 -> captured) > -1 && !scene[game].ship[n].file -> struck && pos[n].dir){
89: ptr = &specs[scene[game].ship[n].shipnum];
90: points = scene[game].ship[captured].file -> points;
91: prisoners = ptr -> crew1 + ptr -> crew2 + ptr -> crew3;
92: if (prisoners > ptr1 -> pcrew * 6){
93: Write(FILES + n, 0, 68,-1);
94: points -= 2 * ptr -> pts;
95: Write(FILES + n, 1, 164, "prize crew overthrown");
96: Write(FILES + captured, 0, 20, points);
97: }
98: }
99: }
100: }
101:
102: char strend(str)
103: char *str;
104: {
105: register int n;
106:
107: for (n=0; *(str+n); n++);
108: return( n ? *(str + n -1) : 0);
109: }
110:
111:
112: closeon(fromship, toship, command, ta, ma, af)
113: int fromship, toship, ma, ta, af;
114: char command[10];
115: {
116: int high;
117: char temp[10];
118:
119: temp[0] = command[0] = '\0';
120: high = -30000;
121: try(command, temp, ma, ta, af, ma, pos[fromship].dir, fromship, toship, &high, 0);
122: }
123:
124: int dtab[8] = {0,1,1,2,3,4,4,5}; /* diagonal distances in x==y */
125:
126: score(movement,shipnum, toship, permanent, onlytemp)
127: int shipnum, toship, permanent, onlytemp;
128: char movement[10];
129: {
130: int drift, row, col, dir, n, dist, total, ran;
131: int dr = 0, dc = 0;
132:
133: if (dir = pos[shipnum].dir){
134: row = pos[shipnum].row;
135: col = pos[shipnum].col;
136: for (n=0; movement[n]; n++)
137: switch(movement[n]){
138: case 'r':
139: if ((++pos[shipnum].dir) == 9)
140: pos[shipnum].dir = 1;
141: break;
142: case 'l':
143: if (!(--pos[shipnum].dir))
144: pos[shipnum].dir = 8;
145: break;
146: case '1':
147: case '2':
148: case '3':
149: case '4':
150: case '5':
151: case '6':
152: case '7':
153: drdc(&dr, &dc, pos[shipnum].dir);
154: if (!(pos[shipnum].dir % 2))
155: dist = dtab[movement[n] - '0'];
156: else
157: dist = movement[n] - '0';
158: pos[shipnum].row -= dr * dist;
159: pos[shipnum].col -= dc * dist;
160: dr = dc = 0;
161: break;
162: }
163: drift = scene[game].ship[shipnum].file -> drift;
164: if (!windspeed) drift = 1;
165: if (row == pos[shipnum].row && col == pos[shipnum].col){
166: drift++;
167: if (drift > 2){
168: drdc(&dr, &dc, winddir);
169: dist = 1 - ((specs[scene[game].ship[shipnum].shipnum].class < 3 || fouled(shipnum) || grappled(shipnum)) && turn % 2);
170: pos[shipnum].row -= dr * dist;
171: pos[shipnum].col -= dc * dist;
172: if (permanent)
173: strcat(movement, "d");
174: }
175: }
176: else
177: drift = 0;
178: ran = range(shipnum, toship);
179: total = -50*ran;
180: if (ran < 4 && gunsbear(shipnum, toship))
181: total += 60;
182: if ((ran = portside(shipnum, toship, 1) - pos[shipnum].dir) == 4 || ran == -4)
183: total = -30000;
184: if (!*movement) strcpy(movement, "d");
185: if (permanent){
186: if (drift != scene[game].ship[shipnum].file -> drift)
187: Write(FILES + shipnum, 0, 82, drift);
188: if (pos[shipnum].row != scene[game].ship[shipnum].shiprow)
189: Write(shipnum, 0, 6, pos[shipnum].row);
190: if (pos[shipnum].col != scene[game].ship[shipnum].shipcol)
191: Write(shipnum, 0, 8, pos[shipnum].col);
192: if (pos[shipnum].dir != scene[game].ship[shipnum].shipdir)
193: Write(shipnum, 0, 10, pos[shipnum].dir);
194: }
195: if (!onlytemp){
196: pos[shipnum].row = row;
197: pos[shipnum].col = col;
198: pos[shipnum].dir = dir;
199: }
200: return(total);
201: }
202: return(0);
203: }
204:
205: try(command, temp,ma, ta, af, vma, dir, shipnum, toship, high, rakeme)
206: int ma, ta, af, shipnum, toship, *high, rakeme;
207: char command[10], temp[10];
208: {
209: register int new, n;
210: char st[4];
211:
212: if ((n = strend(temp)) < '1' || n > '9')
213: for(n = 1; vma - n >= 0; n++){
214: sprintf(st, "%d", n);
215: strcat(temp, st);
216: new = score(temp, shipnum, toship, 0, rakeme);
217: if (new > *high && (!rakeme || (gunsbear(shipnum, toship) && !gunsbear(toship, shipnum)))){
218: *high = new;
219: strcpy(command, temp);
220: }
221: try(command, temp, ma-n, ta, af, vma-n, dir, shipnum, toship, high, rakeme);
222: rmend(temp);
223: }
224: if ((ma > 0 && ta > 0 && (n = strend(temp)) != 'l' && n != 'r') || !lengthof(temp)){
225: strcat(temp, "r");
226: new = score(temp, shipnum, toship, 0, rakeme);
227: if (new > *high && (!rakeme || (gunsbear(shipnum, toship) && !gunsbear(toship, shipnum)))){
228: *high = new;
229: strcpy(command, temp);
230: }
231: try(command, temp, ma-1, ta-1, af, (min(ma-1,maxmove(shipnum, (dir == 8 ? 1 : dir+1), 0))), (dir == 8 ? 1 : dir+1),shipnum,toship,high,rakeme);
232: rmend(temp);
233: }
234: if ((ma > 0 && ta > 0 && (n = strend(temp)) != 'l' && n != 'r') || !lengthof(temp)){
235: strcat(temp, "l");
236: new = score(temp, shipnum, toship, 0, rakeme);
237: if (new > *high && (!rakeme || (gunsbear(shipnum, toship) && !gunsbear(toship, shipnum)))){
238: *high = new;
239: strcpy(command, temp);
240: }
241: try(command, temp, ma-1, ta-1, af, (min(ma-1,maxmove(shipnum, (dir-1 ? dir-1 : 8), 0))), (dir-1 ? dir -1 : 8), shipnum, toship, high, rakeme);
242: rmend(temp);
243: }
244: }
245:
246:
247: closestenemy(fromship, side, anyship) /*returns the NUMBER of the closest ship*/
248: int fromship;
249: char side, anyship;
250: {
251: register int n, olddist = 30000, ident, captured;
252: register int dist, eclosest = 30000;
253:
254: if ((ident = scene[game].ship[fromship].file -> captured) < 0)
255: ident = fromship;
256: for (n=0; n < scene[game].vessels; n++){
257: if ((captured = scene[game].ship[n].file -> captured) < 0)
258: captured = n;
259: if (n != fromship && pos[n].dir && (scene[game].ship[ident].nationality != scene[game].ship[captured].nationality || anyship)){
260: if (!side || gunsbear(fromship, n) == side){
261: dist = range(fromship, n);
262: if (dist < olddist){
263: eclosest = n;
264: olddist = dist;
265: }
266: }
267: }
268: }
269: return(eclosest);
270: }
271:
272: choke()
273: {
274: }
275:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.