Annotation of researchv10no/games/trek/events.c, revision 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.