billr@saab.CNA.TEK.COM (Bill Randle) (08/29/90)
Submitted-by: VANCLEEF@mps.ohio-state.edu Posting-number: Volume 11, Issue 44 Archive-name: gb3/Patch2f Patch-To: gb3: Volume 10, Issue 1-14 #! /bin/sh # This is a shell archive. Remove anything before this line, then unpack # it by saving it into a file and typing "sh file". To overwrite existing # files, type "sh file -c". You can also feed this as standard input via # unshar, or by typing "sh <file", e.g.. If this archive is complete, you # will see the following message at the end: # "End of archive 6 (of 9)." # Contents: Docs/mount.doc client/map.c server/dock.c server/doship.c # server/name.c # Wrapped by billr@saab on Tue Aug 28 08:54:57 1990 PATH=/bin:/usr/bin:/usr/ucb ; export PATH if test -f 'Docs/mount.doc' -a "${1}" != "-c" ; then echo shar: Renaming existing file \"'Docs/mount.doc'\" to \"'Docs/mount.doc.orig'\" mv -f 'Docs/mount.doc' 'Docs/mount.doc.orig' fi echo shar: Extracting \"'Docs/mount.doc'\" \(784 characters\) sed "s/^X//" >'Docs/mount.doc' <<'END_OF_FILE' XMOUNT Galactic Bloodshed MOUNT X X XNAME X mount -- mount a crystal into a ship's hyper-drive. X dismount -- dismount a crystal from the drive. X XSYNTAX X mount X dismount X XDESCRIPTION X X Normally, a ship requires a waiting period before a hyperspace Xjump can be executed. This requires powering up the drive for Xsome period of time. However, the charge-up time can been bypassed Xif a player has a crystal mounted. The effect of a crystal also Xallows the ship to jump farther and more fuel efficiently than Xfor a ship without a crystal mounted. X X In order to mount a crystal, the player must change scope to the Xship which is to have a crystal mounted. The ship must have a Xcrystal on board. A crystal can be dismounted using the 'dismount' Xcommand. X XSEE ALSO X crystal, order X END_OF_FILE if test 784 -ne `wc -c <'Docs/mount.doc'`; then echo shar: \"'Docs/mount.doc'\" unpacked with wrong size! fi # end of 'Docs/mount.doc' if test -f 'client/map.c' -a "${1}" != "-c" ; then echo shar: Renaming existing file \"'client/map.c'\" to \"'client/map.c.orig'\" mv -f 'client/map.c' 'client/map.c.orig' fi echo shar: Extracting \"'client/map.c'\" \(4750 characters\) sed "s/^X//" >'client/map.c' <<'END_OF_FILE' X/* X * Galactic Bloodshed, copyright (c) 1989 by Robert P. Chansky, X * smq@ucscb.ucsc.edu, mods by people in GB_copyright.h. Restrictions in X * GB_copyright.h. X * X * map.c -- display sector map of current planet X * X * plot_surface(): Plot as much of the planet surface as possible. X * If the planet surface is complete, return. Else X * set MAP to FALSE, and wait for the next packet. X * X * plot_balance(): Try to synchronize with the last character that X * was output. Complete the current character, then X * the current line, then the current map. Clear X * MAP flag. X * bugs: Not clean if the packets become screwy. plot_balance has X * no way of recovering from errors. Starting the balance of the X * map with the last character in a row or the last character in X * the map might screw up everything. No testing for this case. X * X * Version 1.1 25-Jul-90 Hubert Bartels X * hgb@catalina.opt-sci.arizona.edu X * Made modifications to complete X * maps. X */ X X#include "GB_copyright.h" X#define S_X (stdscr->_maxx - NAMESIZE) X#define S_Y (stdscr->_maxy - 1) X#define Midx ((S_X - NAMESIZE)/2.0) X#define Midy (S_Y /2.0) X#define DISP_DATA 1 X X#include <curses.h> X#include <stdio.h> X X/* X Map completion code X*/ X#define SHIFT_IN 0x10 X#define SHIFT_OUT 0x20 X Xextern int MAP; /* True if in map mode */ Xextern int s_in_out; /* TRUE if this was to be a shiftin/out flag */ X /* if not TRUE, then SHIFT_OUT or SHIFT_IN */ X /* depending on the state of stand. */ Xextern int curY; /* The current Y ( row), location */ Xextern int curX; /* The current X ( col), location */ Xextern int Maxx; /* The maximum X size */ Xextern int Maxy; /* The maximum Y size */ Xextern char *index(), *malloc(); Xextern int have_inv; X Xplot_surface(t) Xchar *t; X{ X register int x, y; X int stand, show; X char *u, *v; X extern int MAP; X extern int s_in_out; X extern int curX; X extern int curY; X extern int Maxx; X extern int Maxy; X X clear(); X u = t + 1; X /* get planet name */ X v = index(u, ';'); X *v = 0; X move(0, 9); X printw("`%s'\n ", u); X X u = v + 1; X v = index(u, ';'); X *v = 0; X Maxx = atoi(u); X X u = v + 1; X v = index(u, ';'); X *v = 0; X Maxy = atoi(u); X X u = v + 1; X v = index(u, ';'); X *v = 0; X show = atoi(u); X for (x = 0; x < Maxx; x++) printw("%d", x / 10); X printw("\n "); X for (x = 0; x < Maxx; x++) printw("%d", x % 10); X printw("\n"); X u = v + 1; X for (y = 0; y < Maxy; y++) { X curY = y; X mvaddch(y + 3, 0, y / 10 + '0'); X addch(y % 10 + '0'); X for (x = 0; x < Maxx; x++) { X curX = x; X if( *u == '\0') { X MAP = TRUE; X s_in_out = TRUE; X refresh(); X return; X } X if (*u++ == '0') stand = 0; else stand = 1; X if( *u == '\0') { X MAP = TRUE; X if( stand == 0) X s_in_out = SHIFT_OUT; X else X s_in_out = SHIFT_IN; X refresh(); X return; X } X if (stand && have_inv) standout(); X mvaddch(y + 3, x + 3, *u); X if (stand && have_inv) standend(); X u++; X } X } X MAP = FALSE; X curY = curX = 0; X move(Maxy + 4, 0); X refresh(); X} X/* X plot_balance tries to find out where the map was truncated, X and tries to continue from the last location written. X X Version 1.0 25-Jul-90 HGB, modified from plot_surface. X*/ Xplot_balance(t) Xchar *t; X{ X register int x, y; X int stand; X char *u; X extern int MAP; X extern int s_in_out; X extern int curY; X extern int curX; X extern int Maxx; X extern int Maxy; X/* X Check if we are supposed to be here. X*/ X if( MAP == FALSE) return; X/* X Try to write the rest of the current row from the current buffer X also, we need to synchronize. If the first character is 0/1, this X is the standout/standin character. If the first character is not, X output this character. X*/ X u = t; X y = curY; X x = curX; X/* X Synchronize. SHIFT_IN means we saw the standout flag, but X not the character. We draw the character, up the X counter, X and enter the balance of items loop for this row. X*/ X if( s_in_out == SHIFT_IN && have_inv ) standout(); X if( s_in_out != TRUE) { X mvaddch(y + 3, x + 3, *u); X if (s_in_out == SHIFT_IN && have_inv) standend(); X curX++; X } X refresh(); X/* X Now, draw the rest of the line. X*/ X for( x = curX; x < Maxx; x++) { X if (*u == '0') stand = 0; else stand = 1; X u++; X if (stand && have_inv) standout(); X mvaddch(y + 3, x + 3, *u); X if (stand && have_inv) standend(); X u++; X } X refresh(); X curY++; X/* X Try to draw the balance of the map, now. We should be synchronized. X*/ X for (y = curY; y < Maxy; y++) { X mvaddch(y + 3, 0, y / 10 + '0'); X addch(y % 10 + '0'); X for (x = 0; x < Maxx; x++) { X if (*u == '0') stand = 0; else stand = 1; X u++; X if (stand && have_inv) X standout(); X mvaddch(y + 3, x + 3, *u); X if (stand && have_inv) X standend(); X u++; X } X refresh(); X } X MAP = FALSE; X curX = curY = 0; X move(Maxy + 4, 0); X refresh(); X return; X} END_OF_FILE if test 4750 -ne `wc -c <'client/map.c'`; then echo shar: \"'client/map.c'\" unpacked with wrong size! fi # end of 'client/map.c' if test -f 'server/dock.c' -a "${1}" != "-c" ; then echo shar: Renaming existing file \"'server/dock.c'\" to \"'server/dock.c.orig'\" mv -f 'server/dock.c' 'server/dock.c.orig' fi echo shar: Extracting \"'server/dock.c'\" \(13087 characters\) sed "s/^X//" >'server/dock.c' <<'END_OF_FILE' X/* X** Galactic Bloodshed, copyright (c) 1989 by Robert P. Chansky, X** smq@ucscb.ucsc.edu, mods by people in GB_copyright.h. X** Restrictions in GB_copyright.h. X** X** dock.c -- dock a ship X** and..... assault -- a very un-PC version of dock X*/ X X#include "GB_copyright.h" X#define EXTERN extern X#include "vars.h" X#include "ships.h" X#include "races.h" X#include "buffers.h" X#include <signal.h> X#include <math.h> X Xint dock_sectdata, dock_shdata, dock_pdata, dock_racedata; Xint dock_stdata; X Xdock(Playernum,APcount, argn,args, Assault) Xint Playernum; Xint APcount; Xint argn; Xchar args[MAXARGS][COMMANDSIZE]; Xint Assault; /* unfriendly dock */ X{ Xchar c; Xshiptype *s,*s2,*s3; Xplanettype *p; Xsectortype *sect; Xint boarders,oldspopn,olds2popn,dam,dam2,booby, X numdest=0,ship2no,shipno,x= -1,y= -1,i,mask; Xint old2owner,sh, sh3; Xint casualties, casualties2, casualty_scale; Xfloat fuel,bstrength,b2strength,pris; Xdouble Dist; Xracetype *Race, *alien; X Xdock_sectdata = dock_shdata = dock_pdata = NEUTRAL_FD; X X X sscanf(args[1]+(args[1][0]=='#'),"%d",&shipno); X sscanf(args[2]+(args[2][0]=='#'),"%d",&ship2no); X X X openshdata(&dock_shdata); X if (!getship(dock_shdata, &s, shipno)) { X notify(Playernum, "The ship wasn't found.\n"); X close_file(dock_shdata); X return; X } Xclose_file(dock_shdata); X if (testship(Playernum,s, shipno)) { X notify(Playernum, "Illegal format.\n"); X free(s); X return; X } X X if(!Assault) { X if (s->is_docked) { X sprintf(buf,"Ship #%d is already docked.\n",shipno); X notify(Playernum, buf); X free(s); X return; X } X } else if(s->is_docked) { X if(s->whatdest==LEVEL_PLAN) { X notify(Playernum, "Target ship is landed.\n"); X free(s); X return; X } else if(!(s->whatdest==LEVEL_SHIP)) { X notify(Playernum, "Weird error..\n"); X free(s); X return; X } X } X X if (s->whatorbits==LEVEL_UNIV) { X if (!enufAP(Playernum,Sdata.AP[Playernum-1], APcount)) { X free(s); X return; X } X } else if (!enufAP(Playernum,Stars[s->storbits]->AP[Playernum-1], APcount)) { X free(s); X return; X } X X X if(shipno==ship2no) { X notify(Playernum, "You can't dock with yourself!\n"); X free(s); X return; X } X X Xopenshdata(&dock_shdata); X if (!getship(dock_shdata, &s2, ship2no)) { X notify(Playernum, "The ship wasn't found.\n"); X close_file(dock_shdata); X free(s); X return; X } Xclose_file(dock_shdata); X/* if (testship(Playernum,s2, ship2no)) { X notify(Playernum, "Illegal format.\n"); X free(s2); X free(s); X return; X } X*/ X X if (s2->is_docked) { X sprintf(buf,"Ship #%d is already docked.\n",ship2no); X notify(Playernum, buf); X free(s); X free(s2); X return; X } X X X Dist = sqrt((double)Distsq(s2->xpos, s2->ypos, s->xpos, s->ypos ) ); X fuel = 0.05 + Dist * 0.025 * (Assault ? 2.0 : 1.0)*sqrt(s->mass); X X if (Dist > DIST_TO_DOCK) { X sprintf(buf,"Ship #%d must be %.2f or closer to ship #%d.\n", X shipno, DIST_TO_DOCK, ship2no); X notify(Playernum, buf); X free(s); X free(s2); X return; X } else if(s->is_docked && Assault) { X/* first undock the target ship */ X s->is_docked = 0; X s->whatdest==LEVEL_UNIV; X openshdata(&dock_shdata); X (void)getship(dock_shdata, &s3, s->destshipno); X s3->is_docked==0; X s3->whatdest==LEVEL_UNIV; X putship(dock_shdata, s3, s->destshipno); X free(s3); X } X X if (fuel > s->fuel) { X sprintf(buf,"Not enough fuel.\n"); X notify(Playernum, buf); X free(s); X free(s2); X return; X } X sprintf(buf,"Distance to %s #%d: %.2f.\n", s2->name, ship2no, Dist); X notify(Playernum, buf); X sprintf(buf,"This maneuver will take %.2f fuel (of %.2f.)\n\n",fuel,s->fuel); X notify(Playernum, buf); X X X X if (s->type == STYPE_FIGHTER && s2->type == STYPE_CARRIER) { X /* docking fighters with a carrier */ X X if(s->whatorbits==LEVEL_PLAN) { X openpdata(&dock_pdata); X getplanet(dock_pdata, &p, Stars[s->storbits]->planetpos[s->pnumorbits]); X sh = p->ships; X X if(sh == shipno) { X p->ships = s->nextship; X putplanet(dock_pdata, p, Stars[s->storbits]->planetpos[s->pnumorbits]); X } else { X openshdata(&dock_shdata); X while(sh != shipno){ X (void)getship(dock_shdata, &s3, sh); X sh3 = sh; X sh = s3->nextship; X if(sh != shipno) free(s3); /* don't free it if it is the s3 we want */ X } X s3->nextship = s->nextship; X putship(dock_shdata, s3, sh3); X free(s3); X if(sh3 == ship2no) { /* s3 was actually s2! */ X free(s2); X (void)getship(dock_shdata, &s2, sh3); X } X close_file(dock_shdata); X X X } X close_file(dock_pdata); X } else if(s->whatorbits==LEVEL_STAR) { X openstardata(&dock_stdata); X getstar(dock_stdata, &Stars[s->storbits], s->storbits); X sh = Stars[s->storbits]->ships; X X if(sh == shipno) { X Stars[s->storbits]->ships = s->nextship; X putstar(dock_stdata, Stars[s->storbits], s->storbits); X } else { X openshdata(&dock_shdata); X while(sh != shipno){ X (void)getship(dock_shdata, &s3, sh); X sh3 = sh; X sh = s3->nextship; X if(sh != shipno) free(s3); /* don't free it if it is the s3 we want */ X } X s3->nextship = s->nextship; X putship(dock_shdata, s3, sh3); X free(s3); X if(sh3 == ship2no) { /* we just wrote it to disk! */ X free(s2); X (void)getship(dock_shdata, &s2, s3); X } X close(dock_shdata); X X } X X close_file(dock_stdata); X } else { X notify(Playernum, "Illegal scope.\n"); X free(s); X free(s2); X return; X } X X X s->fuel -= fuel; X s->mass -= fuel * MASS_FUEL; X s->is_docked = 1; X s->whatdest = LEVEL_SHIP; X s->whatorbits = LEVEL_UNIV; X s->destshipno = ship2no; X s->nextship = 0; X X s->xpos = s2->xpos; X s->ypos = s2->ypos; X X s->object.number = s2->object.number; X s->object.number4 = 1; /* docked with carrier */ X X /* remove fighter from upper level linked list */ X s2->object.number = shipno; X s2->object.number4 += 1; /* number of fighters docked */ X s2->mass += s->mass; X X } else { X if (s2->is_docked && !Assault) { X sprintf(buf,"ship #%d is already docked.\n",ship2no); X notify(Playernum, buf); X free(s); X free(s2); X return; X } X X if (Assault) { X X openracedata(&dock_racedata); X getrace(dock_racedata, &alien, (int)s2->owner); X getrace(dock_racedata, &Race, Playernum); X close_file(dock_racedata); X X sscanf(args[3],"%d",&boarders); X if (boarders > MIN(s->popn, Max_crew(s2)) X || boarders <= 0) { X sprintf(buf,"Illegal number of boarders (max can be %d).\n", X MIN(s->popn, Max_crew(s2))); X notify(Playernum, buf); X free(alien); X free(s); X free(s2); X return; X } X old2owner = s2->owner; X s->popn -= boarders; X s->mass -= boarders * Race->mass; X sprintf(buf,"Boarding strength :%.2f Defense strength: %.2f.\n", X bstrength = boarders * Race->fighters X * .01 * Race->tech X * .01 * (100 - s->damage), X /* 1 is dummy armor */ X X b2strength = s2->popn * alien->fighters X * .01 * alien->tech X * .01 * (100 - s2->damage) X ); X notify(Playernum, buf); X X } X X X /* the ship moves into position, regardless of success of attack */ X s->fuel -= fuel; X s->mass -= fuel * MASS_FUEL; X X s->xpos = s2->xpos + int_rand(-1,1); X s->ypos = s2->ypos + int_rand(-1,1); X X if (Assault) { X/* if the assaulted ship is docked, undock it first */ X if(s2->is_docked && s2->whatdest==LEVEL_SHIP) { X X openshdata(&dock_shdata); X getship(dock_shdata, &s3, s2->destshipno); X s3->is_docked = 0; X s3->whatdest = LEVEL_UNIV; X s3->destshipno = 0; X putship(dock_shdata, s3, s2->destshipno); X close_file(dock_shdata); X free(s3); X X s2->is_docked = 0; X s2->whatdest = LEVEL_UNIV; X s2->destshipno = 0; X } X /* nuke both populations, ships */ X casualty_scale = MIN(boarders, s2->popn); X Xif(b2strength) { /* otherwise the ship surrenders */ X casualties = int_rand(0, round_rand((float)casualty_scale * (b2strength+1.0) / X (bstrength+1.0))); X casualties = MIN(boarders, casualties); X boarders -= casualties; X X dam = int_rand(0, round_rand(25. * (b2strength+1.0)/ (bstrength+1.0))); X dam = MIN(100, dam); X s->damage = MIN(100, s->damage+dam); X if (s->damage >= 100) X kill_ship(Playernum, s); X X X casualties2 = int_rand(0, round_rand((float)casualty_scale * (bstrength+1.0) / X (b2strength+1.0))); X casualties2 = MIN(s2->popn, casualties2); X s2->popn -= casualties2; X s2->mass -= casualties2 * alien->mass; X /* (their mass) */ X dam2 = int_rand(0,round_rand(25. * (bstrength+1.0)/(b2strength+1.0))); X dam2 = MIN(100, dam2); X s2->damage = MIN(100, s2->damage+dam2); X if ( s2->damage >= 100) X kill_ship(Playernum, s2); X} else { X s2->popn = 0; booby = 0; X/* do booby traps */ X /* check for boobytrapping */ X if (!Max_crew(s2) && s2->destruct > 0) X booby = int_rand(0, 10*s2->destruct); X booby = MIN(100, booby); X } X X if ((s2->popn == 0) && s->is_alive && s2->is_alive) { X /* we got 'em */ X s->is_docked = 1; X s->whatdest = LEVEL_SHIP; X s->destshipno = ship2no; X X s2->is_docked = 1; X s2->whatdest = LEVEL_SHIP; X s2->destshipno = shipno; X old2owner = s2->owner; X s2->owner = Playernum; X s2->popn = boarders; X s2->mass += boarders * Race->mass; /* our mass */ X } else { /* retreat */ X s->popn += boarders; X s->mass += boarders * Race->mass; X } X X/* races find out about each other */ X alien->translate[Playernum-1] = MIN(alien->translate[Playernum-1]+5, 100); X Race->translate[old2owner-1] = MIN(Race->translate[old2owner-1]+5, 100); X X if(!boarders && s2->popn) /* boarding party killed */ X alien->translate[Playernum-1] = MIN(alien->translate[Playernum-1]+25, 100); X if(s2->owner==Playernum) /* captured ship */ X Race->translate[old2owner-1] = MIN(Race->translate[old2owner-1]+25, 100); X X openracedata(&dock_racedata); X putrace(dock_racedata, Race, 7); X putrace(dock_racedata, alien, 8); X close_file(dock_racedata); X free(alien); X free(Race); X } else { X s->is_docked = 1; X s->whatdest = LEVEL_SHIP; X s->destshipno = ship2no; X X s2->is_docked = 1; X s2->whatdest = LEVEL_SHIP; X s2->destshipno = shipno; X } X X if (Assault) { X sprintf(telegram_buf,"%s #%d ASSAULTED by ", X Shipnames[s2->type], ship2no); X sprintf(buf,"%s #%d [%d] at %s\n", X Shipnames[s->type], shipno, s->owner, prin_ship_orbits(s2)); X str_cat(telegram_buf, buf); X sprintf(buf,"Your damage: %d%%, theirs: %d%%.\n", dam2, dam); X str_cat(telegram_buf, buf); X if (!Max_crew(s2) && s2->destruct) { X sprintf(buf,"(Your boobytrap gave them %.0f%% damage.)\n", X booby); X str_cat(telegram_buf, buf); X sprintf(buf,"Their boobytrap gave you %.0f%% damage!)\n", X booby); X notify(Playernum, buf); X } X sprintf(buf,"Damage taken: You: %d%% (now %d%%)\n", dam, s->damage); X notify(Playernum, buf); Xif(!s->is_alive) { X sprintf(buf," YOUR SHIP WAS DESTROYED!!!\n"); X notify(Playernum, buf); X sprintf(buf," Their ship DESTROYED!!!\n"); X str_cat(telegram_buf, buf); X} X sprintf(buf," Them: %d%% (now %d%%)\n",dam2,s2->damage); X notify(Playernum, buf); Xif(!s2->is_alive) { X sprintf(buf," Their ship DESTROYED!!! Boarders are dead.\n"); X notify(Playernum, buf); X sprintf(buf," YOUR SHIP WAS DESTROYED!!!\n"); X str_cat(telegram_buf, buf); X} X if (s->is_alive) { X if (s2->owner==Playernum) { X sprintf(buf,"CAPTURED!\n"); X str_cat(telegram_buf, buf); X sprintf(buf,"VICTORY! the ship is yours!\n"); X notify(Playernum, buf); X if (boarders) { X sprintf(buf,"%d boarders move in.\n", boarders); X notify(Playernum, buf); X } X X } else if(s2->popn) { X sprintf(buf,"The boarding was repulsed; try again.\n"); X notify(Playernum, buf); X sprintf(buf,"You fought them off!\n"); X str_cat(telegram_buf, buf); X } X } else { X sprintf(buf,"The assault was too much for your bucket of bolts.\n"); X notify(Playernum, buf); X sprintf(buf,"The assault was too much for their ship..\n"); X str_cat(telegram_buf, buf); X } X if (s2->is_alive) { X if (!boarders) { X sprintf(buf,"Oh no! They killed your boarding party to the last man!\n"); X notify(Playernum, buf); X } X X if (!s->popn) { X sprintf(buf,"You killed all their crew!\n"); X str_cat(telegram_buf, buf); X } X } else { X sprintf(buf,"The assault weakened their ship too much!\n"); X notify(Playernum, buf); X sprintf(buf,"Your ship was weakened too much!\n"); X str_cat(telegram_buf, buf); X } X sprintf(buf,"Casualties: Yours: %d Theirs: %d\n", casualties2, casualties); X str_cat(telegram_buf, buf); X sprintf(buf,"Crew casualties: Yours: %d Theirs: %d\n", casualties, casualties2); X notify(Playernum, buf); X if(!notify(old2owner, telegram_buf)) X push_message(TELEG_PLAYER_AUTO, old2owner, telegram_buf, TELEGRAM); X } else { X sprintf(buf,"%s #%d docked with %s #%d.\n", X Shipnames[s->type], shipno, X Shipnames[s2->type], ship2no); X notify(Playernum, buf); X } X X } X X s->notified = s2->notified = 0; X openshdata(&dock_shdata); X putship(dock_shdata, s, shipno); X putship(dock_shdata, s2, ship2no); X close_file(dock_shdata); X free(s2); X free(s); X X X} END_OF_FILE if test 13087 -ne `wc -c <'server/dock.c'`; then echo shar: \"'server/dock.c'\" unpacked with wrong size! fi # end of 'server/dock.c' if test -f 'server/doship.c' -a "${1}" != "-c" ; then echo shar: Renaming existing file \"'server/doship.c'\" to \"'server/doship.c.orig'\" mv -f 'server/doship.c' 'server/doship.c.orig' fi echo shar: Extracting \"'server/doship.c'\" \(17924 characters\) sed "s/^X//" >'server/doship.c' <<'END_OF_FILE' X/* X * Galactic Bloodshed, copyright (c) 1989 by Robert P. Chansky, X * smq@ucscb.ucsc.edu, mods by people in GB_copyright.h. X * Restrictions in GB_copyright.h. X * doship -- do one ship turn. X */ X X#include "GB_copyright.h" X#define EXTERN extern X#include "vars.h" X#include "ships.h" X#include "races.h" X#include "doturn.h" X#include "power.h" X#include "buffers.h" X#include <math.h> X#include <strings.h> X X Xdoship(shipno,ship) Xint shipno; Xshiptype *ship; X{ X int sh,sh2,j,shfdata, doship_racedata; X boolean trigger; Xracetype *Race; X X/*ship is active */ X ship->active = 1; X X if (ship->is_alive && ship->owner) { X X/* for debugging */ X if(ship->popn > Max_crew(ship)) X ship->popn = Max_crew(ship); X if(ship->destruct > Max_destruct(ship)) X ship->destruct = Max_destruct(ship); X if(ship->fuel > (float)Max_fuel(ship)) X ship->fuel = (float)Max_fuel(ship); X X/* upgrade factory tech (if off) */ X if(ship->type==OTYPE_FACTORY && !ship->on) { X openshdata(&doship_racedata); X getrace(doship_racedata, &Race, ship->owner); X close_file(doship_racedata); X ship->tech = Race->tech; X free(Race); X } X X /* repair radiation */ X if (ship->rad) { X ship->active = 1; X /* irradiated ships are immobile.. */ X /* kill off some people */ X /* check to see if ship is active */ X if(int_rand(1,100) <= ship->rad) X ship->active = 0; X ship->popn = round_rand(ship->popn * .80); X if (ship->rad >= (int)REPAIR_RATE) X ship->rad -= int_rand(0,(int)REPAIR_RATE); X else X ship->rad -= int_rand(0,ship->rad); X } else X ship->active = 1; X X if(!ship->popn && Max_crew(ship) && !ship->is_docked) X ship->whatdest = LEVEL_UNIV; X X X if (ship->whatorbits != LEVEL_UNIV X && Stars[ship->storbits]->nova_stage>0) { X /* damage ships from supernovae */ X ship->damage += 5*Stars[ship->storbits]->nova_stage/(Armor(ship)+1); X if (ship->damage >= 100) { X kill_ship(1, ship); X return; X } X } X X if(ship->active) X Moveship(shipno, ship); X X ship->size = ship_size(ship); /* for debugging */ X X if(ship->whatorbits != LEVEL_UNIV) { X/* printf("checking #%d\n",shipno); */ X StarsInhab[ship->storbits] = 1; X setbit(Stars[ship->storbits]->inhabited, ship->owner); X setbit(Stars[ship->storbits]->explored, ship->owner); X if(ship->whatorbits == LEVEL_PLAN) { X planets[ship->storbits][ship->pnumorbits]->info[ship->owner-1].explored = 1; X } X } X/* just making sure */ X X X /* add ships, popn to total count to add AP's */ X Power[ship->owner-1].ships_owned++; X Power[ship->owner-1].resource += ship->resource; X Power[ship->owner-1].fuel += ship->fuel; X Power[ship->owner-1].destruct += ship->destruct; X Power[ship->owner-1].popn += ship->popn; X X if (ship->whatorbits==LEVEL_UNIV) { X Sdatanumships[ship->owner-1]++; X Sdatapopns[ship->owner] += ship->popn; X } else { X starnumships[ship->storbits][ship->owner-1]++; X /* add popn of ships to popn */ X starpopns[ship->storbits][ship->owner-1] += ship->popn; X /* set inhabited for ship */ X StarsInhab[ship->storbits] = 1; X setbit(Stars[ship->storbits]->inhabited, ship->owner); X setbit(Stars[ship->storbits]->explored, ship->owner); X } X X X X X if (ship->active) { X X /* bombard the planet */ X if (can_bombard(ship) && ship->bombard X && ship->whatorbits==LEVEL_PLAN X && ship->whatdest==LEVEL_PLAN X && ship->deststar== ship->storbits X && ship->destpnum== ship->pnumorbits) { X /* ship bombards planet */ X Stinfo[ship->storbits][ship->pnumorbits].inhab = 1; X } X X X X /* repair ship by the amount of crew it has */ X /* industrial complexes can repair (robot ships X and offline factories can't repair) */ X if (ship->damage && Repair(ship)) { X reg int drep,cost; X reg float maxrep; X maxrep = REPAIR_RATE; X /* stations repair for free, and ships docked with them */ X if (ship->type==STYPE_STATION || !Shipdata[ship->type][ABIL_BUILD] X || (ship->is_docked && ship->whatdest==LEVEL_SHIP && X ships[ship->destshipno]->type==STYPE_STATION) ) X cost = 0.0; X else { X maxrep *= (float)ship->popn / (float)Max_crew(ship); X cost = 0.005 * maxrep * Cost(ship); X } X X if (cost > ship->resource) X { X drep = (int)maxrep * ship->resource / cost; X ship->resource = 0; X } else { X ship->resource -= cost; X drep = (int)maxrep; X } X X ship->mass -= cost * MASS_RESOURCE; X X if (drep > ship->damage) ship->damage = 0; X else X ship->damage -= drep; X } X X/* compute the mass of the ship (there is a wierd bug that changes X mass the wrong way) */ X ship->mass = ((ship->type==OTYPE_TOXWC) ? 1.0 : Mass(ship)) X + (float)ship->popn*races[ship->owner-1]->mass X + (float)ship->resource*MASS_RESOURCE X + (float)ship->fuel*MASS_FUEL X + (float)ship->destruct*MASS_DESTRUCT; X X switch (ship->type) { X X case OTYPE_CANIST: X if (ship->whatorbits == LEVEL_PLAN && !ship->is_docked) { short *t; X if (--ship->object.number) { X if ( Stinfo[ship->storbits][ship->pnumorbits].temp_add < -90 ) X Stinfo[ship->storbits][ship->pnumorbits].temp_add = -100; X else X Stinfo[ship->storbits][ship->pnumorbits].temp_add -= 10; X } else { /* timer expired; destroy canister */ X reg int j=0; X X kill_ship(1, ship); X sprintf(telegram_buf,"Notice from /%s/%s\n", X Stars[ship->storbits]->name, X Stars[ship->storbits]->pnames[ship->pnumorbits]); X sprintf(buf, "Canister of dust previously covering this planet has dissipated.\n"); X str_cat(telegram_buf, buf); X for (j=1; j<=Num_races; j++) X if (planets[ship->storbits][ship->pnumorbits]->info[j-1].numsectsowned) X push_message(TELEG_PLAYER_AUTO, j, telegram_buf, TELEGRAM); X } X } X break; X X case STYPE_MIRROR: X switch (ship->aimed_at.level) { X case LEVEL_SHIP: /* ship aimed at is a legal ship now */ X /* if in the same system */ X if ( (ship->whatorbits==LEVEL_STAR || ship->whatorbits==LEVEL_PLAN) X && (ships[ship->aimed_at.shipno]!=NULL) X && (ships[ship->aimed_at.shipno]->whatorbits==LEVEL_STAR || X ships[ship->aimed_at.shipno]->whatorbits==LEVEL_PLAN) X && ship->storbits == ships[ship->aimed_at.shipno]->storbits X && ships[ship->aimed_at.shipno]->is_alive ) { X shiptype *s; X reg int i; X float range; X s = ships[ship->aimed_at.shipno]; X range = sqrt(Distsq(ship->xpos, ship->ypos,s->xpos,s->ypos)); X i = int_rand(0,round_rand((2./((float)Size(s))) X *(float)ship->aimed_at.intensity/(range/PLORBITSIZE+1.0))); X sprintf(telegram_buf, "Space Mirror #%d %s [owner %d] aimed at ", X shipno, ship->name, ship->owner); X str_cat(telegram_buf, buf); X sprintf(buf, "%s #%d %s [owner %d] !\n",Shipnames[s->type], X ship->aimed_at.shipno, s->name, s->owner); X str_cat(telegram_buf, buf); X s->damage += i; X if(i) { X sprintf(buf, "\n%d%% damage done.\n",i); X str_cat(telegram_buf, buf); X } X if (s->damage >= 100) { X sprintf(buf, "%s #%d DESTROYED!!!\n",Shipnames[s->type], X ship->aimed_at.shipno); X kill_ship(ship->owner, s); X } X X push_message(TELEG_PLAYER_AUTO, s->owner, telegram_buf, TELEGRAM); X push_message(TELEG_PLAYER_AUTO, ship->owner, telegram_buf, TELEGRAM); X } X break; X case LEVEL_PLAN: { reg short *t; X reg int i; X float range; X range = sqrt(Distsq(ship->xpos, ship->ypos, X Stars[ship->storbits]->xpos X +planets[ship->storbits][ship->pnumorbits]->xpos, X Stars[ship->storbits]->ypos X +planets[ship->storbits][ship->pnumorbits]->ypos)); X X if ( range > PLORBITSIZE ) X i = PLORBITSIZE * ship->aimed_at.intensity/range; X else X i = ship->aimed_at.intensity; X X i = round_rand(.01*(100.0-(float)ship->damage)*(float)i); X Stinfo[ship->storbits][ship->aimed_at.pnum].temp_add += i; X X } break; X X case LEVEL_STAR: { float range; X /* have to be in the same system as the star; otherwise X it's not too fair.. */ X if (ship->aimed_at.snum>0 && X ship->aimed_at.snum < Sdata.numstars && X ship->whatorbits > LEVEL_UNIV && X ship->aimed_at.snum == ship->storbits) X Stars[ship->aimed_at.snum]->stability += random()&01; X } break; X case LEVEL_UNIV: X break; X } X break; X case STYPE_GOD: X /* gods have infinite power.... heh heh heh */ X ship->fuel = Max_fuel(ship); X ship->popn = Max_crew(ship); X ship->destruct = Max_destruct(ship); X ship->resource = Max_resource(ship); X break; X X case OTYPE_AP: /* atmospheric processor */ X /* if landed on planet, change conditions to be like race */ X if (ship->is_docked && ship->whatdest==LEVEL_PLAN && ship->on) { X int j,d,a;planettype *p; X p = planets[ship->storbits][ship->pnumorbits]; X if (ship->fuel >= 3.0) { X ship->fuel -= 3.0; X for (j=RTEMP+1; j<=OTHER; j++) { X if ( (d = races[ship->owner-1]->conditions[j] - X p->conditions[j]) != 0) { X X a = sgn(d)*int_rand(-1, X round_rand(MIN(3,d*sgn(d)) X *(float)ship->popn/(float)Shipdata[OTYPE_AP][ABIL_MAXCREW])); X if (p->conditions[j] + a < 0) X p->conditions[j] = 0; X else if (p->conditions[j] + a > 100) X p->conditions[j] = 100; X else p->conditions[j] += a; X } X } X } else if (!ship->notified) { X ship->notified = 1; X msg_OOF(ship, shipno, telegram_buf); X } X } X break; X X case OTYPE_VN: /* Von Neumann machine */ X do_VN(ship,shipno); X break; X X case OTYPE_BERS: /* Berserker */ X /* (turn done in doplanet() ) */ X break; X X case STYPE_ASS: X /* "indimidate" the planet below, for enslavement purposes. */ X if (ship->whatorbits==LEVEL_PLAN) X Stinfo[ship->storbits][ship->pnumorbits].intimidated = 1; X break; X X case OTYPE_OMCL: X /* orbital mind control laser */ X if (ship->aimed_at.level==LEVEL_PLAN && ship->on && X ship->speed==1) { X planets[ship->aimed_at.snum][ship->aimed_at.pnum] X ->is_sheep = 1; X } X break; X X case STYPE_HABITAT:{ reg int add; X /* habitats multiply some resources inside them. */ X add = ship->resource * X ((float)ship->popn / Shipdata[STYPE_HABITAT][ABIL_MAXCREW]) X * (100 - ship->damage) * 0.0005; X if (ship->resource+add > Shipdata[STYPE_HABITAT][ABIL_CARGO]) X add = Shipdata[STYPE_HABITAT][ABIL_CARGO] - ship->resource; X ship->resource += add; X ship->mass += add * MASS_RESOURCE; X add = ship->popn * races[ship->owner-1]->birthrate * X (100 - ship->damage) * 0.002; X if (ship->popn+add > Shipdata[STYPE_HABITAT][ABIL_MAXCREW]) X add = Shipdata[STYPE_HABITAT][ABIL_MAXCREW] - ship->popn; X ship->popn += add; X ship->mass += add * races[ship->owner-1]->mass; X } break; X X case STYPE_POD: X if (ship->notified) { X /* we just arrived at this system -- explode */ X /* or, we are floating in space with no fuel -- just die */ X reg int i,f; X X f = -1; X kill_ship(1, ship); X if (ship->whatorbits==LEVEL_STAR) { X X i = int_rand(0,Stars[ship->storbits]->numplanets - 1); X X if(int_rand(1,4)==1) X f = i; X X sprintf(telegram_buf, "Bulletin\n\nSpore pod #%d has warmed and exploded.\n",shipno); X if (f != -1) { X sprintf(buf,"A spore has landed on planet %s.\n",Stars[ship->storbits]->pnames[f]); X Stinfo[ship->storbits][f].Thing_add = ship->owner; X /* so doplanet does not pass over it */ X StarsInhab[ship->storbits] = 1; X setbit(Stars[ship->storbits]->inhabited,ship->owner); X setbit(Stars[ship->storbits]->explored, ship->owner); X planets[ship->storbits][f]->info[ship->owner-1].explored = 1; X } else { X sprintf(buf,"No spores have survived.\n"); X } X str_cat(telegram_buf, buf); X push_message(TELEG_PLAYER_AUTO, ship->owner, telegram_buf); X sprintf(telegram_buf,"BULLETIN!\n\n A spore pod has exploded in system /%s.\n", X Stars[ship->storbits]->name); X sprintf(buf, "Spores may have drifted to planets here.\n"); X str_cat(telegram_buf, buf); X for (i=1; i<=Num_races; i++) X if (i!=ship->owner && isset(Stars[ship->storbits]->inhabited,i)) X push_message(TELEG_PLAYER_AUTO, i, telegram_buf, TELEGRAM); X X } X } X break; X X default: X break; X } X X } X X } else if (!ship->is_alive && !ship->notified) { X /* ship is dead -- add to shipfree file, remove from all lists. */ X /* if notified, this means it's already been deleted and written. */ X/* printf("destroyed ship #%d\n",shipno);*/ X if (ship->type == OTYPE_VN || ship->type==OTYPE_BERS) { X X /* add ship to VN shit list */ X X if (ship->object.number3>0 && ship->object.number3<=Num_races X && ship->object.number3 != ship->owner) { X Sdata.VN_hitlist[ship->object.number3-1] += ship->object.number; X X /* keep track of where these VN's were shot up */ X X if (Sdata.VN_index1[ship->object.number3-1] == -1) X /* there's no star in the first index */ X Sdata.VN_index1[ship->object.number3-1] = ship->storbits; X else if (Sdata.VN_index2[ship->object.number3-1] == -1) X /* there's no star in the second index */ X Sdata.VN_index2[ship->object.number3-1] = ship->storbits; X else { X /* pick an index to supplant */ X if (random()&01) X Sdata.VN_index1[ship->object.number3-1] = ship->storbits; X else X Sdata.VN_index2[ship->object.number3-1] = ship->storbits; X } X printf("\t-- added %d ships, player %d\n", X ship->object.number, ship->object.number3); X } X } X ship->notified = 1; X makeshipdead(shipno); X } X X} X X Xdomine(shipno, detonate) Xint shipno; Xint detonate; X{ X int sh,sh2,j,shfdata,pdata,rdata,hits; X boolean trigger; X shiptype *s, *ship; X planettype *planet; X racetype *r; X X openshdata(&shfdata); X getship(shfdata, &ship, shipno); X close_file(shfdata); X Xif(ship->is_alive && ship->owner) Xswitch(ship->type) { X case STYPE_MINE: X /* check around and see if we should explode. */ X if (ship->on || detonate) { X int rad=0; int dam=0; double xd,yd,range; int p; X X switch(ship->whatorbits) { X case LEVEL_STAR: X sh = Stars[ship->storbits]->ships; X break; X case LEVEL_PLAN: X openpdata(&pdata); X getplanet(pdata, &planet, Stars[ship->storbits]->planetpos[ship->pnumorbits]); X sh = planet->ships; X close_file(pdata); X free(planet); X break; X default: X free(ship); X return; X break; X } X X sh2 = sh; X /* traverse the list, look for ships that X are closer than the trigger radius... */ X/*printf("found mine sh = %d rad = %d\n",sh,rad);*/ X rad = 0; X if(!detonate) { X openracedata(&rdata); X getrace(rdata, &r, ship->owner); X close_file(rdata); X X openshdata(&shfdata); X while (sh && !rad) { X getship(shfdata, &s, sh); X getship(shfdata, &s, sh); X if(s->is_docked && s->whatdest==LEVEL_PLAN) { X xd = ship->xpos; X yd = ship->ypos; X } else { X xd = s->xpos - ship->xpos; X yd = s->ypos - ship->ypos; X } X range = sqrt(xd*xd + yd*yd); X X if( !isset(r->allied, s->owner) && X (s->owner != ship->owner) && X ( (int)range <= ship->object.number) ) X rad = 1; X else X sh = s->nextship; X X free(s); X } X close_file(shfdata); X free(r); X } else X rad = 1; X/*printf("rad = %d\n",rad);*/ X if (rad) { X char telegram_not[1000]; X kill_ship(ship->owner, ship); X sprintf(telegram_buf, "Mine #%d triggered at %s\n", X shipno,prin_ship_orbits(ship)); X X /* I have made the blast radius equal to the trigger radius.*/ X /* -R. */ X X sh = sh2 ; /* Make sh start from beginning of the list */ X openshdata(&shfdata); X while (sh) { X getship(shfdata, &s, sh); X if(s->is_docked && s->whatdest==LEVEL_PLAN) { X xd = ship->xpos; X yd = ship->ypos; X } else { X xd = s->xpos - ship->xpos; X yd = s->ypos - ship->ypos; X } X range = sqrt(xd*xd + yd*yd); X if(!detonate) X trigger = (int_rand(1,100)<= 2 * Size(s)); X X if (s->is_alive && sh != shipno && X (detonate || (range <= ship->object.number && trigger))) { X X if (!ship->mode) { X /* radiation mine */ X X hits =MIN(ship->destruct, X (int)(ship->destruct/(range/100.0+1.0))); X rad = MAX(0, 20*(hits - Armor(s)) / Size(s)); X X rad = int_rand(0, rad); X rad = MIN(rad ,100); X X if (rad > s->rad) { X s->rad = MAX(rad, s->rad); X if(int_rand(1,100) <= s->rad) X s->active = 0; X X sprintf(telegram_not, "%s #%d %s irradiated by mine #%d\n", Shipnames[s->type], sh, s->name, shipno); X sprintf(buf," at %s - dosage %d%%\n",prin_ship_orbits(s), rad); X str_cat(telegram_not, buf); X push_message(TELEG_PLAYER_AUTO, s->owner, telegram_not, TELEGRAM); X sprintf(buf,"%s #%d [%d] received %d%% dosage\n", X Shipnames[s->type], sh, X s->owner, rad); X str_cat(telegram_buf, buf); X } X X } else { X int totaldam; X /* explosive mine */ X X hits =MIN(ship->destruct, X (int)(ship->destruct/(range/100.0+1.0))); X dam = MAX(0, 20*(hits - Armor(s)) / Size(s)); X X dam = int_rand(0, dam); X dam = MIN(100, dam); X if (dam) { X s->damage = MIN(100, s->damage+dam); X sprintf(telegram_not, "%s #%d %s damaged by mine #%d\n", X Shipnames[s->type], sh, s->name, shipno); X sprintf(buf," at %s - %d %% damage", prin_ship_orbits(ship), dam); X str_cat(telegram_not, buf); X sprintf(buf,"%s #%d [%d] received %d%% damage\n", X Shipnames[s->type], sh, X s->owner, dam); X str_cat(telegram_buf, buf); X if (s->damage >= 100) { X kill_ship(ship->owner, s); X sprintf(buf, " %s #%d DESTROYED\n",Shipnames[s->type],sh); X str_cat(telegram_not, buf); X sprintf(buf,"\t--DESTROYED\n"); X str_cat(telegram_buf, buf); X } X if(!notify(s->owner, telegram_not)) X push_message(TELEG_PLAYER_AUTO, s->owner, telegram_not, TELEGRAM); X } X } X X putship(shfdata, s, sh); X } X X sh = s->nextship; X free(s); X } X close_file(shfdata); X } X if(!notify(ship->owner, telegram_buf)) X push_message(TELEG_PLAYER_AUTO, ship->owner, telegram_buf, X TELEGRAM); X X openshdata(&shfdata); X putship(shfdata, ship, shipno); X close_file(shfdata); X } X break; X default: X break; X } Xfree(ship); X} X END_OF_FILE if test 17924 -ne `wc -c <'server/doship.c'`; then echo shar: \"'server/doship.c'\" unpacked with wrong size! fi # end of 'server/doship.c' if test -f 'server/name.c' -a "${1}" != "-c" ; then echo shar: Renaming existing file \"'server/name.c'\" to \"'server/name.c.orig'\" mv -f 'server/name.c' 'server/name.c.orig' fi echo shar: Extracting \"'server/name.c'\" \(17264 characters\) sed "s/^X//" >'server/name.c' <<'END_OF_FILE' X/* X * Galactic Bloodshed, copyright (c) 1989 by Robert P. Chansky, X * smq@ucscb.ucsc.edu, mods by people in GB_copyright.h. X * Restrictions in GB_copyright.h. X * X * name.c -- rename something to something else X* announce.c -- make announcements in the system you currently in. X* You must be inhabiting that system for your message to sent. X* You must also be in that system (and inhabiting) to receive announcements. X* page.c -- send a message to a player requesting his presence in a system. X*/ X X#include "GB_copyright.h" X#define EXTERN extern X#include "vars.h" X#include "races.h" X#include "ships.h" X#include "buffers.h" X#include <ctype.h> X#include <signal.h> X#include <strings.h> X#include <time.h> Xint name_shdata,name_stardata, name_racedata, name_pdata; Xint i; X Xchar msg[1024]; Xstruct tm *current_tm;/* for watching for next update */ Xlong clk; X Xgive(Playernum, APcount, argn, args) Xint Playernum; Xint APcount; Xint argn; Xchar args[MAXARGS][COMMANDSIZE]; X{ Xint who, sh; Xshiptype *ship; Xplanettype *planet; Xracetype *Race, *alien; X XGetPlayer(args[1], &who, &alien); X if (who < 1 || who > Numraces() ) { X sprintf(buf,"No such player.\n"); X notify(Playernum, buf); X return; X } X Xopenracedata(&name_racedata); Xgetrace(name_racedata, &Race, Playernum); Xclose_file(name_racedata); X X/* check to see if both players are mutually allied */ Xif(!(isset(Race->allied, who) && isset(alien->allied, Playernum))) { X notify(Playernum, "You two are not mutually allied.\n"); X free(Race); X free(alien); X return; X} Xsscanf(args[2]+(args[2][0]=='#'), "%d", &sh); X X openshdata(&name_shdata); X if(!getship(name_shdata, &ship, sh)) { X notify(Playernum, "Illegal ship number.\n"); X close_file(name_shdata); X free(Race); X free(alien); X return; X } X close_file(name_shdata); X X if(ship->owner != Playernum || !ship->is_alive) { X DontOwnErr(Playernum, sh); X free(ship); X free(Race); X free(alien); X return; X } Xif(ship->type == STYPE_POD) { X notify(Playernum, "You cannot change the ownership of spore pods.\n"); X free(ship); X free(Race); X free(alien); X return; X} X Xif(ship->popn && !Race->God) { X notify(Playernum, "You can't give this ship away while it has crew on board.\n"); X free(ship); X free(Race); X free(alien); X return; X } X Xswitch(ship->whatorbits) { X case LEVEL_UNIV: X if(!enufAP(Playernum, Sdata.AP[Playernum-1], APcount)) { X free(Race); X free(alien); X free(ship); X return; X } X break; X default: X if (!enufAP(Playernum,Stars[Dir[Playernum-1].snum]->AP[Playernum-1], APcount)) { X free(Race); X free(alien); X free(ship); X return; X } X break; X } X Xopenshdata(&name_shdata); Xship->owner = who; Xputship(name_shdata, ship, sh); Xclose_file(name_shdata); X X/* set inhabited/explored bits */ Xswitch(ship->whatorbits) { X case LEVEL_UNIV: X break; X case LEVEL_STAR: X free(Stars[ship->storbits]); X openstardata(&name_stardata); X getstar(name_stardata, &(Stars[ship->storbits]), ship->storbits); X setbit(Stars[ship->storbits]->inhabited, who); X setbit(Stars[ship->storbits]->explored, who); X putstar(name_stardata, Stars[ship->storbits], ship->storbits); X close_file(name_stardata); X break; X case LEVEL_PLAN: X free(Stars[ship->storbits]); X openstardata(&name_stardata); X getstar(name_stardata, &(Stars[ship->storbits]), ship->storbits); X setbit(Stars[ship->storbits]->inhabited, who); X setbit(Stars[ship->storbits]->explored, who); X putstar(name_stardata, Stars[ship->storbits], ship->storbits); X close_file(name_stardata); X X openpdata(&name_pdata); X getplanet(name_pdata, &planet, Stars[ship->storbits]->planetpos[ship->pnumorbits]); X planet->info[who-1].explored = 1; X putplanet(name_pdata, planet, Stars[ship->storbits]->planetpos[ship->pnumorbits]); X close_file(name_pdata); X free(planet); X X break; X default: X notify(Playernum, "Something wrong with this ship's scope.\n"); X free(ship); X free(Race); X free(alien); X return; X break; X} X Xswitch(ship->whatorbits) { X case LEVEL_UNIV: X deductAPs(Playernum, APcount, 0, 1); X free(Race); X free(alien); X free(ship); X return; X break; X default: X deductAPs(Playernum,APcount, Dir[Playernum-1].snum, 0); X break; X } X X Xnotify(Playernum, "Owner changed.\n"); Xsprintf(buf, "%s [%d] gave you %s #%d at %s.\n", Race->name, Playernum, X Shipnames[ship->type], sh, prin_ship_orbits(ship)); Xnotify(who, buf); Xpush_message(TELEG_PLAYER_AUTO, who, buf, TELEGRAM); X Xsprintf(buf, "%s [%d] gives %s [%d] a ship.\n", Race->name, alien->name); X Xfor(i=1; i<=Numraces(); i++) X push_message(TELEG_PLAYER_AUTO, who, buf, TRANSFER); X Xfree(ship); Xfree(Race); Xfree(alien); X X} X X Xpage(Playernum, APcount0, argn, args) Xint Playernum; Xint APcount0; Xint argn; Xchar args[MAXARGS][COMMANDSIZE]; X{ Xint i, who, to_block, dummy, APcount; Xracetype *Race, *alien; X XAPcount = APcount0; Xto_block = 0; Xif(!strncmp(args[1], "block", strlen(args[1]))) { X to_block = 1; X notify(Playernum, "Paging alliance block.\n"); X} else { X GetPlayer(args[1], &who, &alien); X if (who < 1 || who > Numraces() ) { X sprintf(buf,"No such player.\n"); X notify(Playernum, buf); X return; X } XAPcount *= !alien->God; Xfree(alien); X} X X switch(Dir[Playernum-1].level) { X case LEVEL_UNIV: X sprintf(buf, "You can't make pages at universal scope.\n"); X notify(Playernum, buf); X break; X default: X openstardata(&name_stardata); X free(Stars[Dir[Playernum-1].snum]); X getstar(name_stardata, &Stars[Dir[Playernum-1].snum], Dir[Playernum-1].snum); X close_file(name_stardata); X if (!enufAP(Playernum,Stars[Dir[Playernum-1].snum]->AP[Playernum-1], APcount)) { X free(Race); X return; X } X X openracedata(&name_racedata); X getrace(name_racedata, &Race, Playernum); X close_file(name_racedata); X X sprintf(buf, "%s page(s) you from the %s star system.\n", X Race->name, Stars[Dir[Playernum-1].snum]->name); X free(Race); X X if(to_block) { X dummy = (Blocks[Playernum-1].invite & X Blocks[Playernum-1].pledge); X for(i=1; i<=Numraces(); i++) X if(isset(dummy, i) && i!=Playernum) X notify(i, buf); X } else X notify(who, buf); X X notify(Playernum, "Request sent.\n"); X break; X } X deductAPs(Playernum, APcount, Dir[Playernum-1].snum, 0); X} X Xsend_message(Playernum, APcount0, argn, args) Xint Playernum; Xint APcount0; Xint argn; Xchar args[MAXARGS][COMMANDSIZE]; X{ Xint who, i, j, to_block, dummy, APcount; Xracetype *Race, *alien; X X APcount = APcount0; X Num_races = Numraces(); X Xto_block = 0; Xif(!strncmp(args[1], "block", strlen(args[1]))) { X to_block = 1; X notify(Playernum, "Sending message to alliance block.\n"); X} else { X GetPlayer(args[1], &who, &alien); X if (who < 1 || who > Num_races ) { X sprintf(buf,"No such player.\n"); X notify(Playernum, buf); X return; X } XAPcount *= !alien->God; Xfree(alien); X} X X switch(Dir[Playernum-1].level) { X case LEVEL_UNIV: X sprintf(buf, "You can't send messages from universal scope.\n"); X notify(Playernum, buf); X return; X break; X X case LEVEL_SHIP: X sprintf(buf, "You can't send messages from ship scope.\n"); X notify(Playernum, buf); X return; X break; X X default: X openstardata(&name_stardata); X free(Stars[Dir[Playernum-1].snum]); X getstar(name_stardata, &Stars[Dir[Playernum-1].snum], Dir[Playernum-1].snum); X close_file(name_stardata); X if (!enufAP(Playernum,Stars[Dir[Playernum-1].snum]->AP[Playernum-1], APcount)) X return; X break; X } X Xopenracedata(&name_racedata); Xgetrace(name_racedata, &Race, Playernum); Xclose_file(name_racedata); X X /* send the message */ X sprintf(msg, "From %s [%d]: ", Race->name, Playernum); X X/* put the message together */ X for(j=2; j < argn; j++) X { X sprintf(buf, "%s ", args[j]); X strcat(msg, buf); X } X/* post it */ X sprintf(buf, "%s has sent you a telegram. Use `read' to read it.\n", Race->name); X if(to_block) { X dummy = (Blocks[Playernum-1].invite & X Blocks[Playernum-1].pledge); X sprintf(buf, "%s [%d] sends a message to alliance block.\n", X Race->name, Playernum); X for(i=1; i<=Num_races; i++) { X if(isset(dummy, i) && i!=Playernum) { X notify(i, buf); X push_message(Playernum, i, msg, TELEGRAM); X } X push_message(TELEG_PLAYER_AUTO, i, buf, TRANSFER); X } X } else { X notify(who, buf); X push_message(Playernum, who, msg, TELEGRAM); X X openracedata(&name_racedata); X getrace(name_racedata, &alien, who); X X sprintf(buf, "%s [%d] sends a message to %s [%d].\n", X Race->name, Playernum, alien->name, who); X X for(i=1; i<=Num_races; i++) X push_message(TELEG_PLAYER_AUTO, i, buf, TRANSFER); X X /* translation modifier increases */ X alien->translate[Playernum-1] = MIN(alien->translate[Playernum-1]+2, 100); X putrace(name_racedata, alien); X close_file(name_racedata); X free(alien); X } X X free(Race); X notify(Playernum, "Message sent.\n"); XdeductAPs(Playernum, APcount, Dir[Playernum-1].snum, 0); X} X Xread_messages(Playernum, APcount, argn, args) Xint Playernum; Xint APcount; Xint argn; Xchar args[MAXARGS][COMMANDSIZE]; X{ Xint i; X i = strlen(args[1]); X X if(argn==1 || !strncmp("telegram", args[1], i)) X teleg_read(Playernum, TELEGRAM); X else if(!strncmp("news", args[1], i)) { X notify(Playernum, CUTE_MESSAGE); X notify(Playernum, "\n---------- Politics ----------\n"); X teleg_read(Playernum, DECLARATION); X notify(Playernum, "\n---------- War Stories ----------\n"); X teleg_read(Playernum, COMBAT); X notify(Playernum, "\n---------- Wheelin' and Dealin' ----------\n"); X teleg_read(Playernum, TRANSFER); X notify(Playernum, "\n---------- Classifieds ----------\n"); X teleg_read(Playernum, ANNOUNCE); X } else X notify(Playernum, "Read what?\n"); X } X X Xannounce(Playernum, APcount, argn, args, broadcast) Xint Playernum; Xint APcount; Xint argn; Xchar args[MAXARGS][COMMANDSIZE]; Xint broadcast; X{ Xint i, j; Xracetype *r, *Race; X Xopenracedata(&name_racedata); Xgetrace(name_racedata, &Race, Playernum); Xclose_file(name_racedata); X Xswitch(Dir[Playernum-1].level) { X case LEVEL_UNIV: X sprintf(buf, "You can't make announcements at universal scope.\n"); X notify(Playernum, buf); X break; X default: X openstardata(&name_stardata); X free(Stars[Dir[Playernum-1].snum]); X getstar(name_stardata, &Stars[Dir[Playernum-1].snum], Dir[Playernum-1].snum); X close_file(name_stardata); X if (!enufAP(Playernum,Stars[Dir[Playernum-1].snum]->AP[Playernum-1], APcount)) { X free(Race); X return; X X } X if(!(!!isset(Stars[Dir[Playernum-1].snum]->inhabited, Playernum) || Race->God)) { X sprintf(buf, "You do not inhabit this system or have diety privileges.\n"); X notify(Playernum, buf); X free(Race); X return; X } X Xif(!broadcast) X sprintf(msg, "%s : ", Race->name); Xelse X sprintf(msg, "%s [%d] > ", Race->name, Playernum); X X Num_races = Numraces(); X X for(j=1; j < argn; j++) X { X sprintf(buf, "%s ", args[j]); X strcat(msg, buf); X } X strcat(msg, "\n"); X X for(i=1; i<=Num_races; i++) X if(i != Playernum) { X openracedata(&name_racedata); X getrace(name_racedata, &r, i); X close_file(name_racedata); X X if((broadcast && !r->gag) || (Dir[i-1].level != LEVEL_UNIV && (Dir[i-1].snum == Dir[Playernum-1].snum) X && (!!isset(Stars[Dir[Playernum-1].snum]->inhabited, i) || Race->God))) X notify(i, msg); X free(r); X } X X break; X } X X deductAPs(Playernum,APcount, Dir[Playernum-1].snum, 0); Xfree(Race); X} X X Xmotto(Playernum, APcount, argn, args) Xint Playernum; Xint APcount; Xint argn; Xchar args[MAXARGS][COMMANDSIZE]; X{ Xint i; Xchar temp[128]; X Xsprintf(buf, "%s", args[1]); X for(i=2; i < argn; i++) X { X sprintf(temp, " %s", args[i]); X strcat(buf, temp); X } X X sprintf(Blocks[Playernum-1].motto, "%s", buf); X Putblock(Blocks); X notify(Playernum, "Done.\n"); X} X Xname(Playernum,APcount, argn,args) Xint Playernum; Xint APcount; Xint argn; Xchar args[MAXARGS][COMMANDSIZE]; X{ Xchar *ch; Xregister int i, s, spaces; Xboolean check=0; Xshiptype *ship; Xstartype *star; Xplanettype *p; Xchar string[1024]; Xchar temp[128]; Xracetype *Race; X Xname_stardata = NEUTRAL_FD; X Xif(!isalnum(args[2][0]) || argn < 3) { X notify(Playernum, "Illegal name format.\n"); X return; X } X Xsprintf(buf, "%s", args[2]); X for(i=3; i < argn; i++) X { X sprintf(temp, " %s", args[i]); X strcat(buf, temp); X } X Xsprintf(string, "%s", buf); X X i=strlen(args[0]); X X /* make sure there are no ^'s or '/' in name, X also make sure the name has at least 1 character in it */ X ch = string; X spaces = 0; X while (*ch!='\0') { X check |= ((!isalnum(*ch) && !(*ch==' ')) || (*ch=='/') ); X ch++; X if(*ch==' ') spaces++; X } X X if(spaces==strlen(buf)) { X notify(Playernum, "Illegal name.\n"); X return; X } X X if (strlen(buf) < 1 || check) { X sprintf(buf, "Illegal name %s.\n", check ? "form" : "length" ); X notify(Playernum, buf); X return; X } X X if (!strncmp(args[1],"ship",i)) { X if(Dir[Playernum-1].level == LEVEL_SHIP) { X openshdata(&name_shdata); X getship(name_shdata, &ship, Dir[Playernum-1].shipno); X X sprintf(ship->name, "%s", buf); X putship(name_shdata, ship, Dir[Playernum-1].shipno); X close_file(name_shdata); X notify(Playernum, "Name set.\n"); X free(ship); X return; X } else { X notify(Playernum, "You have to 'cs' to a ship to name it.\n"); X return; X } X } else if (!strncmp(args[1],"class",i)) { X if(Dir[Playernum-1].level == LEVEL_SHIP) { X openshdata(&name_shdata); X getship(name_shdata, &ship, Dir[Playernum-1].shipno); X close_file(name_shdata); X if(ship->type != OTYPE_FACTORY) { X notify(Playernum, "You are not at a factory!\n"); X free(ship); X return; X } X if(ship->on) { X notify(Playernum, "This factory is already on line.\n"); X free(ship); X return; X } X X sprintf(ship->class, "%s", buf); X openshdata(&name_shdata); X putship(name_shdata, ship, Dir[Playernum-1].shipno); X close_file(name_shdata); X notify(Playernum, "Class set.\n"); X free(ship); X return; X } else { X notify(Playernum, "You have to 'cs' to a factory to name the ship class.\n"); X return; X } X } else if (!strncmp(args[1], "block", i)) { X/* name your alliance block */ X sprintf(Blocks[Playernum-1].name, "%s", buf); X Putblock(Blocks); X notify(Playernum, "Done.\n"); X }else if (!strncmp(args[1],"star",i)) { X X if(Dir[Playernum-1].level == LEVEL_STAR) { X openracedata(&name_racedata); X getrace(name_racedata, &Race, Playernum); X close_file(name_racedata); X if (!Race->God) { X notify(Playernum, "Only dieties may name a star.\n"); X free(Race); X return; X } X free(Race); X/* got to get all stars, to stop cheaters */ X openstardata(&name_stardata); X for (s=0; s<Sdata.numstars; s++) { X free(Stars[s]); X getstar(name_stardata, &Stars[s], s); X } X close_file(name_stardata); X X for(s=0; s<Sdata.numstars; s++) { X if(s!=Dir[Playernum-1].snum) X if(!strncmp(Stars[s]->name, buf, strlen(Stars[s]->name))) X { X notify(Playernum, X "Thats not fair trying to name a star that! 50 APs deducted for cheating!!!\n"); X return; X } X } X X X/* check to see if there are any other stars with this name - stops cheaters */ X X Xsprintf(Stars[Dir[Playernum-1].snum]->name, "%s", buf); X openstardata(&name_stardata); X putstar(name_stardata, Stars[Dir[Playernum-1].snum], X Dir[Playernum-1].snum); X close_file(name_stardata); X } else { X notify(Playernum, "You have to 'cs' to a star to name it.\n"); X return; X } X } else if (!strncmp(args[1],"planet",i)) { X if(Dir[Playernum-1].level == LEVEL_PLAN) { X free(Stars[Dir[Playernum-1].snum]); X openstardata(&name_stardata); X getstar(name_stardata, &Stars[Dir[Playernum-1].snum], Dir[Playernum-1].snum); X close_file(name_stardata); X X openracedata(&name_racedata); X getrace(name_racedata, &Race, Playernum); X close_file(name_racedata); X X if (!Race->God && !MostAPs(Playernum,Stars[Dir[Playernum-1].snum])) { X notify(Playernum,"You don't have the most AP's in that system.\n"); X free(Race); X return; X } X free(Race); X X for(s=0; s<Stars[Dir[Playernum-1].snum]->numplanets; s++) X if(!strncmp(Stars[Dir[Playernum-1].snum]->pnames[s], buf, X strlen(Stars[Dir[Playernum-1].snum]->pnames[s]))) X { X notify(Playernum, X "Sorry, that name is already taken. 50 APs deducted for cheating!!!\n"); X return; X } X X Xsprintf(Stars[Dir[Playernum-1].snum]->pnames[Dir[Playernum-1].pnum], "%s", buf); X openstardata(&name_stardata); X putstar(name_stardata, Stars[Dir[Playernum-1].snum], Dir[Playernum-1].snum); X close_file(name_stardata); X deductAPs(Playernum, APcount, Dir[Playernum-1].snum, 0); X X } else { X notify(Playernum, "You have to 'cs' to a planet to name it.\n"); X return; X } X } else if (!strncmp(args[1],"race",i)) { X openracedata(&name_racedata); X getrace(name_racedata, &Race, Playernum); X sprintf(Race->name, "%s", buf); X putrace(name_racedata, Race); X close_file(name_racedata); X free(Race); X } else { X notify(Playernum, "I don't know what you mean.\n"); X return; X } X X} X X Xint MostAPs(Playernum,s) Xint Playernum; Xstartype *s; X{ X register int i,t = 0; X X for (i=0; i<MAXPLAYERS; i++) X if (s->AP[i] >= t) X t = s->AP[i]; X X return (s->AP[Playernum-1] == t); X X} X X END_OF_FILE if test 17264 -ne `wc -c <'server/name.c'`; then echo shar: \"'server/name.c'\" unpacked with wrong size! fi # end of 'server/name.c' echo shar: End of archive 6 \(of 9\). cp /dev/null ark6isdone MISSING="" for I in 1 2 3 4 5 6 7 8 9 ; do if test ! -f ark${I}isdone ; then MISSING="${MISSING} ${I}" fi done if test "${MISSING}" = "" ; then echo You have unpacked all 9 archives. rm -f ark[1-9]isdone ark[1-9][0-9]isdone else echo You still need to unpack the following archives: echo " " ${MISSING} fi ## End of shell archive. exit 0