X-Git-Url: https://jxself.org/git/?p=super-star-trek.git;a=blobdiff_plain;f=events.c;h=589a83821ad22a3489a01dc0fb10334be4a3dbca;hp=5b75fae493312b78be4cca58510d331cddf99ae1;hb=6faaa79dff2fa3ceec44ef46b79e651f1bd9e0aa;hpb=5db6160de8bad4de189d3b54dd54011260c7a34f diff --git a/events.c b/events.c index 5b75fae..589a838 100644 --- a/events.c +++ b/events.c @@ -5,26 +5,20 @@ void events(void) { int ictbeam=0, ipage=0, istract=0, line, i=0, j, k, l, ixhold=0, iyhold=0; double fintim = game.state.date + Time, datemin, xtime, repair, yank=0; + int radio_was_broken; #ifdef DEBUG if (idebug) prout("EVENTS"); #endif - if (stdamtim == 1e30 && game.damage[DRADIO] != 0.0) { - /* chart will no longer be updated because radio is dead */ - stdamtim = game.state.date; - for (i=1; i <= GALSIZE ; i++) - for (j=1; j <= GALSIZE; j++) - if (game.starch[i][j] == 1) - game.starch[i][j] = game.state.galaxy[i][j]+SUPERNOVA_PLACE; - } + radio_was_broken = (game.damage[DRADIO] != 0.0); for (;;) { /* Select earliest extraneous event, line==0 if no events */ line = FSPY; if (alldone) return; datemin = fintim; - for (l=1; l<=NEVENTS; l++) + for (l = 1; l < NEVENTS; l++) if (game.future[l] < datemin) { line = l; datemin = game.future[l]; @@ -55,19 +49,15 @@ void events(void) if (game.damage[l] > 0.0 && l != DDRAY) game.damage[l] -= (game.damage[l]-repair > 0.0 ? repair : game.damage[l]); /* If radio repaired, update star chart and attack reports */ - if (stdamtim != 1e30 && game.damage[DRADIO] == 0.0) { - stdamtim = 1e30; + if (radio_was_broken && game.damage[DRADIO] == 0.0) { prout("Lt. Uhura- \"Captain, the sub-space radio is working and"); prout(" surveillance reports are coming in."); skip(1); - for (i=1; i <= GALSIZE ; i++) - for (j=1; j <= GALSIZE; j++) - if (game.starch[i][j] >= SUPERNOVA_PLACE) game.starch[i][j] = 1; if (iseenit==0) { attakreport(0); iseenit = 1; } - skip(1); + rechart(); prout(" The star chart is now up to date.\""); skip(1); } @@ -79,7 +69,7 @@ void events(void) ipage=1; snova(0,0); game.future[FSNOVA] = game.state.date + expran(0.5*intime); - if (game.state.galaxy[quadx][quady] == SUPERNOVA_PLACE) return; + if (game.state.galaxy[quadx][quady].supernova) return; break; case FSPY: /* Check with spy to see if S.C. should tractor beam */ if (game.state.nscrem == 0 || @@ -100,7 +90,7 @@ void events(void) case FTBEAM: /* Tractor beam */ if (line==FTBEAM) { if (game.state.remcom == 0) { - game.future[FTBEAM] = 1e30; + game.future[FTBEAM] = FOREVER; break; } i = Rand()*game.state.remcom+1.0; @@ -171,7 +161,7 @@ void events(void) /* Adjust finish time to time of tractor beaming */ fintim = game.state.date+Time; attack(0); - if (game.state.remcom <= 0) game.future[FTBEAM] = 1e30; + if (game.state.remcom <= 0) game.future[FTBEAM] = FOREVER; else game.future[FTBEAM] = game.state.date+Time+expran(1.5*intime/game.state.remcom); break; case FSNAP: /* Snapshot of the universe (for time warp) */ @@ -182,12 +172,12 @@ void events(void) case FBATTAK: /* Commander attacks starbase */ if (game.state.remcom==0 || game.state.rembase==0) { /* no can do */ - game.future[FBATTAK] = game.future[FCDBAS] = 1e30; + game.future[FBATTAK] = game.future[FCDBAS] = FOREVER; break; } i = 0; - for (j=1; j<=game.state.rembase; j++) { - for (k=1; k<=game.state.remcom; k++) + for_starbases(j) { + for_commanders(k) if (game.state.baseqx[j]==game.state.cx[k] && game.state.baseqy[j]==game.state.cy[k] && (game.state.baseqx[j]!=quadx || game.state.baseqy[j]!=quady) && (game.state.baseqx[j]!=game.state.isx || game.state.baseqy[j]!=game.state.isy)) { @@ -199,7 +189,7 @@ void events(void) if (j>game.state.rembase) { /* no match found -- try later */ game.future[FBATTAK] = game.state.date + expran(0.3*intime); - game.future[FCDBAS] = 1e30; + game.future[FCDBAS] = FOREVER; break; } /* commander + starbase combination found -- launch attack */ @@ -233,9 +223,9 @@ void events(void) } break; case FSCDBAS: /* Supercommander destroys base */ - game.future[FSCDBAS] = 1e30; + game.future[FSCDBAS] = FOREVER; isatb = 2; - if (!BASES(game.state.galaxy[game.state.isx][game.state.isy])) + if (!game.state.galaxy[game.state.isx][game.state.isy].starbase) break; /* WAS RETURN! */ ixhold = batx; iyhold = baty; @@ -243,12 +233,13 @@ void events(void) baty = game.state.isy; case FCDBAS: /* Commander succeeds in destroying base */ if (line==FCDBAS) { - game.future[FCDBAS] = 1e30; + game.future[FCDBAS] = FOREVER; /* find the lucky pair */ - for (i = 1; i <= game.state.remcom; i++) - if (game.state.cx[i]==batx && game.state.cy[i]==baty) break; + for_commanders(i) + if (game.state.cx[i]==batx && game.state.cy[i]==baty) + break; if (i > game.state.remcom || game.state.rembase == 0 || - !BASES(game.state.galaxy[batx][baty])) { + !game.state.galaxy[batx][baty].starbase) { /* No action to take after all */ batx = baty = 0; break; @@ -256,10 +247,9 @@ void events(void) } /* Code merges here for any commander destroying base */ /* Not perfect, but will have to do */ - if (game.starch[batx][baty] == -1) game.starch[batx][baty] = 0; /* Handle case where base is in same quadrant as starship */ if (batx==quadx && baty==quady) { - if (game.starch[batx][baty] >= SUPERNOVA_PLACE) game.starch[batx][baty] -= BASE_PLACE; + game.state.chart[batx][baty].starbase = FALSE; game.quad[basex][basey]= IHDOT; basex=basey=0; newcnd(); @@ -278,10 +268,11 @@ void events(void) prout(" has been destroyed by"); if (isatb==2) prout("the Klingon Super-Commander"); else prout("a Klingon Commander"); + game.state.chart[batx][baty].starbase = FALSE; } /* Remove Starbase from galaxy */ - game.state.galaxy[batx][baty] -= BASE_PLACE; - for (i=1; i <= game.state.rembase; i++) + game.state.galaxy[batx][baty].starbase = FALSE; + for_starbases(i) if (game.state.baseqx[i]==batx && game.state.baseqy[i]==baty) { game.state.baseqx[i]=game.state.baseqx[game.state.rembase]; game.state.baseqy[i]=game.state.baseqy[game.state.rembase]; @@ -312,21 +303,21 @@ void events(void) if (probecx != i || probecy != j) { probecx = i; probecy = j; - if (i < 1 || i > GALSIZE || j < 1 || j > GALSIZE || - game.state.galaxy[probecx][probecy] == SUPERNOVA_PLACE) { + if (!VALID_QUADRANT(i, j) || + game.state.galaxy[probecx][probecy].supernova) { // Left galaxy or ran into supernova if (game.damage[DRADIO]==0.0 || condit == IHDOCKED) { if (ipage==0) pause_game(1); ipage = 1; skip(1); proutn("Lt. Uhura- \"The deep space probe "); - if (i < 1 ||i > GALSIZE || j < 1 || j > GALSIZE) + if (!VALID_QUADRANT(j, i)) proutn("has left the galaxy"); else proutn("is no longer transmitting"); prout(".\""); } - game.future[FDSPROB] = 1e30; + game.future[FDSPROB] = FOREVER; break; } if (game.damage[DRADIO]==0.0 || condit == IHDOCKED) { @@ -340,16 +331,20 @@ void events(void) } /* Update star chart if Radio is working or have access to radio. */ - if (game.damage[DRADIO] == 0.0 || condit == IHDOCKED) - game.starch[probecx][probecy] = game.damage[DRADIO] > 0.0 ? - game.state.galaxy[probecx][probecy]+SUPERNOVA_PLACE : 1; + if (game.damage[DRADIO] == 0.0 || condit == IHDOCKED) { + game.state.chart[probecx][probecy].klingons = game.state.galaxy[probecx][probecy].klingons; + game.state.chart[probecx][probecy].starbase = game.state.galaxy[probecx][probecy].starbase; + game.state.chart[probecx][probecy].stars = game.state.galaxy[probecx][probecy].stars; + game.state.galaxy[probecx][probecy].charted = TRUE; + } proben--; // One less to travel if (proben == 0 && isarmed && - STARS(game.state.galaxy[probecx][probecy])) { + game.state.galaxy[probecx][probecy].stars) { /* lets blow the sucker! */ snova(1,0); - game.future[FDSPROB] = 1e30; - if (game.state.galaxy[quadx][quady] == SUPERNOVA_PLACE) return; + game.future[FDSPROB] = FOREVER; + if (game.state.galaxy[quadx][quady].supernova) + return; } break; } @@ -406,7 +401,8 @@ void wait(void) if (origTime-delay >= 9.99 && condit == IHDOCKED) game.damage[DDRAY] = 0.0; } while - (game.state.galaxy[quadx][quady] != SUPERNOVA_PLACE); // leave if quadrant supernovas + // leave if quadrant supernovas + (!game.state.galaxy[quadx][quady].supernova); resting = 0; Time = 0; @@ -428,7 +424,7 @@ void nova(int ix, int iy) game.quad[ix][iy] = IHDOT; crmena(1, IHSTAR, 2, ix, iy); prout(" novas."); - game.state.galaxy[quadx][quady] -= 1; + game.state.galaxy[quadx][quady].stars--; game.state.starkl++; /* Set up stack to recursively trigger adjacent stars */ @@ -444,7 +440,7 @@ void nova(int ix, int iy) if (j==2 && nn== 2) continue; ii = hits[mm][1]+nn-2; jj = hits[mm][2]+j-2; - if (ii < 1 || ii > QUADSIZE || jj < 1 || jj > QUADSIZE) continue; + if (!VALID_SECTOR(jj, ii)) continue; iquad = game.quad[ii][jj]; switch (iquad) { // case IHDOT: /* Empty space ends reaction @@ -463,14 +459,14 @@ void nova(int ix, int iy) top2++; hits[top2][1]=ii; hits[top2][2]=jj; - game.state.galaxy[quadx][quady] -= 1; + game.state.galaxy[quadx][quady].stars -= 1; game.state.starkl++; crmena(1, IHSTAR, 2, ii, jj); prout(" novas."); game.quad[ii][jj] = IHDOT; break; case IHP: /* Destroy planet */ - game.state.newstuf[quadx][quady] -= 1; + game.state.galaxy[quadx][quady].planets -= 1; game.state.nplankl++; crmena(1, IHP, 2, ii, jj); prout(" destroyed."); @@ -483,9 +479,10 @@ void nova(int ix, int iy) game.quad[ii][jj] = IHDOT; break; case IHB: /* Destroy base */ - game.state.galaxy[quadx][quady] -= BASE_PLACE; - for (i = 1; i <= game.state.rembase; i++) - if (game.state.baseqx[i]==quadx && game.state.baseqy[i]==quady) break; + game.state.galaxy[quadx][quady].starbase = FALSE; + for_starbases(i) + if (game.state.baseqx[i]==quadx && game.state.baseqy[i]==quady) + break; game.state.baseqx[i] = game.state.baseqx[game.state.rembase]; game.state.baseqy[i] = game.state.baseqy[game.state.rembase]; game.state.rembase--; @@ -526,7 +523,7 @@ void nova(int ix, int iy) case IHC: /* Damage/destroy big enemies */ case IHS: case IHR: - for (ll = 1; ll <= nenhere; ll++) + for_local_enemies(ll) if (game.kx[ll]==ii && game.ky[ll]==jj) break; game.kpower[ll] -= 800.0; /* If firepower is lost, die */ if (game.kpower[ll] <= 0.0) { @@ -537,7 +534,7 @@ void nova(int ix, int iy) newcy = jj + jj - hits[mm][2]; crmena(1, iquad, 2, ii, jj); proutn(" damaged"); - if (newcx<1 || newcx>QUADSIZE || newcy<1 || newcy>QUADSIZE) { + if (!VALID_SECTOR(newcx, newcy)) { /* can't leave quadrant */ skip(1); break; @@ -594,7 +591,7 @@ void nova(int ix, int iy) void snova(int insx, int insy) { - int comdead, nqx=0, nqy=0, nsx, nsy, num, kldead, iscdead; + int comdead, nqx=0, nqy=0, nsx, nsy, num=0, kldead, iscdead; int nrmdead, npdead; int incipient=0; @@ -612,16 +609,16 @@ void snova(int insx, int insy) /* Scheduled supernova -- select star */ /* logic changed here so that we won't favor quadrants in top left of universe */ - for (nqx = 1; nqx<=GALSIZE; nqx++) { - for (nqy = 1; nqy<=GALSIZE; nqy++) { - stars += STARS(game.state.galaxy[nqx][nqy]); + for_quadrants(nqx) { + for_quadrants(nqy) { + stars += game.state.galaxy[nqx][nqy].stars; } } if (stars == 0) return; /* nothing to supernova exists */ num = Rand()*stars + 1; - for (nqx = 1; nqx<=GALSIZE; nqx++) { - for (nqy = 1; nqy<=GALSIZE; nqy++) { - num -= STARS(game.state.galaxy[nqx][nqy]); + for_quadrants(nqx) { + for_quadrants(nqy) { + num -= game.state.galaxy[nqx][nqy].stars; if (num <= 0) break; } if (num <=0) break; @@ -649,9 +646,9 @@ void snova(int insx, int insy) else { /* we are in the quadrant! */ incipient = 1; - num = Rand()* STARS(game.state.galaxy[nqx][nqy]) + 1; - for (nsx=1; nsx < QUADSIZE; nsx++) { - for (nsy=1; nsy < QUADSIZE; nsy++) { + num = Rand()* game.state.galaxy[nqx][nqy].stars + 1; + for_sectors(nsx) { + for_sectors(nsy) { if (game.quad[nsx][nsy]==IHSTAR) { num--; if (num==0) break; @@ -681,16 +678,15 @@ void snova(int insx, int insy) } } /* destroy any Klingons in supernovaed quadrant */ - num=game.state.galaxy[nqx][nqy]; - kldead = num/100; + kldead = game.state.galaxy[nqx][nqy].klingons; + game.state.galaxy[nqx][nqy].klingons = 0; comdead = iscdead = 0; if (nqx==game.state.isx && nqy == game.state.isy) { /* did in the Supercommander! */ game.state.nscrem = game.state.isx = game.state.isy = isatb = iscate = 0; iscdead = 1; - game.future[FSCMOVE] = game.future[FSCDBAS] = 1e30; + game.future[FSCMOVE] = game.future[FSCDBAS] = FOREVER; } - game.state.remkl -= kldead; if (game.state.remcom) { int maxloop = game.state.remcom, l; for (l = 1; l <= maxloop; l++) { @@ -701,15 +697,15 @@ void snova(int insx, int insy) game.state.remcom--; kldead--; comdead++; - if (game.state.remcom==0) game.future[FTBEAM] = 1e30; + if (game.state.remcom==0) game.future[FTBEAM] = FOREVER; break; } } } + game.state.remkl -= kldead; /* destroy Romulans and planets in supernovaed quadrant */ - num = game.state.newstuf[nqx][nqy]; - game.state.newstuf[nqx][nqy] = 0; - nrmdead = num/10; + nrmdead = game.state.galaxy[nqx][nqy].romulans; + game.state.galaxy[nqx][nqy].romulans = 0; game.state.nromrem -= nrmdead; npdead = num - nrmdead*10; if (npdead) { @@ -733,23 +729,17 @@ void snova(int insx, int insy) } /* If starship caused supernova, tally up destruction */ if (insx) { - num = game.state.galaxy[nqx][nqy] % 100; - game.state.starkl += num % 10; - game.state.basekl += num/10; - game.state.killk += kldead; - game.state.killc += comdead; - game.state.nromkl += nrmdead; + game.state.starkl += game.state.galaxy[nqx][nqy].stars; + game.state.basekl += game.state.galaxy[nqx][nqy].starbase; game.state.nplankl += npdead; - game.state.nsckill += iscdead; } /* mark supernova in galaxy and in star chart */ if ((quadx == nqx && quady == nqy) || game.damage[DRADIO] == 0 || condit == IHDOCKED) - game.starch[nqx][nqy] = 1; - game.state.galaxy[nqx][nqy] = SUPERNOVA_PLACE; + game.state.galaxy[nqx][nqy].supernova = TRUE; /* If supernova destroys last klingons give special message */ - if (game.state.remkl==0 && (nqx != quadx || nqy != quady)) { + if (KLINGREM==0 && (nqx != quadx || nqy != quady)) { skip(2); if (insx == 0) prout("Lucky you!"); proutn("A supernova in %s has just destroyed the last Klingons.",