|
DataMuseum.dkPresents historical artifacts from the history of: DKUUG/EUUG Conference tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about DKUUG/EUUG Conference tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - downloadIndex: T l
Length: 7653 (0x1de5) Types: TextFile Names: »land.c«
└─⟦b20c6495f⟧ Bits:30007238 EUUGD18: Wien-båndet, efterår 1987 └─⟦this⟧ »EUUGD18/General/Gb/land.c«
/* ** Galactic Bloodshed (Robert Chansky, smq@b) ** land.c -- land a ship ** also.... dock -- dock a ship w/ another ship ** and..... assault -- a very un-PC version of land */ #include "vars.h" #include "ships.h" #include "races.h" #include <setjmp.h> #include <math.h> #include <curses.h> extern jmp_buf main_jenv; #include <signal.h> int land_sectdata,land_shfdata,land_shdata,land_pdata; extern char telegram_buf[AUTO_TELEG_SIZE]; extern int Ignore_filelocks; land(APcount, argn,args, assault) int APcount; int argn; char args[MAXARGS][COMMANDSIZE]; int assault; /* unfriendly land */ { int land_handler(); char c; shiptype *s,*s2; planettype *p; sectortype *sect; placetype where; bool cont,planetmod=0,sectmod=0; int shipno,x= -1,y= -1,i; float fuel; double Dist; char buf[200]; land_sectdata = land_shfdata = land_shdata = land_pdata = NEUTRAL_FD; signal(SIGINT, land_handler); if (argn!=2) { printf("%s what ship #", args[0]); scanf("%d",&shipno); getchr(); } else { i = (args[1][0]=='#'); sscanf(args[1]+i,"%d",&shipno); } openshdata(&land_shdata); if (!getship(land_shdata, &s, shipno)) { land_handler(); } if (s->owner!=Playernum) { DontOwnErr(shipno); land_handler(); } if (s->rad) { printf("%s is irradiated and inactive.\n",Shipnames[s->type]); land_handler(); } if (!enufAP(Stars[s->storbits]->AP, APcount)) land_handler(); if (s->is_docked) { printf("Ship #%d is already docked.\n",shipno); land_handler(); } printf("%s %s #%d on: ", args[0], Shipnames[s->type], shipno); scanf("%100s", buf); getchr(); Ignore_filelocks = 1; where = Getplace(buf, 0); Ignore_filelocks = 0; if (where.err) land_handler(); if (where.level==LEVEL_SHIP) { free(where.shipptr); Ignore_filelocks = 1; if (!getship(land_shdata, &where.shipptr, where.shipno)) land_handler(); Ignore_filelocks = 0; if (where.shipptr->is_docked) { printf("ship #%d is already docked.\n",where.shipno); land_handler(); } printf("Distance to ship #%d: %.2g.\n", where.shipno, Dist = sqrt((double)Distsq(where.shipptr->xpos, where.shipptr->ypos, s->xpos, s->ypos ) ) ); if (Dist > DIST_TO_LAND) { printf("Ship #%d must be %.3g or closer to ship #%d.(%.2f).\n", shipno, DIST_TO_LAND, where.shipno, Dist); land_handler(); } fuel = 0.05 + Dist * 0.5; printf("This maneuver will take %g fuel (of %.2f.)\n",fuel,s->fuel); if (fuel > s->fuel) { printf("Not enough fuel.\n"); land_handler(); } s->fuel -= fuel; s->mass -= fuel * MASS_FUEL; s->is_docked = 1; s->whatdest = LEVEL_SHIP; s->destshipno = where.shipno; s->xpos = where.shipptr->xpos + 1.0; s->ypos = where.shipptr->ypos; putship(land_shdata, s, shipno); where.shipptr->is_docked = 1; where.shipptr->whatdest = LEVEL_SHIP; where.shipptr->destshipno = shipno; putship(land_shdata, where.shipptr, where.shipno); close(land_shdata); printf("ship #%d docked.\n",shipno); land_handler(); } else if (where.shipptr->whatorbits!=LEVEL_PLAN) { printf("Huh?\n"); land_handler(); } openpdata(&land_pdata); getplanet(land_pdata, &p, Stars[s->storbits]->planetpos[s->pnumorbits]); printf("Planet /%s/%s has gravity field of %.2f.\n", Stars[s->storbits]->name, Stars[s->storbits]->pnames[s->pnumorbits], gravity(p)); printf("Distance to planet: %.2f.\n", Dist = sqrt((double)Distsq(Stars[s->storbits]->xpos + p->xpos, Stars[s->storbits]->ypos + p->ypos, s->xpos, s->ypos ) ) ); if (Dist > DIST_TO_LAND) { printf("Ship #%d must be %.3g or closer to the planet (%.2f).\n",shipno, DIST_TO_LAND, Dist); land_handler(); } fuel = 0.05 + logscale(s->mass)*gravity(p) * LAND_GRAV_MASS_FACTOR + assault; printf("That maneuver will cost you %.2f fuel (of %.2f).\n",fuel, s->fuel); if (s->fuel < fuel) { tty_on(); printf("NOT ENOUGH FUEL-- continue? (y/n) "); putchr(c = getchr()); if (c != 'y') { land_handler(); tty_off(); } } tty_off(); cont = 0; do { printf("%s on",(s->fuel < fuel) ? "CRASH" : args[0]); GetMapSector(p, &x, &y); if (assault) { opensectdata(&land_sectdata); getsector(land_sectdata,§,p->sectormappos+(y*p->Maxx+x)*sizeof(sectortype)); if (sect->owner==Playernum) { printf("You cannot assault your own sector.\n"); close(land_sectdata); free(sect); } else if (sect->popn > 0) { printf("The assaulted sector must have no population.\n"); close(land_sectdata); free(sect); } else cont = 1; } if (sect->des != Race->likesbest) { printf("Your ship cannot land on a %c sector.\n",desshow(sect)); close(land_sectdata); free(sect); } } while (!cont); if (s->fuel < fuel) { where.level = LEVEL_PLAN; where.snum = s->storbits; where.pnum = s->pnumorbits; printf("BO\007OM!! Ship #%d crashes on sector %d,%d with blast radius of %d.\n", shipno, x, y, (int)(s->mass/15+1+s->destruct/3) ); if (!fork()) { /* fork off a child process to do damage */ blast(where, p, x, y, (int)(s->mass/15+1+s->destruct/3+s->fuel/5), (int)(s->destruct/3+2) ); openshfdata(&land_shfdata); destroyship(land_shfdata,shipno); /* kill the ship */ close(land_shfdata); for (i=0; i<MAXPSHIPS && p->shipnums[i]!=shipno; i++) if (p->shipnums[i] == shipno) { planetmod = 1; p->shipnums[i] = 0; p->numships--; } deductAPs(APcount, s->storbits, 0); launch_handler(); exit(0); } } s->xpos = (float)x; s->ypos = (float)y; s->fuel -= fuel; s->mass -= fuel * MASS_FUEL; s->is_docked = 1; s->whatdest = LEVEL_PLAN; /* no destination */ s->deststar = s->storbits; s->destpnum = s->pnumorbits; if (assault) { /* assault on planet increases combat readiness, */ /* but only if we aren't already well-established there */ if (!p->info[Playernum-1].numsectsowned && p->info[Playernum-1].comread < 50) { p->info[Playernum-1].comread = 100; p->info[Playernum-1].mob_set = 100; sect->mobilization = 100; sect->is_wasted = 0; } sectmod = planetmod = 1; /* unload some people onto the sector */ sect->popn = s->popn-1; sect->owner = Playernum; p->info[Playernum-1].numsectsowned++; s->mass -= (s->popn-1) * Race->mass; s->popn = 1; } /* } */ deductAPs(APcount, s->storbits, 0); putship(land_shdata, s, shipno); close(land_shdata); if (planetmod) { putplanet(land_pdata,p,Stars[s->storbits]->planetpos[s->pnumorbits]); } close(land_pdata); free(p); if (sectmod) putsector(land_sectdata,sect,p->sectormappos+(y*p->Maxx+x)*sizeof(sectortype)); if (assault) { close(land_sectdata); free(sect); } /* send telegs to anyone there */ if (s->whatdest == LEVEL_PLAN) { teleg_add("",telegram_buf); if (assault) sprintf(buf,"BULLETIN!\n\nPlanet /%s/%s ASSAULTED by ship #%d on sector %.0f,%.0f!!\n", Stars[s->storbits]->name, Stars[s->storbits]->pnames[s->pnumorbits], shipno, s->xpos, s->ypos); else sprintf(buf,"Bulletin...\n\nShip #%d observed landing on sector %.0f,%.0f,\nplanet /%s/%s.\n",shipno,s->xpos,s->ypos,Stars[s->storbits]->name, Stars[s->storbits]->pnames[s->pnumorbits]); teleg_add(buf,telegram_buf); for (i=1; i<MAXPLAYERS; i++) if (p->info[i-1].numsectsowned && i!=Playernum) teleg_send(TELEG_PLAYER_AUTO, i, telegram_buf); } if (s->whatdest==LEVEL_PLAN) printf("ship #%d landed on planet.\n",shipno); else printf("ship #%d docked.\n",shipno); free(s); } land_handler(sig, code, scp) int sig,code; struct sigcontext *scp; { close(land_pdata); close(land_shdata); close(land_sectdata); close(land_shfdata); Ignore_filelocks = 0; longjmp(main_jenv,1); }