diff src/torp.c @ 9:331055a97a9d

Initial revision
author darius
date Sat, 06 Dec 1997 04:37:05 +0000
parents
children 9fda93e18de5
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/torp.c	Sat Dec 06 04:37:05 1997 +0000
@@ -0,0 +1,171 @@
+/*--------------------------------------------------------------------------
+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 <sys/types.h>
+#include <sys/time.h>
+
+#include "defs.h"
+#include "struct.h"
+#include "data.h"
+#include "shmem.h"
+
+
+
+
+/*-----------------------------MODULE VARIABLES----------------------------*/
+
+static struct timeval lasttp;
+
+
+#define UGAP 100000		/* microseconds */
+
+/*-------------------------------------------------------------------------*/
+
+
+
+
+
+
+
+
+/*----------------------------VISIBLE FUNCTIONS------------------------*/
+
+/*---------------------------------NTORP--------------------------------*/
+/*
+ * If a set of given conditions are met, fire a single torp in direction *
+ * course.  Type is used because robots are allowed to shoot straight. *
+ * Torps sent with status TMOVE wobble a bit.  TSTRAIGHT torps (fired * by
+ * robots) move in a straight line. *
+ * 
+ * torp->t_fuse is the life of the torpedo.  It is set here based on * a
+ * random function.  Torps currently live two to five seconds.
+ */
+
+
+extern void move_torp();
+
+void
+ntorp(course, type)
+  unsigned char course;		/* direction of torp travel */
+  int type;			/* type of torp flight */
+{
+  register int i;		/* looping var */
+  register struct torp *k;	/* to point to a torp */
+  register unsigned char buttangle;
+
+  if (me->p_flags & PFWEP)
+  {				/* no firing while */
+    warning("Torpedo launch tubes have exceeded maximum safe temperature!");
+    return;
+  }
+
+  if (!temporally_spaced(&lasttp, UGAP))
+    return;
+
+  if (me->p_ntorp == MAXTORP)
+  {				/* can't fire more than MAXTORPs */
+    warning("Our computers limit us to having 8 live torpedos at a time captain!");
+    return;
+  }
+  if (me->p_fuel < myship->s_torp.cost)
+  {				/* have to have enough fuel */
+    warning("We don't have enough fuel to fire photon torpedos!");
+    return;
+  }
+  if (me->p_flags & PFREPAIR)
+  {				/* cannot be in reapair mode */
+    warning("We cannot fire while our vessel is in repair mode.");
+    return;
+  }
+  if ((me->p_nthingys > 0)
+      && (myship->s_nflags & SFNHASFIGHTERS))
+  {				/* cannot fire if fighters can */
+    warning("Fire control systems guiding fighters.  No torps available.");
+    return;
+  }
+  if ((me->p_cloakphase) && (me->p_ship.s_type != ATT))
+  {
+    warning("We are unable to fire while in cloak, captain!");
+    return;			/* no firing while cloaked unless in an ATT */
+  }
+  if (!check_fire_warp()
+      || !check_fire_warpprep()
+      || !check_fire_docked())
+    return;
+
+  me->p_ntorp++;		/* inc torps in the air */
+  me->p_fuel -= myship->s_torp.cost;	/* dec the fuel */
+#ifdef BUTTORP_PENALTY
+  /* figure out absolute difference of arc between rear of ship and torp */
+  if ((buttangle = course - me->p_dir - 128) > 128)
+    buttangle = 256 - buttangle;
+
+  /* Check if in penalty limit.  Ships with no "front" are exempt, of course */
+  if (myship->s_type == WARBASE || myship->s_type == STARBASE || myship->s_type ==
+      JUMPSHIP || TORP_PENALTY_HALFARC < buttangle)
+  {
+    me->p_wtemp += myship->s_torp.wtemp;
+  }
+  else
+  {
+    /* You call that dogfighting?  Bad dog!  No biscuit!  Bad dog! */
+    me->p_wtemp += myship->s_torp.wtemp +
+      (myship->s_torp.wtemp *
+       (TORP_PENALTY_HALFARC - buttangle) *
+       TORP_PENALTY_FACTOR *
+       me->p_speed
+      ) / (TORP_PENALTY_HALFARC * myship->s_imp.maxspeed);
+  }
+#else
+  me->p_wtemp += myship->s_torp.wtemp;
+#endif
+  for (i = me->p_no * MAXTORP, k = &torps[i];	/* Find a free torp */
+       i < me->p_no * MAXTORP + MAXTORP; i++, k++)
+  {
+    if (k->t_status == TFREE)
+      break;
+  }
+  if ((type > TSTRAIGHT) || (type < TFREE))	/* straight torp */
+    type = TMOVE;
+  k->t_no = i;			/* set torp's number */
+  k->t_status = type;		/* set torp's type */
+  k->t_owner = me->p_no;	/* set torp's owner */
+  k->t_team = me->p_team;	/* set team of owner */
+
+  move_torp(i, me->p_x, me->p_y, 0);
+
+  k->t_dir = course;		/* set course of torp */
+  k->t_damage = myship->s_torp.damage;	/* set its damage */
+  k->t_speed = myship->s_torp.speed;	/* set its speed */
+  k->t_war = me->p_hostile | me->p_swar;	/* get its war mask */
+  k->t_fuse = myship->s_torp.fuse + (lrand48() % 20);	/* set fuse */
+  k->t_turns = myship->s_torp.aux;	/* set how torp tracks */
+}
+
+/*-------------------------------------------------------------------------*/
+
+
+
+
+
+
+/*-------END OF FILE--------*/