|
|
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.