Mercurial > ~darius > hgwebdir.cgi > paradise_server
comparison src/missile.c @ 5:054275999194
Initial revision
author | darius |
---|---|
date | Sat, 06 Dec 1997 04:37:03 +0000 |
parents | |
children | 8f2256d473fb |
comparison
equal
deleted
inserted
replaced
4:aa38447a4b21 | 5:054275999194 |
---|---|
1 /*-------------------------------------------------------------------------- | |
2 NETREK II -- Paradise | |
3 | |
4 Permission to use, copy, modify, and distribute this software and its | |
5 documentation, or any derivative works thereof, for any NON-COMMERCIAL | |
6 purpose and without fee is hereby granted, provided that this copyright | |
7 notice appear in all copies. No representations are made about the | |
8 suitability of this software for any purpose. This software is provided | |
9 "as is" without express or implied warranty. | |
10 | |
11 Xtrek Copyright 1986 Chris Guthrie | |
12 Netrek (Xtrek II) Copyright 1989 Kevin P. Smith | |
13 Scott Silvey | |
14 Paradise II (Netrek II) Copyright 1993 Larry Denys | |
15 Kurt Olsen | |
16 Brandon Gillespie | |
17 --------------------------------------------------------------------------*/ | |
18 | |
19 #include "config.h" | |
20 #include <stdio.h> | |
21 #include <sys/types.h> | |
22 #include <sys/time.h> | |
23 | |
24 #include "defs.h" | |
25 #include "struct.h" | |
26 #include "data.h" | |
27 #include "shmem.h" | |
28 | |
29 #include "grid.h" | |
30 | |
31 | |
32 | |
33 | |
34 | |
35 /*-----------------------------MODULE VARIABLES----------------------------*/ | |
36 static struct timeval lasttime; /* used to prevent players from */ | |
37 /* firing too quickly */ | |
38 | |
39 #define UGAP 100000 /* gap between missile firings, microseconds */ | |
40 /*-------------------------------------------------------------------------*/ | |
41 | |
42 | |
43 | |
44 | |
45 | |
46 | |
47 | |
48 | |
49 /*----------------------------VISIBLE FUNCTIONS------------------------*/ | |
50 | |
51 /*------------------------------FIRE_MISSILE-----------------------------*/ | |
52 /* | |
53 * If a set of given conditions are met, fire a single missile in direction * | |
54 * course. * | |
55 * | |
56 * torp->t_fuse is the life of the missile. | |
57 */ | |
58 | |
59 void | |
60 fire_missile_dir(course) | |
61 unsigned char course; /* direction of torp travel */ | |
62 { | |
63 register int i; /* looping var */ | |
64 register struct missile *drn; /* to point to a torp */ | |
65 int max; | |
66 | |
67 if (weaponsallowed[WP_MISSILE] == 0) | |
68 { | |
69 warning("Missiles haven't been invented yet."); | |
70 return; | |
71 } | |
72 if ((weaponsallowed[WP_FIGHTER] == 0) && (me->p_ship.s_nflags & SFNHASFIGHTERS)) | |
73 { | |
74 warning("Fighters haven't been invented yet."); | |
75 return; | |
76 } | |
77 if (0 == shipvals[me->p_ship.s_type].s_missile.count) | |
78 { | |
79 warning("This ship can't mount a missile rack"); | |
80 return; | |
81 } | |
82 if (!(me->p_specweap & SFNHASMISSILE)) | |
83 { | |
84 warning("Our ship is not equipped with a missile rack"); | |
85 return; | |
86 } | |
87 if (me->p_ship.s_missilestored == 0) | |
88 { | |
89 warning("Our missile rack is empty!"); | |
90 return; | |
91 } | |
92 if (me->p_flags & PFWEP) | |
93 { /* no firing while */ | |
94 warning("Torpedo launch tubes have exceeded maximum safe temperature!"); | |
95 return; | |
96 } | |
97 if (me->p_flags & PFREPAIR) | |
98 { /* cannot be in repair mode */ | |
99 warning("We cannot fire while our vessel is in repair mode."); | |
100 return; | |
101 } | |
102 if ((me->p_cloakphase) && (me->p_ship.s_type != ATT)) | |
103 { | |
104 warning("We are unable to fire while in cloak, captain!"); | |
105 return; /* no firing while cloaked unless in an ATT */ | |
106 } | |
107 if ((me->p_ship.s_nflags & SFNHASFIGHTERS) && | |
108 (me->p_ntorp > 0)) | |
109 { | |
110 warning("Flight crews rearming fighters, be patient (wait for torps to die)"); | |
111 return; /* can't do both fighters and torps */ | |
112 } | |
113 | |
114 if (!check_fire_warp() | |
115 || !check_fire_warpprep() | |
116 || !check_fire_docked()) | |
117 return; | |
118 | |
119 if (!temporally_spaced(&lasttime, UGAP)) | |
120 return; | |
121 | |
122 max = NPTHINGIES; | |
123 if (me->p_ship.s_missile.count < max) | |
124 max = me->p_ship.s_missile.count; | |
125 | |
126 for (i = 0, drn = &missiles[me->p_no * NPTHINGIES]; i < max; i++, drn++) | |
127 { | |
128 if (drn->ms_status == TFREE || drn->ms_status == TLAND) | |
129 break; | |
130 } | |
131 | |
132 if (i >= max) | |
133 { | |
134 char buf[120]; | |
135 | |
136 if (myship->s_nflags & SFNHASFIGHTERS) | |
137 sprintf(buf, "Maximum of %d fighters in a squadron.", max); | |
138 else | |
139 sprintf(buf, "Our computers limit us to %d missiles at a time", max); | |
140 warning(buf); | |
141 return; | |
142 } | |
143 if (me->p_fuel < myship->s_missile.cost) | |
144 { /* have to have enough fuel */ | |
145 if (myship->s_nflags & SFNHASFIGHTERS) | |
146 warning("No fuel can be spared to send out fighters!"); | |
147 else | |
148 warning("We don't have enough fuel to launch a missile!"); | |
149 return; | |
150 } | |
151 if (me->p_ship.s_missilestored > 0) | |
152 { | |
153 char buf[80]; | |
154 me->p_ship.s_missilestored--; /* use up a missile in the rack */ | |
155 if (myship->s_nflags & SFNHASFIGHTERS) | |
156 { | |
157 me->p_armies = (int) (me->p_ship.s_missilestored / FAE_RATE); | |
158 sprintf(buf, "Fighter launched. %d left", me->p_ship.s_missilestored); | |
159 } | |
160 else | |
161 sprintf(buf, "Missile away. %d left", me->p_ship.s_missilestored); | |
162 warning(buf); | |
163 } | |
164 me->p_fuel -= myship->s_missile.cost; /* dec the fuel */ | |
165 me->p_wtemp += myship->s_missile.wtemp; /* Heat weapons */ | |
166 | |
167 | |
168 drn->ms_no = drn - missiles; /* set torp's number */ | |
169 drn->ms_status = TMOVE; /* set torp's type */ | |
170 drn->ms_owner = me->p_no; /* set torp's owner */ | |
171 | |
172 move_missile(drn->ms_no, me->p_x, me->p_y, 0); | |
173 | |
174 /* Fighters get launched in "groups" of four --> +/- 30',60' */ | |
175 /* It might be a good idea to make this launch pattern thing a #define */ | |
176 /* Maybe even a macro with a pattern, so they can go in groups of 2,3,etc */ | |
177 | |
178 if (myship->s_nflags & SFNHASFIGHTERS) | |
179 { | |
180 if (((drn->ms_no) % NPTHINGIES) % 4 == 1) | |
181 drn->ms_dir = me->p_dir + 16; | |
182 else if (((drn->ms_no) % NPTHINGIES) % 4 == 2) | |
183 drn->ms_dir = me->p_dir - 48; | |
184 else if (((drn->ms_no) % NPTHINGIES) % 4 == 3) | |
185 drn->ms_dir = me->p_dir + 48; | |
186 else | |
187 drn->ms_dir = me->p_dir - 16; /* set course of torp */ | |
188 } | |
189 else if (myship->s_nflags & SFNMASSPRODUCED) | |
190 drn->ms_dir = me->p_dir; /* PTs only fire forward */ | |
191 else | |
192 drn->ms_dir = course; | |
193 | |
194 drn->ms_damage = myship->s_missile.damage; /* set its damage */ | |
195 drn->ms_speed = myship->s_missile.speed; /* set its speed */ | |
196 drn->ms_fuse = myship->s_missile.fuse + (lrand48() % 20); /* set fuse */ | |
197 drn->ms_war = me->p_hostile | me->p_swar; /* get its war mask */ | |
198 drn->ms_team = me->p_team; /* set team of owner */ | |
199 drn->fi_hasfired = 0; | |
200 if (myship->s_nflags & SFNHASFIGHTERS) | |
201 { /* If sfnhasfighters is set */ | |
202 drn->ms_type = FIGHTERTHINGY; /* the missile is a fighter. */ | |
203 } | |
204 else | |
205 { | |
206 drn->ms_type = MISSILETHINGY; | |
207 } | |
208 | |
209 drn->ms_turns = myship->s_missile.aux; /* set how torp tracks */ | |
210 drn->ms_locked = -1; | |
211 me->p_nthingys++; /* we own another thingy */ | |
212 } | |
213 | |
214 /*-------------------------------------------------------------------------*/ | |
215 | |
216 | |
217 | |
218 | |
219 | |
220 | |
221 /*-------END OF FILE--------*/ |