Date: Tuesday February 5, 2002 @ 16:52 Author: xyzzy Update of /home/netrek/cvsroot/Vanilla/ntserv In directory swashbuckler.real-time.com:/var/tmp/cvs-serv5681 Modified Files: daemonII.c interface.c phaser.c redraw.c rsa_key.c wander2.c Log Message: Fix stupid bug from last change. ?: has lower precedence than *, will I never learn? **************************************** Index: Vanilla/ntserv/daemonII.c diff -u Vanilla/ntserv/daemonII.c:1.37 Vanilla/ntserv/daemonII.c:1.38 --- Vanilla/ntserv/daemonII.c:1.37 Mon Jun 4 17:06:28 2001 +++ Vanilla/ntserv/daemonII.c Tue Feb 5 16:52:58 2002 @@ -281,7 +281,7 @@ #define PLFIGHTFUSE 5 #define SIGHTFUSE 5 #define BEAMFUSE 8 /* scott 8/25/90 -- was 10 */ -#define PMOVEFUSE 300 /* planet movement fuse 07/26/95 JRP */ +#define PMOVEFUSE 50 /* planet movement fuse 07/26/95 JRP */ #define QUEUEFUSE 600 /* cleanup every 60 seconds */ #ifdef INL_POP #define PLANETFUSE 400/MAXPLANETS /* INL 3.9 POP */ @@ -1519,8 +1519,8 @@ continue; if (j == owner) continue; - if (j->p_team == owner->p_team) - continue; +/* if (j->p_team == owner->p_team) + continue; */ if (! ((t->t_war & j->p_team) || (t->t_team & j->p_war))) continue; @@ -3107,6 +3107,8 @@ l->pl_owner = j->p_team; l->pl_info = j->p_team; + + pnewhome(l); #ifdef LTD_STATS /* LTD is valid only for tourn mode */ @@ -4225,6 +4227,7 @@ for (i = 0; i< 40; i++) { planets[i].pl_armies = top_armies; } + preset(); for (i = 0; i < 4; i++){ /* one core AGRI */ planets[core_planets[i][random() % 4]].pl_flags |= PLAGRI; Index: Vanilla/ntserv/interface.c diff -u Vanilla/ntserv/interface.c:1.10 Vanilla/ntserv/interface.c:1.11 --- Vanilla/ntserv/interface.c:1.10 Thu May 10 05:37:11 2001 +++ Vanilla/ntserv/interface.c Tue Feb 5 16:52:58 2002 @@ -430,33 +430,41 @@ void do_refit(int type) { - int i=0; + int i=0, fastrefit = 1; struct ship_cap_spacket ShipFoo; if (type<0 || type>=ATT) return; + + if (shipsallowed[type]==0) { + new_warning(57,"That ship hasn't been designed yet."); + return; + } + + if(type == STARBASE || me->p_ship.s_type == STARBASE) fastrefit = 0; + + if(!fastrefit) { + if (me->p_flags & PFORBIT) { if (!(planets[me->p_planet].pl_flags & PLHOME)) { - new_warning(50,"You must orbit your HOME planet to apply for command reassignment!"); + new_warning(50,"You must orbit your HOME planet to apply for command reassignment!"); return; } else { if (!(planets[me->p_planet].pl_flags & me->p_team)) { - new_warning(51,"You must orbit your home planet to apply for command reassignment!"); + new_warning(51,"You must orbit your home planet to apply for command reassignment!"); return; } } /* if (PLHOME) */ } else if (me->p_flags & PFDOCK) { - if (type == STARBASE - - ) { - new_warning(52,"Can only refit to starbase on your home planet."); + if (type == STARBASE) { + new_warning(52,"Can only refit to starbase on your home planet."); return; } if (players[me->p_docked].p_team != me->p_team) { - new_warning(53,"You must dock YOUR starbase to apply for command reassignment!"); + new_warning(53,"You must dock YOUR starbase to apply for command reassignment!"); return; } } else { - new_warning(54,"Must orbit home planet or dock your starbase to apply for command reassignment!"); + new_warning(54,"Must orbit home planet or dock your starbase to apply for command reassignment!"); return; } @@ -467,59 +475,50 @@ return; } + } /* end !fastrefit checks */ + if ((me->p_armies > 0)) { new_warning(56,"You must beam your armies down before moving to your new ship"); return; } - if (shipsallowed[type]==0) { - new_warning(57,"That ship hasn't been designed yet."); - return; - } - if (type == STARBASE) { if (me->p_stats.st_rank < sbrank) { if(send_short){ swarning(SBRANK_TEXT,sbrank,0); - } - else { - - new_warning(UNDEF,"You need a rank of %s or higher to command a starbase!", ranks[sbrank].name); + } else { + new_warning(UNDEF,"You need a rank of %s or higher to command a starbase!", ranks[sbrank].name); } return; } } - if (type == STARBASE && chaos) { + if (type == STARBASE) { int num_bases = 0; + if(!chaos) max_chaos_bases = 1; + for (i=0; i<MAXPLAYER; i++) if ((me->p_no != i) && (players[i].p_status == PALIVE) && - (players[i].p_team == me->p_team)) - if (players[i].p_ship.s_type == STARBASE) { - num_bases++; - } + (players[i].p_team == me->p_team) && + (players[i].p_ship.s_type == STARBASE)) num_bases++; + if (num_bases >= max_chaos_bases) { - new_warning(UNDEF,"Your side already has %d starbase%s",max_chaos_bases,(max_chaos_bases>1) ? "s!":"!"); - return; + if(max_chaos_bases==0) { + new_warning(UNDEF,"Your side isn't allowed to have starbases"); + } else if(max_chaos_bases==1) { + new_warning(58,"Your side already has a starbase!"); + } else { + new_warning(UNDEF,"Your side already has %d starbase%s",max_chaos_bases,(max_chaos_bases>1) ? "s!":"!"); + } + return; } } - else if (type == STARBASE && !chaos) { - for (i=0; i<MAXPLAYER; i++) - if ((me->p_no != i) && - (players[i].p_status == PALIVE) && - (players[i].p_team == me->p_team)) - if (players[i].p_ship.s_type == STARBASE) { - new_warning(58,"Your side already has a starbase!"); - return; - } - } if (type == STARBASE && !chaos && !topgun) { if (realNumShips(me->p_team) < 4) { if(send_short){ swarning(TEXTE,59,0); - } - else - new_warning(UNDEF,"Your team is not capable of defending such an expensive ship"); + } else + new_warning(UNDEF,"Your team is not capable of defending such an expensive ship"); return; } } @@ -534,9 +533,12 @@ return; } + /* They have finally passed the screening process for potential + starship captains. Give them their new ship! */ + if ((me->p_ship.s_type == STARBASE)/* && (type != STARBASE)*/) { /* Reset kills to 0.0 */ - me->p_kills=0; + me->p_kills = 0; /* bump all docked ships */ for (i=0; i<NUMPORTS; i++) if (me->p_port[i] != VACANT) { @@ -547,10 +549,46 @@ } } - - getship(&(me->p_ship), type); - /* Notify client of new ship stats, if necessary */ + if (type != STARBASE && me->p_kills < plkills) { + me->p_ship.s_plasmacost = -1; + } + + if (fastrefit) { + struct ship *newship = &shipvals[type], + *oldship = &me->p_ship; + me->p_shield *= (float)newship->s_maxshield/oldship->s_maxshield; + me->p_damage *= (float)newship->s_maxdamage/oldship->s_maxdamage; + me->p_fuel *= (float)newship->s_maxfuel/oldship->s_maxfuel; + me->p_wtemp *= (float)newship->s_maxwpntemp/oldship->s_maxwpntemp; + me->p_etemp *= (float)newship->s_maxegntemp/oldship->s_maxegntemp; + me->p_flags &= ~PFREFIT; + me->p_flags |= PFREFITTING; + me->p_ship.s_type = type; + rdelay = me->p_updates + 1; + getship(&(me->p_ship), type); + } else { + getship(&(me->p_ship), type); + + me->p_shield = me->p_ship.s_maxshield; + me->p_damage = 0; + me->p_fuel = me->p_ship.s_maxfuel; + me->p_wtemp = 0; + me->p_wtime = 0; + me->p_etemp = 0; + me->p_etime = 0; + me->p_ship.s_type = type; + if (type == STARBASE) { + me->p_docked = 0; + for (i=0; i<4; i++) me->p_port[i] = VACANT; + me->p_flags |= PFDOCKOK; + } + me->p_flags &= ~(PFREFIT|PFWEP|PFENG); + me->p_flags |= PFREFITTING; + rdelay = me->p_updates + 50; + } + #ifndef ROBOT + /* Notify client of new ship stats, if necessary */ if ((F_ship_cap)&&(!sent_ship[type])) { sent_ship[type] = 1; ShipFoo.type = SP_SHIP_CAP; @@ -575,26 +613,6 @@ sendClientPacket((CVOID) &ShipFoo); } #endif - if (type != STARBASE && me->p_kills < plkills) { - me->p_ship.s_plasmacost = -1; - } - me->p_shield = me->p_ship.s_maxshield; - me->p_damage = 0; - me->p_fuel = me->p_ship.s_maxfuel; - me->p_wtemp = 0; - me->p_wtime = 0; - me->p_etemp = 0; - me->p_etime = 0; - me->p_ship.s_type = type; - if (type == STARBASE) { - me->p_docked = 0; - for (i=0; i<4; i++) me->p_port[i] = VACANT; - me->p_flags |= PFDOCKOK; - } - - me->p_flags &= ~(PFREFIT|PFWEP|PFENG); - me->p_flags |= PFREFITTING; - rdelay = me->p_updates + 50; new_warning(62,"You are being transported to your new vessel .... "); } Index: Vanilla/ntserv/phaser.c diff -u Vanilla/ntserv/phaser.c:1.2 Vanilla/ntserv/phaser.c:1.3 --- Vanilla/ntserv/phaser.c:1.2 Fri Apr 30 15:18:45 1999 +++ Vanilla/ntserv/phaser.c Tue Feb 5 16:52:58 2002 @@ -260,7 +260,7 @@ return; } - /* pstatus == PHHIT2 */ { + /* pstatus == PHHIT2 */ #ifdef LTD_STATS @@ -272,58 +272,52 @@ #endif - if (pingpong_plasma) { - - mine->ph_damage = me->p_ship.s_phaserdamage * - (1.0-((float) range/(float) myphrange)); - if ((target_plasma->t_war & me->p_team) - || (me->p_hostile & target_plasma->t_team)) { - int rand_plasmadir; - int rand_plasmaturns; - mine->ph_x = target_plasma->t_x; - mine->ph_y = target_plasma->t_y; - mine->ph_status = PHHIT2; - target_plasma->t_damage+=mine->ph_damage/4; - target_plasma->t_gspeed+=mine->ph_damage/100; - srandom(getpid() * time((time_t *) 0)); - rand_plasmadir = random() % 9; - rand_plasmaturns = random() % 9; - if (rand_plasmadir < 8) - rand_plasmadir = 128; - else rand_plasmadir = 80; - if (rand_plasmaturns < 7) target_plasma->t_turns++; - target_plasma->t_dir = (target_plasma->t_dir+rand_plasmadir)%256; - players[target_plasma->t_owner].p_nplasmatorp--; - target_plasma->t_owner=me->p_no; - me->p_nplasmatorp++; - target_plasma->t_team=me->p_team; - target_plasma->t_war=me->p_hostile; - target_plasma->t_fuse+=mine->ph_damage * .25 + 5; - new_warning(UNDEF, "Ping-Pong!"); - } - else { - mine->ph_x = target_plasma->t_x; - mine->ph_y = target_plasma->t_y; - mine->ph_status = PHHIT2; - target_plasma->t_damage+=mine->ph_damage; - target_plasma->t_gspeed+=mine->ph_damage/100; - target_plasma->t_turns++; - target_plasma->t_dir = me->p_dir; - players[target_plasma->t_owner].p_nplasmatorp--; - target_plasma->t_owner=me->p_no; - me->p_nplasmatorp++; - target_plasma->t_team=me->p_team; - target_plasma->t_war=me->p_hostile; - target_plasma->t_fuse+=mine->ph_damage * .25 + 5; - new_warning(UNDEF, "You deflected the plasma!"); } - } - - if (!pingpong_plasma) { - mine->ph_x = target_plasma->t_x; - mine->ph_y = target_plasma->t_y; - target_plasma->t_status = TDET; - target_plasma->t_whodet = me->p_no; - new_warning(38, "You destroyed the plasma torpedo!"); - } + if (pingpong_plasma) { + mine->ph_damage = me->p_ship.s_phaserdamage * + (1.0-((float) range/(float) myphrange)); + mine->ph_x = target_plasma->t_x; + mine->ph_y = target_plasma->t_y; + if ( (target_plasma->t_war & me->p_team) || + (me->p_hostile & target_plasma->t_team)) { + /* Unfriendly plasmas */ + fprintf(stderr, "phasered unfriendly plasma!\n"); + + /* Plasma does a quick 180 */ + target_plasma->t_dir=(target_plasma->t_dir+128)%256; + + /* Give plasma more fuse, so the fun does't stop */ + target_plasma->t_fuse+=mine->ph_damage * .25 + 5; + +// target_plasma->t_damage+=mine->ph_damage/4; +// target_plasma->t_gspeed+=mine->ph_damage/100; + + new_warning(UNDEF, "Ping-Pong!"); + } else { + /* Friendly plasma */ + fprintf(stderr, "phasered friendly plasma!\n"); + + /* Plasma points direction ship phasering it is pointed */ + target_plasma->t_dir = me->p_dir; + + target_plasma->t_fuse+=mine->ph_damage * .25 + 5; + + target_plasma->t_damage+=mine->ph_damage; + target_plasma->t_gspeed+=mine->ph_damage/100; + target_plasma->t_turns++; + new_warning(UNDEF, "You deflected the plasma!"); + } + + /* Switch owners & teams */ + players[target_plasma->t_owner].p_nplasmatorp--; + target_plasma->t_owner=me->p_no; me->p_nplasmatorp++; + target_plasma->t_team=me->p_team; + target_plasma->t_war=me->p_war; + + } else { + mine->ph_x = target_plasma->t_x; + mine->ph_y = target_plasma->t_y; + target_plasma->t_status = TDET; + target_plasma->t_whodet = me->p_no; + new_warning(38, "You destroyed the plasma torpedo!"); } } Index: Vanilla/ntserv/redraw.c diff -u Vanilla/ntserv/redraw.c:1.11 Vanilla/ntserv/redraw.c:1.12 --- Vanilla/ntserv/redraw.c:1.11 Tue Feb 5 06:06:40 2002 +++ Vanilla/ntserv/redraw.c Tue Feb 5 16:52:58 2002 @@ -414,7 +414,7 @@ #endif pl = me; /* Not observer, just use my kills */ - troop_capacity = pl->p_kills * (myship->s_type == ASSAULT)?3:2; + troop_capacity = pl->p_kills * (myship->s_type == ASSAULT?3:2); if (myship->s_type == STARBASE || troop_capacity > myship->s_maxarmies) troop_capacity = myship->s_maxarmies; Index: Vanilla/ntserv/rsa_key.c diff -u Vanilla/ntserv/rsa_key.c:1.1 Vanilla/ntserv/rsa_key.c:1.2 --- Vanilla/ntserv/rsa_key.c:1.1 Wed Nov 11 20:44:53 1998 +++ Vanilla/ntserv/rsa_key.c Tue Feb 5 16:52:58 2002 @@ -1,4 +1,3 @@ -#ifndef lint #ifdef RSA /* rsa_key.c @@ -140,4 +139,3 @@ return 0; } #endif /* RSA */ -#endif /* lint */ Index: Vanilla/ntserv/wander2.c diff -u Vanilla/ntserv/wander2.c:1.3 Vanilla/ntserv/wander2.c:1.4 --- Vanilla/ntserv/wander2.c:1.3 Tue Aug 15 02:57:58 2000 +++ Vanilla/ntserv/wander2.c Tue Feb 5 16:52:58 2002 @@ -4,33 +4,34 @@ #include "struct.h" #include "data.h" /* Includes global variable extern defs */ -#define COS(x) ((x) >= 0.0 ? Cosine[(int)(x)] : Cosine[(int)(-(x))]) -#define SIN(x) ((x) >= 0.0 ? Sine[(int)(x)] : -Sine[(int)(-(x))]) +static struct { + int x,y; +} pl_dest[MAXPLANETS]; -static int pl_home[4]; -static int pl_core[4][10]; -static int pl_dist[4][10]; -static const double increment = 0.016; -static const double incrementrecip = 62.5; -static float *Cosine, *Sine; +#define PMOVESPEED 2000.0 -/* call only once */ -void pinit(void) +void preset(void) { - int i, j; - int pre; + int i; + for(i=0;i<MAXPLANETS;i++) { + pl_dest[i].x = planets[i].pl_x; + pl_dest[i].y = planets[i].pl_y; + } - void pmove(); + return; +} - pre = 3.5/increment; +/* call only once */ +void pinit(void) +{ + int i; - Cosine = (float*) calloc(sizeof(float), pre); - Sine = (float*) calloc(sizeof(float), pre); - for (i = 0; i < pre; i++) { - Cosine[i] = cos((double)i*increment); - Sine[i] = sin((double)i*increment); + for(i=0;i<MAXPLANETS;i++) { + pl_dest[i].x = planets[i].pl_x; + pl_dest[i].y = planets[i].pl_y; } + /* pl_home[0] = 0; pl_core[0][0] = 5; pl_core[0][1] = 7; @@ -51,53 +52,77 @@ pl_core[3][1] = 37; pl_core[3][2] = 38; pl_core[3][3] = 39; - - for (i = 0; i < 4; i++) { - for (j = 0; j < 4; j++) { - pl_dist[i][j] = hypot( - planets[pl_core[i][j]].pl_x - planets[pl_home[i]].pl_x, - planets[pl_core[i][j]].pl_y - planets[pl_home[i]].pl_y); + */ +} + +/* find distance of closest planet to x,y */ +static float closestplanet(int x, int y) +{ + int i; + float d, bestd; + + for(i=0, bestd=HUGE_VAL;i<MAXPLANETS;i++) { + d = hypot(planets[i].pl_x - x, planets[i].pl_y - y); + if(d<bestd) bestd=d; + } + for(i=0;i<MAXPLANETS;i++) { + d = hypot(pl_dest[i].x - x, pl_dest[i].y - y); + if(d<bestd) bestd=d; + } + + return bestd; +} + +void pnewhome(struct planet *pl) +{ + int t, b, l, r; + + switch(pl->pl_owner) { + case FED: t = GWIDTH/2; b = GWIDTH; l = 0; r = GWIDTH/2; break; + case ROM: t = 0; b = GWIDTH/2; l = 0; r = GWIDTH/2; break; + case KLI: t = 0; b = GWIDTH/2; l = GWIDTH/2; r = GWIDTH; break; + case ORI: t = GWIDTH/2; b = GWIDTH; l = GWIDTH/2; r = GWIDTH; break; + default: return; + } + + if(pl->pl_x < l || pl->pl_x > r || pl->pl_y < t || pl->pl_y > b) { + /* planet out of quadrant, needs a new home! */ + int i, x, y, bestx, besty, bestd = 0, d; + for(i=0;i<10;i++) { /* Try 10 times to find a good spot */ + x = (random()%(GWIDTH/2)) + l; y = (random()%(GWIDTH/2)) + t; + d = closestplanet(x, y); + if(d > bestd) { bestx=x;besty=y;bestd=d; } } + pl_dest[pl->pl_no].x = bestx; + pl_dest[pl->pl_no].y = besty; + } else { + /* Keep the planet at this spot if it was moving */ + pl_dest[pl->pl_no].x = pl->pl_x; + pl_dest[pl->pl_no].y = pl->pl_y; } + + return; } void pmove(void) { - int i, j; - double dir; - static int planeti=0, planetj=0; - - for (i = 0; i < 4; i++) { - for (j = 0; j < 4; j++) { - i = planeti; - j = planetj; - planetj = (planetj + 1) % 4; - if (planetj == 0) - planeti = (planeti + 1) % 4; - - dir = atan2((double) (planets[pl_core[i][j]].pl_y - planets[pl_home[i]].pl_y), - (double) (planets[pl_core[i][j]].pl_x - planets[pl_home[i]].pl_x)); - if (dir > M_PI) dir = dir - 2.0*M_PI; - if (dir >= 0.0) - dir = (dir*incrementrecip+1.5); - else - dir = (dir*incrementrecip+0.5); - - - planets[pl_core[i][j]].pl_x = - planets[pl_home[i]].pl_x + - (int) (pl_dist[i][j] * COS(dir)); - planets[pl_core[i][j]].pl_y = - planets[pl_home[i]].pl_y + - (int) (pl_dist[i][j] * SIN(dir)); - - dir = atan2((double) (planets[pl_core[i][j]].pl_y - - planets[pl_home[i]].pl_y), - (double) (planets[pl_core[i][j]].pl_x - - planets[pl_home[i]].pl_x)); - - planets[pl_core[i][j]].pl_flags |= PLREDRAW; - } + int i; + int dx,dy; + float d; + + for(i=0;i<MAXPLANETS;i++) { + if(planets[i].pl_x != pl_dest[i].x || planets[i].pl_y != pl_dest[i].y) { + dx = pl_dest[i].x - planets[i].pl_x; + dy = pl_dest[i].y - planets[i].pl_y; + d = hypot(dx, dy); + if( d > PMOVESPEED ) { + dx = dx * PMOVESPEED / d; dy = dy * PMOVESPEED / d; + } + + planets[i].pl_x += dx; + planets[i].pl_y += dy; + planets[i].pl_flags |= PLREDRAW; + } } }