Mercurial > ~darius > hgwebdir.cgi > paradise_server
diff src/missile.c @ 5:054275999194
Initial revision
author | darius |
---|---|
date | Sat, 06 Dec 1997 04:37:03 +0000 |
parents | |
children | 8f2256d473fb |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/missile.c Sat Dec 06 04:37:03 1997 +0000 @@ -0,0 +1,221 @@ +/*-------------------------------------------------------------------------- +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" + +#include "grid.h" + + + + + +/*-----------------------------MODULE VARIABLES----------------------------*/ +static struct timeval lasttime; /* used to prevent players from */ +/* firing too quickly */ + +#define UGAP 100000 /* gap between missile firings, microseconds */ +/*-------------------------------------------------------------------------*/ + + + + + + + + +/*----------------------------VISIBLE FUNCTIONS------------------------*/ + +/*------------------------------FIRE_MISSILE-----------------------------*/ +/* + * If a set of given conditions are met, fire a single missile in direction * + * course. * + * + * torp->t_fuse is the life of the missile. + */ + +void +fire_missile_dir(course) + unsigned char course; /* direction of torp travel */ +{ + register int i; /* looping var */ + register struct missile *drn; /* to point to a torp */ + int max; + + if (weaponsallowed[WP_MISSILE] == 0) + { + warning("Missiles haven't been invented yet."); + return; + } + if ((weaponsallowed[WP_FIGHTER] == 0) && (me->p_ship.s_nflags & SFNHASFIGHTERS)) + { + warning("Fighters haven't been invented yet."); + return; + } + if (0 == shipvals[me->p_ship.s_type].s_missile.count) + { + warning("This ship can't mount a missile rack"); + return; + } + if (!(me->p_specweap & SFNHASMISSILE)) + { + warning("Our ship is not equipped with a missile rack"); + return; + } + if (me->p_ship.s_missilestored == 0) + { + warning("Our missile rack is empty!"); + return; + } + if (me->p_flags & PFWEP) + { /* no firing while */ + warning("Torpedo launch tubes have exceeded maximum safe temperature!"); + return; + } + if (me->p_flags & PFREPAIR) + { /* cannot be in repair mode */ + warning("We cannot fire while our vessel is in repair mode."); + 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 ((me->p_ship.s_nflags & SFNHASFIGHTERS) && + (me->p_ntorp > 0)) + { + warning("Flight crews rearming fighters, be patient (wait for torps to die)"); + return; /* can't do both fighters and torps */ + } + + if (!check_fire_warp() + || !check_fire_warpprep() + || !check_fire_docked()) + return; + + if (!temporally_spaced(&lasttime, UGAP)) + return; + + max = NPTHINGIES; + if (me->p_ship.s_missile.count < max) + max = me->p_ship.s_missile.count; + + for (i = 0, drn = &missiles[me->p_no * NPTHINGIES]; i < max; i++, drn++) + { + if (drn->ms_status == TFREE || drn->ms_status == TLAND) + break; + } + + if (i >= max) + { + char buf[120]; + + if (myship->s_nflags & SFNHASFIGHTERS) + sprintf(buf, "Maximum of %d fighters in a squadron.", max); + else + sprintf(buf, "Our computers limit us to %d missiles at a time", max); + warning(buf); + return; + } + if (me->p_fuel < myship->s_missile.cost) + { /* have to have enough fuel */ + if (myship->s_nflags & SFNHASFIGHTERS) + warning("No fuel can be spared to send out fighters!"); + else + warning("We don't have enough fuel to launch a missile!"); + return; + } + if (me->p_ship.s_missilestored > 0) + { + char buf[80]; + me->p_ship.s_missilestored--; /* use up a missile in the rack */ + if (myship->s_nflags & SFNHASFIGHTERS) + { + me->p_armies = (int) (me->p_ship.s_missilestored / FAE_RATE); + sprintf(buf, "Fighter launched. %d left", me->p_ship.s_missilestored); + } + else + sprintf(buf, "Missile away. %d left", me->p_ship.s_missilestored); + warning(buf); + } + me->p_fuel -= myship->s_missile.cost; /* dec the fuel */ + me->p_wtemp += myship->s_missile.wtemp; /* Heat weapons */ + + + drn->ms_no = drn - missiles; /* set torp's number */ + drn->ms_status = TMOVE; /* set torp's type */ + drn->ms_owner = me->p_no; /* set torp's owner */ + + move_missile(drn->ms_no, me->p_x, me->p_y, 0); + + /* Fighters get launched in "groups" of four --> +/- 30',60' */ + /* It might be a good idea to make this launch pattern thing a #define */ + /* Maybe even a macro with a pattern, so they can go in groups of 2,3,etc */ + + if (myship->s_nflags & SFNHASFIGHTERS) + { + if (((drn->ms_no) % NPTHINGIES) % 4 == 1) + drn->ms_dir = me->p_dir + 16; + else if (((drn->ms_no) % NPTHINGIES) % 4 == 2) + drn->ms_dir = me->p_dir - 48; + else if (((drn->ms_no) % NPTHINGIES) % 4 == 3) + drn->ms_dir = me->p_dir + 48; + else + drn->ms_dir = me->p_dir - 16; /* set course of torp */ + } + else if (myship->s_nflags & SFNMASSPRODUCED) + drn->ms_dir = me->p_dir; /* PTs only fire forward */ + else + drn->ms_dir = course; + + drn->ms_damage = myship->s_missile.damage; /* set its damage */ + drn->ms_speed = myship->s_missile.speed; /* set its speed */ + drn->ms_fuse = myship->s_missile.fuse + (lrand48() % 20); /* set fuse */ + drn->ms_war = me->p_hostile | me->p_swar; /* get its war mask */ + drn->ms_team = me->p_team; /* set team of owner */ + drn->fi_hasfired = 0; + if (myship->s_nflags & SFNHASFIGHTERS) + { /* If sfnhasfighters is set */ + drn->ms_type = FIGHTERTHINGY; /* the missile is a fighter. */ + } + else + { + drn->ms_type = MISSILETHINGY; + } + + drn->ms_turns = myship->s_missile.aux; /* set how torp tracks */ + drn->ms_locked = -1; + me->p_nthingys++; /* we own another thingy */ +} + +/*-------------------------------------------------------------------------*/ + + + + + + +/*-------END OF FILE--------*/