Mercurial > ~darius > hgwebdir.cgi > paradise_server
diff src/orbit.c @ 4:aa38447a4b21
First entry of Paradise Server 2.9 patch 10 Beta
author | darius |
---|---|
date | Sat, 06 Dec 1997 04:37:03 +0000 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/orbit.c Sat Dec 06 04:37:03 1997 +0000 @@ -0,0 +1,235 @@ +/*-------------------------------------------------------------------------- +NETREK II -- Paradise + +Permission to use, copy, modify, and distribute this software and its +documentation, or any derivative works thereof, for any NON-COMMERCIAL +purpose and without fee is hereby granted, provided that this copyright +notice appear in all copies. No representations are made about the +suitability of this software for any purpose. This software is provided +"as is" without express or implied warranty. + + Xtrek Copyright 1986 Chris Guthrie + Netrek (Xtrek II) Copyright 1989 Kevin P. Smith + Scott Silvey + Paradise II (Netrek II) Copyright 1993 Larry Denys + Kurt Olsen + Brandon Gillespie +--------------------------------------------------------------------------*/ + +#include "config.h" +#include <stdio.h> +#include <math.h> +#include <sys/types.h> +#include <sys/ipc.h> +#include <sys/shm.h> + +#include "defs.h" +#include "struct.h" +#include "data.h" +#include "shmem.h" + + +void newdock(); +extern void move_player(); + +static void +deactivate_friendly_tractors() +{ + int i; + struct player *j; + for (i = 0; i < MAXPLAYER; i++) + { + j = &players[i]; + if (i == me->p_no || + j->p_team != me->p_team || + j->p_tractor != me->p_no) + continue; + /* j is a teammate with a tractor on me */ + j->p_flags &= ~(PFTRACT | PFPRESS); + } +} + +/*------------------------------VISIBLE PROCEDURES-------------------------*/ + +/*-----------------------------------ORBIT---------------------------------*/ +/* + * This function is called when the player presses the orbit key. It check + * to make sure the player can orbit or dock. The function first checks + * through the list of players to see whether there is a dockable ship + * nearby. If that fails, then the planets are checked. The orbit key acts + * as a toggle for docking and undocking at ships. + */ + +void +orbit() +{ + register int i; /* looping var */ + register struct planet *l; /* to point to planet being orbited */ + unsigned char dir; /* to hold course direction */ + int dx, dy; /* used to get distances */ + + if (me->p_flags & PFORBIT) /* if not orbiting then we do not */ + return; /* need to do this section of code */ + if (me->p_speed > ORBSPEED) + { /* going to fast to orbit/dock? */ + warning("Helmsman: Captain, the maximum safe speed for docking or orbiting is warp 2!"); + return; + } /* turn off flags */ + me->p_flags &= ~(PFORBIT | PFTRACT | PFPRESS | + PFWARP | PFAFTER | PFWARPPREP | PFWPSUSPENDED); + me->p_warptime = 0; + if ((me->p_flags & PFDOCK) && (players[me->p_docked].p_speed > 4)) + { + warning("It's unsafe to disengage from your base when it's moving faster then warp 4."); /* cannot disengage from + * travelling */ + return; /* ships if they are going too fast */ + } + else + undock_player(me); /* make sure I'm not docked */ + + if (!(me->p_flags & PFPLLOCK) && /* if we aren't locked onto a planet */ + can_dock(me->p_ship)) + { /* and player can dock then */ + for (i = 0; i < MAXPLAYER; i++) + { /* go through all players */ + if (me->p_no == i) /* and look for ships that */ + continue; /* allow docking */ + if (!allows_docking(players[i].p_ship)) + continue; + if (!isAlive(&players[i]))/* disregard players not */ + continue; /* alive */ + if (!friendlyPlayer(&players[i])) /* cannot dock on enemy */ + continue; /* players */ + dx = ABS(players[i].p_x - me->p_x); /* get distance */ + dy = ABS(players[i].p_y - me->p_y); + if (dx > DOCKDIST || dy > DOCKDIST) /* if too far away thenwe */ + continue; /* cannot dock here */ + newdock(i); /* find a port and dock */ + + deactivate_friendly_tractors(); + + me->p_flags &= ~(PFPLOCK | PFPLLOCK); + return; + } + } /* not docking with a player try a planet */ + if (!(me->p_flags & PFPLOCK)) + { /* aren't locked onto a player */ + for (i = 0, l = &planets[i]; i < NUMPLANETS; i++, l++) + { + switch (PL_TYPE(*l)) + { + case PLSTAR: + case PLNEB: + case PLBHOLE: + case PLPULSAR: + continue; + } + + dx = ABS(l->pl_x - me->p_x); /* go through all planets and */ + dy = ABS(l->pl_y - me->p_y); /* check their distance */ + if (dx > ENTORBDIST || dy > ENTORBDIST) + continue; /* too far away? */ + if (dx * dx + dy * dy > ENTORBDIST * ENTORBDIST) + continue; + + if (!(me->p_team & planets[i].pl_owner) && /* can player orbit? */ + !(me->p_ship.s_nflags & SFNCANORBIT)) + { + warning("Central Command regulations prohibits you from orbiting foreign planets"); + return; + } + if (!(me->p_team & planets[i].pl_owner) && + !status->tourn) + { + warning("No one is allowed to orbit alien planets outside of T-mode"); + return; + } + dir = (unsigned char) (int) (atan2((double) (me->p_x - l->pl_x), + (double) (l->pl_y - me->p_y)) / 3.14159 * 128.); + scout_planet(me->p_no, l->pl_no); +#if 0 + l->pl_torbit |= me->p_team; /* place team in orbit */ +#endif + me->p_orbitdir = drand48() < configvals->orbitdirprob; + me->p_dir = dir + (me->p_orbitdir ? 64 : -64); /* get direction for + * player */ + me->p_flags |= PFORBIT; /* set his orbiting flag */ + + deactivate_friendly_tractors(); + + move_player(me->p_no, (int) (l->pl_x + ORBDIST * Cos[dir]), + (int) (l->pl_y + ORBDIST * Sin[dir]), 1); + + me->p_speed = me->p_desspeed = 0; + me->p_planet = l->pl_no; /* set the planet number */ + me->p_flags &= ~(PFPLOCK | PFPLLOCK); + return; + } + } + warning("Helmsman: Sensors read no valid targets in range to dock or orbit sir!"); +} + + + +/*--------------------------------NEWDOCK--------------------------------*/ + + +void +newdock(base_num) + int base_num; +{ + char buf[80]; /* to sprintf into */ + struct player *base = &players[base_num]; + int port_id, i; + int numports; + long distsq = 0; /* will be set by the first matching port */ + int angle; + + if (!(base->p_flags & PFDOCKOK)) + { /* docking allowed? */ + sprintf(buf, "Starbase %s refusing us docking permission captain.", + base->p_name); + warning(buf); /* if not say so then */ + return; /* get out of here */ + } + port_id = -1; + numports = base->p_ship.s_numports; + + for (i = 0; i < numports; i++) + { + long ds; + int x, y; + angle = (2 * i + 1) * 128 / numports; + + if (base->p_port[i] != VACANT) + continue; + + x = base->p_x + DOCKDIST * Cos[angle]; + y = base->p_y + DOCKDIST * Sin[angle]; + ds = (me->p_x - x) * (me->p_x - x) + (me->p_y - y) * (me->p_y - y); + if (port_id == -1 || ds < distsq) + { + port_id = i; + distsq = ds; + } + } + + if (port_id < 0) + { + sprintf(buf, "Base %s: Permission to dock denied, all ports currently occupied.", base->p_name); + warning(buf); /* print message to tell */ + return; + } /* player */ + dock_to(me, base_num, port_id); + + sprintf(buf, "Helmsman: Docking manuever completed Captain. All moorings secured at port %d.", port_id); + warning(buf); /* tell user he's docked */ +} + +#ifdef HAVE_RAND48 + +double drand48(); + +#endif + +/*------------END OF FILE--------*/