ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/deliantra/server/server/disease.C
(Generate patch)

Comparing deliantra/server/server/disease.C (file contents):
Revision 1.4 by root, Sun Sep 10 15:59:57 2006 UTC vs.
Revision 1.10 by root, Wed Dec 13 00:42:04 2006 UTC

1
2/*
3 * static char *rcsid_disease_c =
4 * "$Id: disease.C,v 1.4 2006/09/10 15:59:57 root Exp $";
5 */
6
7/* 1/*
8 CrossFire, A Multiplayer game for X-windows 2 CrossFire, A Multiplayer game for X-windows
9 3
10 Copyright (C) 2002 Mark Wedel & Crossfire Development Team 4 Copyright (C) 2002 Mark Wedel & Crossfire Development Team
11 Copyright (C) 1992 Frank Tore Johansen 5 Copyright (C) 1992 Frank Tore Johansen
22 16
23 You should have received a copy of the GNU General Public License 17 You should have received a copy of the GNU General Public License
24 along with this program; if not, write to the Free Software 18 along with this program; if not, write to the Free Software
25 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 19 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
26 20
27 The authors can be reached via e-mail to crossfire-devel@real-time.com 21 The authors can be reached via e-mail to <crossfire@schmorp.de>
28*/ 22*/
29 23
30/* This file contains all the code implementing diseases, 24/* This file contains all the code implementing diseases,
31 except for odds and ends in attack.c and in 25 except for odds and ends in attack.c and in
32 living.c*/ 26 living.c*/
176 170
177 if (disease->env == NULL) 171 if (disease->env == NULL)
178 { /* we're outside of someone */ 172 { /* we're outside of someone */
179 if (disease->stats.maxhp > 0) 173 if (disease->stats.maxhp > 0)
180 disease->value--; 174 disease->value--;
175
181 if (disease->value == 0) 176 if (disease->value == 0)
182 { 177 {
183 remove_ob (disease); 178 disease->destroy ();
184 free_object (disease);
185 return 1; 179 return 1;
186 } 180 }
187 } 181 }
188 else 182 else
189 { 183 {
190 /* if we're inside a person, have the disease run its course */ 184 /* if we're inside a person, have the disease run its course */
191 /* negative foods denote "perpetual" diseases. */ 185 /* negative foods denote "perpetual" diseases. */
192 if (disease->stats.food > 0) 186 if (disease->stats.food > 0)
193 { 187 {
194 disease->stats.food--; 188 disease->stats.food--;
189
195 if (disease->stats.food == 0) 190 if (disease->stats.food == 0)
196 { 191 {
197 remove_symptoms (disease); /* remove the symptoms of this disease */ 192 remove_symptoms (disease); /* remove the symptoms of this disease */
198 grant_immunity (disease); 193 grant_immunity (disease);
199 remove_ob (disease); 194 disease->destroy ();
200 free_object (disease);
201 return 1; 195 return 1;
202 } 196 }
203 } 197 }
204 } 198 }
199
205 /* check to see if we infect others */ 200 /* check to see if we infect others */
206 check_infection (disease); 201 check_infection (disease);
207 202
208 /* impose or modify the symptoms of the disease */ 203 /* impose or modify the symptoms of the disease */
209 if (disease->env && is_susceptible_to_disease (disease->env, disease)) 204 if (disease->env && is_susceptible_to_disease (disease->env, disease))
226 221
227 while ((symptom = find_symptom (disease)) != NULL) 222 while ((symptom = find_symptom (disease)) != NULL)
228 { 223 {
229 if (!victim) 224 if (!victim)
230 victim = symptom->env; 225 victim = symptom->env;
231 remove_ob (symptom); 226
232 free_object (symptom); 227 symptom->destroy ();
233 } 228 }
229
234 if (victim) 230 if (victim)
235 fix_player (victim); 231 fix_player (victim);
236 return 0; 232 return 0;
237} 233}
238 234
252/* searches around for more victims to infect */ 248/* searches around for more victims to infect */
253int 249int
254check_infection (object *disease) 250check_infection (object *disease)
255{ 251{
256 int x, y, range, mflags; 252 int x, y, range, mflags;
257 mapstruct *map, *map2; 253 maptile *map, *map2;
258 object *tmp; 254 object *tmp;
259 sint16 i, j, i2, j2;
260 255
261 range = abs (disease->magic); 256 range = abs (disease->magic);
257
262 if (disease->env) 258 if (disease->env)
263 { 259 {
264 x = disease->env->x; 260 x = disease->env->x;
265 y = disease->env->y; 261 y = disease->env->y;
266 map = disease->env->map; 262 map = disease->env->map;
267 } 263 }
268 else 264 else
269 { 265 {
270 x = disease->x; 266 x = disease->x;
271 y = disease->y; 267 y = disease->y;
272 map = disease->map; 268 map = disease->map;
273 } 269 }
274 270
275 if (map == NULL) 271 if (!map)
276 return 0; 272 return 0;
273
277 for (i = x - range; i <= x + range; i++) 274 for (int i = x - range; i <= x + range; i++)
278 {
279 for (j = y - range; j <= y + range; j++) 275 for (int j = y - range; j <= y + range; j++)
280 { 276 {
277 sint16 i2, j2;
281 mflags = get_map_flags (map, &map2, i, j, &i2, &j2); 278 mflags = get_map_flags (map, &map2, i, j, &i2, &j2);
279
282 if (!(mflags & P_OUT_OF_MAP) && (mflags & P_IS_ALIVE)) 280 if (!(mflags & P_OUT_OF_MAP) && (mflags & P_IS_ALIVE))
283 {
284 for (tmp = get_map_ob (map2, i2, j2); tmp; tmp = tmp->above) 281 for (tmp = get_map_ob (map2, i2, j2); tmp; tmp = tmp->above)
285 {
286 infect_object (tmp, disease, 0); 282 infect_object (tmp, disease, 0);
287 }
288 }
289 } 283 }
290 } 284
291 return 1; 285 return 1;
292} 286}
293 287
294 288
295/* check to see if an object is infectable: 289/* check to see if an object is infectable:
339 else if (tmp->type == DISEASE && !strcmp (tmp->name, disease->name)) 333 else if (tmp->type == DISEASE && !strcmp (tmp->name, disease->name))
340 return 0; /* already diseased */ 334 return 0; /* already diseased */
341 } 335 }
342 336
343 /* If we've gotten this far, go ahead and infect the victim. */ 337 /* If we've gotten this far, go ahead and infect the victim. */
344 new_disease = get_object (); 338 new_disease = disease->clone ();
345 copy_object (disease, new_disease);
346 new_disease->stats.food = disease->stats.maxgrace; 339 new_disease->stats.food = disease->stats.maxgrace;
347 new_disease->value = disease->stats.maxhp; 340 new_disease->value = disease->stats.maxhp;
348 new_disease->stats.wc -= disease->last_grace; /* self-limiting factor */ 341 new_disease->stats.wc -= disease->last_grace; /* self-limiting factor */
349 342
350 /* Unfortunately, set_owner does the wrong thing to the skills pointers 343 /* Unfortunately, set_owner does the wrong thing to the skills pointers
576 object *new_ob; 569 object *new_ob;
577 int sp_reduce; 570 int sp_reduce;
578 571
579 if (victim == NULL || victim->map == NULL) 572 if (victim == NULL || victim->map == NULL)
580 { /* outside a monster/player, die immediately */ 573 { /* outside a monster/player, die immediately */
581 remove_ob (symptom); 574 symptom->destroy ();
582 free_object (symptom);
583 return 0; 575 return 0;
584 } 576 }
585 577
586 if (symptom->stats.dam > 0) 578 if (symptom->stats.dam > 0)
587 hit_player (victim, symptom->stats.dam, symptom, symptom->attacktype, 1); 579 hit_player (victim, symptom->stats.dam, symptom, symptom->attacktype, 1);
677 */ 669 */
678 if ((casting_level >= disease->level) || (!(random_roll (0, (disease->level - casting_level - 1), caster, PREFER_LOW)))) 670 if ((casting_level >= disease->level) || (!(random_roll (0, (disease->level - casting_level - 1), caster, PREFER_LOW))))
679 { 671 {
680 672
681 remove_symptoms (disease); 673 remove_symptoms (disease);
682 remove_ob (disease);
683 cure = 1; 674 cure = 1;
675
684 if (caster) 676 if (caster)
685 change_exp (caster, disease->stats.exp, caster->chosen_skill ? &caster->chosen_skill->skill : (const char *) 0, 0); 677 change_exp (caster, disease->stats.exp, caster->chosen_skill ? &caster->chosen_skill->skill : (const char *) 0, 0);
686 free_object (disease); 678
679 disease->destroy ();
687 } 680 }
688 } 681 }
689 } 682 }
690 if (cure) 683 if (cure)
691 { 684 {

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines