|
|
1.1 root 1: # include "trek.h"
2:
3: /**
4: ** cause time to elapse
5: **/
6:
7: /* snapshot for time warps */
8: char Snapshot[14 + sizeof Quad + sizeof Event + sizeof Base + sizeof Etc];
9:
10: double randly(evname)
11: int evname;
12: {
13: return(Param.eventdly[evname] * franf());
14: }
15:
16: double logdly(evname)
17: int evname;
18: {
19: double d;
20:
21: d = Param.eventdly[evname] * Initial.time * log(franf());
22: if(evname==E_LRTB) d =/ Status.kling;
23: return(-d);
24: }
25:
26: events()
27: {
28: register int i;
29: int j;
30: int restcancel;
31: KLINGONS *k;
32: double rtime;
33: double xdate;
34: double idate;
35: EVENT *ev;
36: int ix, iy;
37: register QUAD *q;
38: register EVENT *e;
39: int evnum;
40:
41: if (Move.delta <= 0.0)
42: {
43: Status.time = Status.resource / Status.kling;
44: return;
45: }
46: idate = Status.date;
47: if (Move.delta > 0.5 && Move.resting)
48: schedule(E_ATTACK, 0.5, 0, 0, 0);
49: while (1)
50: {
51: restcancel = 0;
52: evnum = -1;
53: xdate = idate + Move.delta;
54: for (i = 0; i < MAXEVENTS; i++)
55: {
56: e = &Event[i];
57: if (e->evcode < 0)
58: continue;
59: if (e->date < xdate)
60: {
61: xdate = e->date;
62: ev = e;
63: evnum = i;
64: }
65: }
66: rtime = xdate - Status.date;
67: Status.resource =- Status.kling * rtime;
68: Status.time = Status.resource / Status.kling;
69: Status.date = xdate;
70: if (Status.time <= 0.0)
71: lose(L_NOTIME);
72: if (evnum < 0)
73: break;
74: e = ev;
75: switch (e->evcode)
76: {
77: case E_SNOVA: /* supernova */
78: snova(-1);
79: reschedule(e, logdly(E_SNOVA));
80: break;
81:
82: case E_LRTB: /* long range tractor beam */
83: if (Status.cond != DOCKED && Nkling < 3)
84: {
85: i = ranf(Status.kling) + 1;
86: for (ix = 0; ix < NQUADS; ix++)
87: {
88: for (iy = 0; iy < NQUADS; iy++)
89: if (Quad[ix][iy].stars >= 0)
90: if ((i =- Quad[ix][iy].qkling) <= 0)
91: break;
92: if (i <= 0)
93: break;
94: }
95: Quadx = ix;
96: Quady = iy;
97: printf("%s caught in long range tractor beam", Status.shipname);
98: printf("; pulled to quadrant %d,%d\n", Quadx, Quady);
99: Sectx = ranf(NSECTS);
100: Secty = ranf(NSECTS);
101: initquad(0);
102: Move.delta = xdate - idate;
103: }
104: reschedule(e, logdly(E_LRTB));
105: break;
106:
107: case E_KATSB: /* Klingon attacks starbase */
108: if (Status.bases <= 0)
109: {
110: unschedule(e);
111: break;
112: }
113: i = 1;
114: for (ix = 0; ix < NQUADS; ix++)
115: {
116: for (iy = 0; iy < NQUADS; iy++)
117: if (Quad[ix][iy].bases > 0 && Quad[ix][iy].qkling > 0)
118: {
119: i = 0;
120: break;
121: }
122: if (!i)
123: break;
124: }
125: reschedule(e, logdly(E_KATSB));
126: if (i) break;
127: e = schedule(E_KDESB, 0.5 + randly(E_KDESB), ix, iy, 0);
128: if (!Damage[SSRADIO])
129: {
130: printf("Uhura:\tCaptain, we have recieved a distress signal\n");
131: printf("\tfrom the starbase in quadrant %d,%d.\n",
132: ix, iy);
133: restcancel++;
134: }
135: else
136: e->evdata = E_NREPORT;
137: break;
138:
139: case E_KDESB: /* Klingon destroys starbase */
140: unschedule(e);
141: q = &Quad[e->x][e->y];
142: if (q->bases <=0 || q->qkling <= 0)
143: break;
144: if (e->x == Quadx && e->y == Quady)
145: {
146: printf("\nSpock: ");
147: killb(Quadx, Quady);
148: }
149: else
150: killb(e->x, e->y);
151: break;
152:
153: case E_ISSUE: /* issue a distress call */
154: reschedule(e, logdly(E_ISSUE));
155: if (Status.distressed >= MAXDISTR)
156: break;
157: for (i = 0; i < 100; i++)
158: {
159: ix = ranf(NQUADS);
160: iy = ranf(NQUADS);
161: q = &Quad[ix][iy];
162: if (!((ix == Quadx && iy == Quady) || q->stars < 0 ||
163: q->systemname&(Q_DISTRESS|Q_GHOST) ||
164: q->systemname == 0 || q->qkling <= 0))
165: break;
166: }
167: if (i >= 100)
168: break;
169: Status.distressed =+ 1;
170: e = schedule(E_ENSLV, randly(E_ENSLV), ix, iy, q->systemname);
171: q->systemname = (e - Event) | Q_DISTRESS;
172: if (!Damage[SSRADIO])
173: {
174: printf("Uhura:\tCaptain, starsystem %s in quadrant %d,%d is under attack.\n",
175: Systemname[e->evdata], ix, iy);
176: restcancel++;
177: }
178: else
179: e->evdata =| E_NREPORT;
180: break;
181:
182: case E_ENSLV: /* starsystem is enslaved */
183: unschedule(e);
184: /* see if current distress call still active */
185: q = &Quad[e->x][e->y];
186: if (q->qkling <= 0)
187: {
188: e->evdata =& ~E_NREPORT;
189: if(q->systemname&Q_DISTRESS)
190: q->systemname = e->evdata;
191: break;
192: }
193: else
194: schedule(E_REPRO, randly(E_REPRO), e->x, e->y, e->evdata);
195: if (!Damage[SSRADIO])
196: {
197: printf("Uhura:\tWe've lost contact with starsystem %s\n",
198: Systemname[e->evdata]);
199: printf(" in quadrant %d,%d.\n",
200: e->x, e->y);
201: }
202: break;
203:
204: case E_REPRO: /* Klingon reproduces */
205: /* see if distress call is still active */
206: q = &Quad[e->x][e->y];
207: if (q->qkling <= 0)
208: {
209: unschedule(e);
210: if (q->systemname&Q_DISTRESS)
211: q->systemname = e->evdata;
212: break;
213: }
214: reschedule(e, randly(E_REPRO));
215: /* reproduce one Klingon */
216: ix = e->x;
217: iy = e->y;
218: if (Status.kling == 127)
219: break; /* full right now */
220: if (q->qkling >= 9)
221: {
222: /* this quadrant not ok */
223: for (i = ix - 1; i <= ix + 1; i++)
224: {
225: if (i < 0 || i >= NQUADS)
226: continue;
227: for (j = iy - 1; j <= iy + 1; j++)
228: {
229: if (j < 0 || j >= NQUADS)
230: continue;
231: q = &Quad[i][j];
232: if (q->qkling >= 9 || q->stars < 0)
233: continue;
234: break;
235: }
236: if (j <= iy + 1)
237: break;
238: }
239: if (j > iy + 1)
240: /* cannot create another yet */
241: break;
242: ix = i;
243: iy = j;
244: }
245: q->qkling =+ 1;
246: Status.kling =+ 1;
247: if (ix == Quadx && iy == Quady)
248: {
249: /* we must position Klingon */
250: sector(&ix, &iy);
251: Sect[ix][iy] = KLINGON;
252: k = &Kling[Nkling++];
253: k->x = ix;
254: k->y = iy;
255: k->power = Param.klingpwr;
256: compkldist(Kling[0].dist == Kling[0].avgdist ? 0 : 1);
257: }
258: Status.time = Status.resource / Status.kling;
259: break;
260:
261: case E_SNAP:
262: reschedule(e, logdly(E_SNAP));
263: i = &Snapshot;
264: i = bmove(&Status.bases, i, 2);
265: i = bmove(&Status.date, i, 12);
266: i = bmove(&Quad, i, sizeof Quad);
267: i = bmove(&Event, i, sizeof Event);
268: i = bmove(&Base, i, sizeof Base);
269: i = bmove(&Etc, i, sizeof Etc);
270: Game.snap = 1;
271: break;
272:
273: case E_ATTACK: /* Klingons attack during rest period */
274: if (!Move.resting)
275: {
276: unschedule(e);
277: break;
278: }
279: attack(1);
280: reschedule(e, 0.5);
281: break;
282:
283: case E_FIXDV:
284: i = e->evdata;
285: unschedule(e);
286: Damage[i] = 0;
287: printf("%s reports repair work on the %s finished.\n",
288: Device[i].person, Device[i].name);
289: switch (i)
290: {
291: case LIFESUP:
292: Status.reserves = Initial.reserves;
293: break;
294:
295: case SINS:
296: if (Status.cond == DOCKED)
297: break;
298: printf("Spock has tried to recalibrate your Space Internal Navigation System,\n");
299: printf(" but he has no standard base to calibrate to. Suggest you get\n");
300: printf(" to a starbase immediately so that you can properly recalibrate.\n");
301: Status.sinsbad = 1;
302: break;
303:
304: case SSRADIO:
305: restcancel = dumpssradio();
306: break;
307: }
308: break;
309:
310: default:
311: break;
312: }
313:
314: if(Move.resting && restcancel && getynpar("Spock: Shall we cancel our rest period"))
315: Move.delta = xdate - idate;
316: }
317:
318: if (e = Etc.eventptr[E_ATTACK])
319: unschedule(e);
320: if (Status.cloaked)
321: Status.energy =- Param.cloakenergy * Move.delta;
322: rtime = 1.0 - exp(-Param.regenfac * Move.delta);
323: Status.shield =+ (Initial.shield - Status.shield) * rtime;
324: Status.energy =+ (Initial.energy - Status.energy) * rtime;
325: if (Damage[LIFESUP] && Status.cond != DOCKED)
326: Status.reserves =- Move.delta;
327: return;
328: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.