Annotation of researchv10no/games/trek/events.c, revision 1.1.1.1

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: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.