Update of /cvsroot/netrek/server/Vanilla/ntserv In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv26876/ntserv Modified Files: Makefile.in daemonII.c enter.c interface.c ntscmds.c orbit.c redraw.c socket.c Added Files: bay.c Log Message: bays Index: redraw.c =================================================================== RCS file: /cvsroot/netrek/server/Vanilla/ntserv/redraw.c,v retrieving revision 1.1 retrieving revision 1.2 diff -u -d -r1.1 -r1.2 --- redraw.c 21 Mar 2005 05:23:44 -0000 1.1 +++ redraw.c 10 Apr 2006 10:56:33 -0000 1.2 @@ -213,14 +213,12 @@ #define NOOBSMASK (PFSELFDEST|PFPLOCK|PFPLLOCK|PFOBSERV) me->p_flags = (pl->p_flags & ~NOOBSMASK) | (me->p_flags & NOOBSMASK); - /* always cloaked, state of person watched will be obvious */ - /* me->p_flags |= PFCLOAK; */ me->p_dir = pl->p_dir; me->p_tractor = pl->p_tractor; - me->p_docked = pl->p_docked; + me->p_dock_with = pl->p_dock_with; + me->p_dock_bay = pl->p_dock_bay; me->p_planet = pl->p_planet; me->p_speed = pl->p_speed; - /* me->p_kills = pl->p_kills; Very bad: will confuse enemies */ } return; } /* end if I am locked onto a player */ @@ -439,10 +437,11 @@ planets[me->p_planet].pl_armies); } else if (me->p_flags & PFDOCK) { - if (players[me->p_docked].p_armies == 0) { + struct player *base = bay_owner(me); + if (base->p_armies <= 0) { txt = "Too few armies to beam up"; me->p_flags &= ~PFBEAMUP; - } else if (me->p_armies == troop_capacity) { + } else if (me->p_armies >= troop_capacity) { txt = "No more room on board for armies"; me->p_flags &= ~PFBEAMUP; } else { @@ -452,8 +451,8 @@ txt, me->p_armies, troop_capacity, - players[me->p_docked].p_name, - players[me->p_docked].p_armies); + base->p_name, + base->p_armies); } } @@ -475,13 +474,13 @@ planets[me->p_planet].pl_armies); } else if (me->p_flags & PFDOCK) { - if (me->p_armies == 0) { + struct player *base = bay_owner(me); + if (me->p_armies <= 0) { txt = "No more armies to beam down"; me->p_flags &= ~PFBEAMDOWN; - } else if (players[me->p_docked].p_armies == - players[me->p_docked].p_ship.s_maxarmies) { - txt = "All troop bunkers are full"; - me->p_flags &= ~PFBEAMDOWN; + } else if (base->p_armies >= base->p_ship.s_maxarmies) { + txt = "All troop bunkers are full"; + me->p_flags &= ~PFBEAMDOWN; } else { txt = "Transfering ground units"; } @@ -489,8 +488,8 @@ txt, me->p_armies, troop_capacity, - players[me->p_docked].p_name, - players[me->p_docked].p_armies); + base->p_name, + base->p_armies); } } Index: ntscmds.c =================================================================== RCS file: /cvsroot/netrek/server/Vanilla/ntserv/ntscmds.c,v retrieving revision 1.4 retrieving revision 1.5 diff -u -d -r1.4 -r1.5 --- ntscmds.c 10 Apr 2006 04:24:51 -0000 1.4 +++ ntscmds.c 10 Apr 2006 10:56:32 -0000 1.5 @@ -297,8 +297,10 @@ j->p_ship.s_type = STARBASE; j->p_whydead=KQUIT; j->p_explode=10; + /* note VICIOUS_EJECT prevents animation of ship explosion */ j->p_status=PEXPLODE; j->p_whodead=me->p_no; + bay_release(j); } #endif /* ALLOW_EJECT */ Index: orbit.c =================================================================== RCS file: /cvsroot/netrek/server/Vanilla/ntserv/orbit.c,v retrieving revision 1.2 retrieving revision 1.3 diff -u -d -r1.2 -r1.3 --- orbit.c 21 Mar 2005 10:17:17 -0000 1.2 +++ orbit.c 10 Apr 2006 10:56:32 -0000 1.3 @@ -29,27 +29,10 @@ #define TRUE 1 #endif -/* - * If there are bugs in this docking code and/or possibly other places - * in the code, then conceivably a base my have p_docked < 4 while - * all ports are non-VACANT. That is inconsistent, and this code - * will check for that eventuality on the fly. - */ -#if 1 -#define RETURN_IF_VACANT(base, port) -#else -#define RETURN_IF_VACANT(base, port) \ - if (base->p_port[port] != VACANT) { \ - ERROR(1, ("Starbase %d has no ports vacant but p_docked==%d\n", \ - base->p_id, base->p_docked)); \ - return FALSE; \ - } -#endif - void de_lock(struct player *me) { me->p_flags &= ~(PFPLOCK | PFPLLOCK | PFTRACT | PFPRESS); - #ifdef SB_TRANSWARP +#ifdef SB_TRANSWARP if (me->p_flags & PFTWARP){ me->p_flags &= ~PFTWARP; me->p_flags |= PFREFITTING; @@ -64,14 +47,14 @@ * (If one or more of these is not true, various nasty things happen.) */ -#define DOCK_NO_BASE 0 -#define DOCK_FAILURE 1 -#define DOCK_SUCCESS 2 +#define DOCK_NO_BASE 0 /* no base is close enough */ +#define DOCK_FAILURE 1 /* dock failed due to some condition */ +#define DOCK_SUCCESS 2 /* dock was successful */ static int dock(struct player *base) { LONG dx, dy; - int port_id; + int bay_no; u_char dir_from_base; /* @@ -124,90 +107,28 @@ } /* - * Make sure the base's docking ports are not already full: */ - if (base->p_docked >= NUMPORTS) { + * Make sure the base's docking bays are not already full: */ + bay_no = bay_closest(base, dx, dy); + if (bay_no == -1) { if (send_short) swarning(SBDOCKDENIED_TEXT, base->p_no, 0); else - new_warning(UNDEF, "Starbase %s: Permission to dock denied, all ports currently occupied.", base->p_name); + new_warning(UNDEF, "Starbase %s: Permission to dock denied, all bays currently occupied.", base->p_name); de_lock(me); return DOCK_FAILURE; } /* - * Dock on closest port. - * A starbase's ports are 3 0 - * numbered as in this () - * picture: 2 1 */ - if (dx > 0) { - /* We are to the left of the base: */ - if (dy > 0) { - /* Above and to left of base: */ - if (base->p_port[3] == VACANT) - port_id = 3; - else if (base->p_port[2] == VACANT) - port_id = 2; - else if (base->p_port[0] == VACANT) - port_id = 0; - else { - RETURN_IF_VACANT(base, 1); - port_id = 1; - } - } else { - /* Below and to left of base: */ - if (base->p_port[2] == VACANT) - port_id = 2; - else if (base->p_port[3] == VACANT) - port_id = 3; - else if (base->p_port[1] == VACANT) - port_id = 1; - else { - RETURN_IF_VACANT(base, 0); - port_id = 0; - } - } - } else { - /* We are to the right of the base: */ - if (dy > 0) { - /* Above and to right of base: */ - if (base->p_port[0] == VACANT) - port_id = 0; - else if (base->p_port[1] == VACANT) - port_id = 1; - else if (base->p_port[3] == VACANT) - port_id = 3; - else { - RETURN_IF_VACANT(base, 2); - port_id = 2; - } - } else { - /* Below and to right of base: */ - if (base->p_port[1] == VACANT) - port_id = 1; - else if (base->p_port[2] == VACANT) - port_id = 2; - else if (base->p_port[0] == VACANT) - port_id = 0; - else { - RETURN_IF_VACANT(base, 3); - port_id = 3; - } - } - } - - /* * Adjust player structures of myself and the base. */ - dir_from_base = ((port_id * 90 + 45) * 256) / 360; - me->p_flags &= ~(PFPLOCK | PFPLLOCK | PFTRACT | PFPRESS); - me->p_flags |= PFDOCK; - me->p_dir = 64 + dir_from_base; - me->p_desdir = me->p_dir; - me->p_x = base->p_x + DOCKDIST * Cos[dir_from_base]; - me->p_y = base->p_y + DOCKDIST * Sin[dir_from_base]; - me->p_speed = 0; - me->p_desspeed = 0; - me->p_docked = base->p_no; - me->p_port[0] = port_id; + dir_from_base = ((bay_no * 90 + 45) * 256) / 360; + me->p_flags &= ~(PFPLOCK | PFPLLOCK | PFTRACT | PFPRESS); + me->p_flags |= PFDOCK; + me->p_dir = 64 + dir_from_base; + me->p_desdir = me->p_dir; + me->p_x = base->p_x + DOCKDIST * Cos[dir_from_base]; + me->p_y = base->p_y + DOCKDIST * Sin[dir_from_base]; + me->p_speed = 0; + me->p_desspeed = 0; #ifdef SB_TRANSWARP if (me->p_flags & PFTWARP){ me->p_flags &= ~PFTWARP; @@ -216,15 +137,14 @@ } #endif - base->p_docked++; - base->p_port[port_id] = me->p_no; + bay_claim(base, me, bay_no); /* * Notify player of success. */ if (send_short) - swarning(ONEARG_TEXT, 2, port_id); + swarning(ONEARG_TEXT, 2, bay_no); else - new_warning(UNDEF,"Helmsman: Docking manuever completed Captain. All moorings secured at port %d.", port_id); + new_warning(UNDEF,"Helmsman: Docking manuever completed Captain. All moorings secured at bay %d.", bay_no); return DOCK_SUCCESS; } Index: Makefile.in =================================================================== RCS file: /cvsroot/netrek/server/Vanilla/ntserv/Makefile.in,v retrieving revision 1.3 retrieving revision 1.4 diff -u -d -r1.3 -r1.4 --- Makefile.in 28 Sep 2005 12:14:05 -0000 1.3 +++ Makefile.in 10 Apr 2006 10:56:31 -0000 1.4 @@ -22,14 +22,14 @@ startrobot.o sysdefaults.o timecheck.o torp.o util.o \ warning.o ping.o $(RANDOMO) getpath.o $(STRDUPO) features.o \ distress.o transwarp.o gencmds.o ntscmds.o openmem.o feature.o \ - queue.o slotmaint.o rsa_key.o ltd_stats.o + queue.o slotmaint.o rsa_key.o ltd_stats.o bay.o # daemonII object files D_OBJS = daemonII.o sintab.o sysdefaults.o data.o slotmaint.o \ util.o $(RANDOMO) getpath.o getship.o smessage.o queue.o \ - wander2.o openmem.o solicit.o ltd_stats.o + wander2.o openmem.o solicit.o ltd_stats.o bay.o # Src files @@ -48,7 +48,8 @@ ${srcdir}/features.c ${srcdir}/distress.c ${srcdir}/transwarp.c \ ${srcdir}/gencmds.c ${srcdir}/ntscmds.c ${srcdir}/openmem.c \ ${srcdir}/feature.c ${srcdir}/queue.c ${srcdir}/slotmaint.c \ - ${srcdir}/wander2.c ${srcdir}/sysdefaults.c ${srcdir}/rsa_key.c + ${srcdir}/wander2.c ${srcdir}/sysdefaults.c ${srcdir}/rsa_key.c \ + ${srcdir}/bay.c SRC = $(R_FILES) data.h defs.h planets.h struct.h \ packets.h copyright.h Index: enter.c =================================================================== RCS file: /cvsroot/netrek/server/Vanilla/ntserv/enter.c,v retrieving revision 1.2 retrieving revision 1.3 diff -u -d -r1.2 -r1.3 --- enter.c 21 Mar 2005 10:17:17 -0000 1.2 +++ enter.c 10 Apr 2006 10:56:32 -0000 1.3 @@ -176,12 +176,10 @@ me->p_lastseenby = VACANT; me->p_kills = 0.0; me->p_armies = 0; - me->p_docked = 0; - me->p_port[0] = VACANT; - me->p_port[1] = VACANT; - me->p_port[2] = VACANT; - me->p_port[3] = VACANT; -/* if (!keeppeace) me->p_hostile = (FED|ROM|KLI|ORI);*/ + bay_init(me); + me->p_dock_with = 0; + me->p_dock_bay = 0; +/* if (!keeppeace) me->p_hostile = (FED|ROM|KLI|ORI); */ if( !(me->p_flags & PFROBOT) && (me->p_team == NOBODY) ) { me->p_hostile = NOBODY; me->p_war = NOBODY; --- NEW FILE: bay.c --- #include "copyright.h" #include "config.h" #include <assert.h> #include "defs.h" #include "struct.h" #include "data.h" /* starbase bay functions */ /* convert a player number to a player struct pointer */ static struct player *p_no(int i) { return &players[i]; } /* convert a docked ship player to the base they are docked to */ struct player *bay_owner(struct player *me) { assert(me->p_flags & PFDOCK); return p_no(me->p_dock_with); } /* check all bays for consistency, despite our best efforts it is still possible for the bays to be inconsistent, an example is a SIGKILL of ntserv */ void bay_consistency_check(struct player *base) { int i; struct player *ship; for (i=0; i<NUMBAYS; i++) { if (base->p_bays[i] == VACANT) continue; ship = p_no(base->p_bays[i]); if (!(ship->p_flags & PFDOCK)) { /* ship isn't docked */ base->p_bays[i] = VACANT; continue; } if (ship->p_dock_with != base->p_no) { /* ship is docked but not with this base */ base->p_bays[i] = VACANT; continue; } if (ship->p_dock_bay != i) { /* ship is docked with this base but not on this bay */ base->p_bays[i] = VACANT; continue; } } } /* claim a specific bay on a base for use by a docking ship */ void bay_claim(struct player *base, struct player *me, int bay_no) { me->p_dock_with = base->p_no; me->p_dock_bay = bay_no; base->p_bays[bay_no] = me->p_no; } /* release of a bay by a docked ship */ void bay_release(struct player *me) { if (me->p_flags & PFDOCK) { struct player *base = p_no(me->p_dock_with); int bay = me->p_dock_bay; if (base->p_bays[bay] != VACANT) { base->p_bays[bay] = VACANT; } me->p_flags &= ~PFDOCK; } } /* release of all bays by a base */ void bay_release_all(struct player *base) { int i; for (i=0; i<NUMBAYS; i++) if (base->p_bays[i] != VACANT) { struct player *pl = p_no(base->p_bays[i]); base->p_bays[i] = VACANT; pl->p_flags &= ~PFDOCK; } } /* initialise all bays */ void bay_init(struct player *me) { int i; for(i=0;i<NUMBAYS;i++) me->p_bays[i] = VACANT; } /* * Return closest bay according to position. * A starbase's bays are 3 0 * numbered as in this () * picture: 2 1 */ int bay_closest(struct player *base, LONG dx, LONG dy) { bay_consistency_check(base); if (dx > 0) { /* We are to the left of the base: */ if (dy > 0) { /* Above and to left of base: */ if (base->p_bays[3] == VACANT) return 3; else if (base->p_bays[2] == VACANT) return 2; else if (base->p_bays[0] == VACANT) return 0; else if (base->p_bays[1] == VACANT) return 1; else return -1; } else { /* Below and to left of base: */ if (base->p_bays[2] == VACANT) return 2; else if (base->p_bays[3] == VACANT) return 3; else if (base->p_bays[1] == VACANT) return 1; else if (base->p_bays[0] == VACANT) return 0; else return -1; } } else { /* We are to the right of the base: */ if (dy > 0) { /* Above and to right of base: */ if (base->p_bays[0] == VACANT) return 0; else if (base->p_bays[1] == VACANT) return 1; else if (base->p_bays[3] == VACANT) return 3; else if (base->p_bays[2] == VACANT) return 2; else return -1; } else { /* Below and to right of base: */ if (base->p_bays[1] == VACANT) return 1; else if (base->p_bays[2] == VACANT) return 2; /* inconsistent order */ else if (base->p_bays[0] == VACANT) return 0; else if (base->p_bays[3] == VACANT) return 3; else return -1; } } } Index: daemonII.c =================================================================== RCS file: /cvsroot/netrek/server/Vanilla/ntserv/daemonII.c,v retrieving revision 1.3 retrieving revision 1.4 diff -u -d -r1.3 -r1.4 --- daemonII.c 27 Sep 2005 12:26:37 -0000 1.3 +++ daemonII.c 10 Apr 2006 10:56:32 -0000 1.4 @@ -927,13 +927,9 @@ j->p_explode = 600/PLAYERFUSE; /* set ghost buster */ } - /* At this point, docked ships become removed. */ - if (j->p_flags & PFDOCK) { - players[j->p_docked].p_docked--; - players[j->p_docked].p_port[j->p_port[0]] = VACANT; - j->p_flags &= ~PFDOCK; - } + bay_release(j); if (j->p_ship.s_type == STARBASE) { + bay_release_all(j); if (((j->p_whydead == KSHIP) || (j->p_whydead == KTORP) || (j->p_whydead == KPHASER) || @@ -942,16 +938,9 @@ (j->p_whydead == KGENOCIDE)) && (status->tourn)) teams[j->p_team].s_turns=BUILD_SB_TIME; /* in defs.h */ /* 30 minute reconstruction period for new starbase */ - for (k=0; k<NUMPORTS; k++) - if(j->p_port[k] != VACANT) { - players[j->p_port[k]].p_flags &= ~PFDOCK; - j->p_port[k] = VACANT; - } - j->p_docked = 0; } /* And he is ejected from orbit. */ - if (j->p_flags & PFORBIT) - j->p_flags &= ~PFORBIT; + j->p_flags &= ~PFORBIT; /* Fall through to alive so explosions move */ @@ -1016,10 +1005,13 @@ /* Charge SB's for mass of docked vessels ... */ if (j->p_ship.s_type == STARBASE) { - for (k=0; k<NUMPORTS; k++) - if(j->p_port[k] != VACANT) - j->p_fuel -= players[j->p_port[k]].p_ship.s_warpcost * j->p_speed; - j->p_etemp += .7*(j->p_speed * j->p_docked); + int bays = 0; + for (k=0; k<NUMBAYS; k++) + if(j->p_bays[k] != VACANT) { + j->p_fuel -= players[j->p_bays[k]].p_ship.s_warpcost * j->p_speed; + bays++; + } + j->p_etemp += .7*(j->p_speed * bays); } } #ifdef SB_TRANSWARP @@ -1328,11 +1320,11 @@ j->p_fuel += 6 * j->p_ship.s_recharge; } else if ((j->p_flags & PFDOCK) && (j->p_fuel < j->p_ship.s_maxfuel) && - (players[j->p_docked].p_fuel > SBFUELMIN)) { + (players[j->p_dock_with].p_fuel > SBFUELMIN)) { int fc = MIN(10*j->p_ship.s_recharge, j->p_ship.s_maxfuel - j->p_fuel); j->p_fuel += fc; - players[j->p_docked].p_fuel -= fc; + players[j->p_dock_with].p_fuel -= fc; } #else /* Add fuel */ @@ -1341,9 +1333,9 @@ (!(planets[j->p_planet].pl_owner & j->p_war))) { j->p_fuel += 8 * j->p_ship.s_recharge; } else if ((j->p_flags & PFDOCK) && (j->p_fuel < j->p_ship.s_maxfuel)) { - if (players[j->p_docked].p_fuel > SBFUELMIN) { + if (players[j->p_dock_with].p_fuel > SBFUELMIN) { j->p_fuel += 12*j->p_ship.s_recharge; - players[j->p_docked].p_fuel -= 12*j->p_ship.s_recharge; + players[j->p_dock_with].p_fuel -= 12*j->p_ship.s_recharge; } } else j->p_fuel += 2 * j->p_ship.s_recharge; @@ -1418,8 +1410,8 @@ /* Move Player in dock */ if (j->p_flags & PFDOCK) { - j->p_x = players[j->p_docked].p_x + DOCKDIST*Cos[(j->p_port[0]*90+45)*255/360]; - j->p_y = players[j->p_docked].p_y + DOCKDIST*Sin[(j->p_port[0]*90+45)*255/360]; + j->p_x = players[j->p_dock_with].p_x + DOCKDIST*Cos[(j->p_dock_bay*90+45)*255/360]; + j->p_y = players[j->p_dock_with].p_y + DOCKDIST*Sin[(j->p_dock_bay*90+45)*255/360]; } /* Set player's alert status */ @@ -2939,9 +2931,9 @@ if (l->pl_armies < 5) continue; if (j->p_flags & PFDOCK) - if (players[j->p_docked].p_armies == 0) + if (players[j->p_dock_with].p_armies < 1) continue; - if (j->p_armies == j->p_ship.s_maxarmies) + if (j->p_armies >= j->p_ship.s_maxarmies) continue; /* XXX */ if (j->p_ship.s_type == ASSAULT) { @@ -2969,13 +2961,13 @@ } #endif } else if (j->p_flags & PFDOCK) { - players[j->p_docked].p_armies--; - army_track(AMT_TRANSUP, j, &players[j->p_docked], 1); + struct player *base = bay_owner(j); + base->p_armies--; + army_track(AMT_TRANSUP, j, base, 1); #ifdef LTD_STATS - /* j = player, j->pdocked = friendly SB */ if (status->tourn) { - ltd_update_armies_carried(j, &players[j->p_docked]); + ltd_update_armies_carried(j, base); } #endif @@ -3242,18 +3234,18 @@ } } else if (j->p_flags & PFDOCK) { - if (players[j->p_docked].p_team != j->p_team) + struct player *base = bay_owner(j); + if (base->p_team != j->p_team) continue; - if (players[j->p_docked].p_armies - == players[j->p_docked].p_ship.s_maxarmies) { + if (base->p_armies >= base->p_ship.s_maxarmies) { continue; } else { - army_track(AMT_TRANSDOWN, j, &players[j->p_docked], 1); + army_track(AMT_TRANSDOWN, j, base, 1); j->p_armies--; - players[j->p_docked].p_armies ++; + base->p_armies ++; #ifdef LTD_STATS if (status->tourn) { - ltd_update_armies_ferried(j, &players[j->p_docked]); + ltd_update_armies_ferried(j, base); } #endif /* LTD_STATS */ Index: socket.c =================================================================== RCS file: /cvsroot/netrek/server/Vanilla/ntserv/socket.c,v retrieving revision 1.4 retrieving revision 1.5 diff -u -d -r1.4 -r1.5 --- socket.c 10 Apr 2006 04:24:51 -0000 1.4 +++ socket.c 10 Apr 2006 10:56:33 -0000 1.5 @@ -1213,12 +1213,8 @@ if (packet->state) { orbit(); } else { + bay_release(me); me->p_flags &= ~PFORBIT; - if (me->p_flags & PFDOCK) { - players[me->p_docked].p_docked--; - players[me->p_docked].p_port[me->p_port[0]] = VACANT; - me->p_flags &= ~PFDOCK; - } } } @@ -1402,21 +1398,15 @@ return; } if (target<0 || target>=MAXPLAYER || target==me->p_no) return; - player= &players[target]; + player = &players[target]; if (player->p_flags & PFCLOAK) return; if (hypot((double) me->p_x-player->p_x, (double) me->p_y-player->p_y) < ((double) TRACTDIST) * me->p_ship.s_tractrng) { - if (player->p_flags & PFDOCK) { - players[player->p_docked].p_port[player->p_port[0]] = VACANT; - players[player->p_docked].p_docked--; - } - if (me->p_flags & PFDOCK) { - players[me->p_docked].p_docked--; - players[me->p_docked].p_port[me->p_port[0]] = VACANT; - } - player->p_flags &= ~(PFORBIT | PFDOCK); - me->p_flags &= ~(PFORBIT | PFDOCK); + bay_release(player); + bay_release(me); + player->p_flags &= ~PFORBIT; + me->p_flags &= ~PFORBIT; me->p_tractor = target; me->p_flags |= PFTRACT; } else { @@ -1448,16 +1438,10 @@ if (hypot((double) me->p_x-player->p_x, (double) me->p_y-player->p_y) < ((double) TRACTDIST) * me->p_ship.s_tractrng) { - if (player->p_flags & PFDOCK) { - players[player->p_docked].p_port[player->p_port[0]] = VACANT; - players[player->p_docked].p_docked--; - } - if (me->p_flags & PFDOCK) { - players[me->p_docked].p_docked--; - players[me->p_docked].p_port[me->p_port[0]] = VACANT; - } - player->p_flags &= ~(PFORBIT | PFDOCK); - me->p_flags &= ~(PFORBIT | PFDOCK); + bay_release(player); + bay_release(me); + player->p_flags &= ~PFORBIT; + me->p_flags &= ~PFORBIT; me->p_tractor = target; me->p_flags |= (PFTRACT | PFPRESS); } else { @@ -1736,16 +1720,12 @@ int i; if (me->p_ship.s_type == STARBASE) { - me->p_docked = 0; - for (i=0; i<NUMPORTS; i++) { - if (me->p_port[i] != VACANT) - players[me->p_port[i]].p_flags &= ~PFDOCK; - me->p_port[i] = VACANT; - } - if (packet->state) - me->p_flags |= PFDOCKOK; - else - me->p_flags &= ~PFDOCKOK; + if (packet->state) { + me->p_flags |= PFDOCKOK; + } else { + me->p_flags &= ~PFDOCKOK; + bay_release_all(me); + } } } Index: interface.c =================================================================== RCS file: /cvsroot/netrek/server/Vanilla/ntserv/interface.c,v retrieving revision 1.3 retrieving revision 1.4 diff -u -d -r1.3 -r1.4 --- interface.c 22 Feb 2006 09:18:30 -0000 1.3 +++ interface.c 10 Apr 2006 10:56:32 -0000 1.4 @@ -29,21 +29,15 @@ speed=0; } me->p_desspeed = speed; - if (me->p_flags & PFDOCK) { - players[me->p_docked].p_docked--; - players[me->p_docked].p_port[me->p_port[0]] = VACANT; - } - me->p_flags &= ~(PFREPAIR | PFBOMB | PFORBIT | PFDOCK | PFBEAMUP | PFBEAMDOWN); + bay_release(me); + me->p_flags &= ~(PFREPAIR | PFBOMB | PFORBIT | PFBEAMUP | PFBEAMDOWN); } void set_course(u_char dir) { me->p_desdir = dir; - if (me->p_flags & PFDOCK) { - players[me->p_docked].p_docked--; - players[me->p_docked].p_port[me->p_port[0]] = VACANT; - } - me->p_flags &= ~(PFBOMB | PFORBIT | PFDOCK | PFBEAMUP | PFBEAMDOWN); + bay_release(me); + me->p_flags &= ~(PFBOMB | PFORBIT | PFBEAMUP | PFBEAMDOWN); } void shield_up(void) @@ -156,7 +150,7 @@ return; } } else if (me->p_flags & PFDOCK) { - if (me->p_team != players[me->p_docked].p_team) { + if (me->p_team != players[me->p_dock_with].p_team) { new_warning(46,"Comm Officer: We're not authorized to beam foriegn troops on board!"); return; } @@ -185,7 +179,7 @@ #endif if (me->p_flags & PFDOCK) { - if (me->p_team != players[me->p_docked].p_team) { + if (me->p_team != players[me->p_dock_with].p_team) { new_warning(48,"Comm Officer: Starbase refuses permission to beam our troops over."); return; } @@ -312,16 +306,10 @@ if (hypot((double) me->p_x-victim->p_x, (double) me->p_y-victim->p_y) < ((double) TRACTDIST) * me->p_ship.s_tractrng) { - if (victim->p_flags & PFDOCK) { - players[victim->p_docked].p_port[victim->p_port[0]] = VACANT; - players[victim->p_docked].p_docked--; - } - if (me->p_flags & PFDOCK) { - players[me->p_docked].p_docked--; - players[me->p_docked].p_port[me->p_port[0]] = VACANT; - } - victim->p_flags &= ~(PFORBIT | PFDOCK); - me->p_flags &= ~(PFORBIT | PFDOCK); + bay_release(victim); + bay_release(me); + victim->p_flags &= ~PFORBIT; + me->p_flags &= ~PFORBIT; me->p_tractor = player; me->p_flags |= PFTRACT; } else { /* out of range */ @@ -357,14 +345,8 @@ if (hypot((double) me->p_x-victim->p_x, (double) me->p_y-victim->p_y) < ((double) TRACTDIST) * me->p_ship.s_tractrng) { - if (victim->p_flags & PFDOCK) { - players[victim->p_docked].p_port[victim->p_port[0]] = VACANT; - players[victim->p_docked].p_docked--; - } - if (me->p_flags & PFDOCK) { - players[me->p_docked].p_docked--; - players[me->p_docked].p_port[me->p_port[0]] = VACANT; - } + bay_release(victim); + bay_release(me); victim->p_flags &= ~(PFORBIT | PFDOCK); me->p_flags &= ~(PFORBIT | PFDOCK); me->p_tractor = target; @@ -408,21 +390,18 @@ sendwarn("Orions", mask & ORI, ORI); } if (me->p_flags & PFDOCK) { - if (players[me->p_docked].p_team & mask) { - players[me->p_docked].p_port[me->p_port[0]] = VACANT; - players[me->p_docked].p_docked--; - me->p_flags &= ~PFDOCK; + if (players[me->p_dock_with].p_team & mask) { + /* release ship from starbase that is now hostile */ + bay_release(me); } - } else if (me->p_ship.s_type == STARBASE) { - if (me->p_docked > 0) { - for(i=0; i<NUMPORTS; i++) { - if (me->p_port[i] == VACANT) /* isae -- Ted's fix */ - continue; - if (mask & players[me->p_port[i]].p_team) { - players[me->p_port[i]].p_flags &= ~PFDOCK; - me->p_docked--; - me->p_port[i] = VACANT; - } + } + if (me->p_ship.s_type == STARBASE) { + for(i=0; i<NUMBAYS; i++) { + if (me->p_bays[i] == VACANT) + continue; + if (mask & players[me->p_bays[i]].p_team) { + /* release docked ships that are now hostile */ + bay_release(&players[me->p_bays[i]]); } } } @@ -486,7 +465,7 @@ new_warning(52,"Can only refit to starbase on your home planet."); return; } - if (players[me->p_docked].p_team != me->p_team) { + if (players[me->p_dock_with].p_team != me->p_team) { new_warning(53,"You must dock YOUR starbase to apply for command reassignment!"); return; } @@ -573,12 +552,7 @@ /* Reset kills to 0.0 */ me->p_kills=0; /* bump all docked ships */ - for (i=0; i<NUMPORTS; i++) - if (me->p_port[i] != VACANT) { - players[me->p_port[i]].p_flags &= ~PFDOCK; - me->p_docked--; - me->p_port[i] = VACANT; - } + bay_release_all(me); me->p_flags |= PFDOCKOK; } @@ -622,8 +596,7 @@ 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; + bay_init(me); me->p_flags |= PFDOCKOK; }