Mercurial > ~darius > hgwebdir.cgi > paradise_server
view src/missile.c @ 11:9fda93e18de5
Testing CVS in xEmacs
author | darius |
---|---|
date | Sat, 06 Dec 1997 04:46:49 +0000 |
parents | 054275999194 |
children | 8f2256d473fb |
line wrap: on
line source
/*-------------------------------------------------------------------------- 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--------*/