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.7 by root, Thu Oct 5 16:50:07 2006 UTC vs.
Revision 1.29 by root, Tue Aug 7 21:58:25 2007 UTC

1/* 1/*
2 CrossFire, A Multiplayer game for X-windows 2 * This file is part of Crossfire TRT, the Roguelike Realtime MORPG.
3 3 *
4 * Copyright (©) 2005,2006,2007 Marc Alexander Lehmann / Robin Redeker / the Crossfire TRT team
4 Copyright (C) 2002 Mark Wedel & Crossfire Development Team 5 * Copyright (©) 2002,2007 Mark Wedel & Crossfire Development Team
5 Copyright (C) 1992 Frank Tore Johansen 6 * Copyright (©) 1992,2007 Frank Tore Johansen
6 7 *
7 This program is free software; you can redistribute it and/or modify 8 * Crossfire TRT is free software: you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by 9 * it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2 of the License, or 10 * the Free Software Foundation, either version 3 of the License, or
10 (at your option) any later version. 11 * (at your option) any later version.
11 12 *
12 This program is distributed in the hope that it will be useful, 13 * This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of 14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details. 16 * GNU General Public License for more details.
16 17 *
17 You should have received a copy of the GNU General Public License 18 * You should have received a copy of the GNU General Public License
18 along with this program; if not, write to the Free Software 19 * along with this program. If not, see <http://www.gnu.org/licenses/>.
19 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 20 *
20
21 The authors can be reached via e-mail to <crossfire@schmorp.de> 21 * The authors can be reached via e-mail to <crossfire@schmorp.de>
22*/ 22 */
23 23
24/* This file contains all the code implementing diseases, 24/* This file contains all the code implementing diseases,
25 except for odds and ends in attack.c and in 25 * except for odds and ends in attack.c and in
26 living.c*/ 26 * living.c
27 27 */
28
29 28
30/* 29/*
31 30
32For DISEASES: 31For DISEASES:
33Stat Property Definition 32Stat Property Definition
126 125
127 126
128#include <global.h> 127#include <global.h>
129#include <object.h> 128#include <object.h>
130#include <living.h> 129#include <living.h>
131#ifndef __CEXTRACT__
132# include <sproto.h> 130#include <sproto.h>
133#endif
134#include <spells.h> 131#include <spells.h>
135#include <sounds.h> 132#include <sounds.h>
136#include <skills.h> 133#include <skills.h>
137 134
138/* IMPLEMENTATION NOTES 135/* IMPLEMENTATION NOTES
150 return 0; 147 return 0;
151 148
152 if (strstr (disease->race, "*") && !QUERY_FLAG (victim, FLAG_UNDEAD)) 149 if (strstr (disease->race, "*") && !QUERY_FLAG (victim, FLAG_UNDEAD))
153 return 1; 150 return 1;
154 151
155 if ((disease->race == undead_name) && QUERY_FLAG (victim, FLAG_UNDEAD)) 152 if ((disease->race == shstr_undead) && QUERY_FLAG (victim, FLAG_UNDEAD))
156 return 1; 153 return 1;
157 154
158 if ((victim->race && strstr (disease->race, victim->race)) || strstr (disease->race, victim->name)) 155 if ((victim->race && strstr (disease->race, victim->race)) || strstr (disease->race, victim->name))
159 return 1; 156 return 1;
160 157
166{ 163{
167 /* first task is to determine if the disease is inside or outside of someone. 164 /* first task is to determine if the disease is inside or outside of someone.
168 * If outside, we decrement 'value' until we're gone. 165 * If outside, we decrement 'value' until we're gone.
169 */ 166 */
170 167
171 if (disease->env == NULL) 168 if (!disease->env)
172 { /* we're outside of someone */ 169 { /* we're outside of someone */
173 if (disease->stats.maxhp > 0) 170 if (disease->stats.maxhp > 0)
174 disease->value--; 171 disease->value--;
172
175 if (disease->value == 0) 173 if (!disease->value)
176 { 174 {
177 remove_ob (disease); 175 disease->destroy ();
178 free_object (disease);
179 return 1; 176 return 1;
180 } 177 }
181 } 178 }
182 else 179 else
183 { 180 {
184 /* if we're inside a person, have the disease run its course */ 181 /* if we're inside a person, have the disease run its course */
185 /* negative foods denote "perpetual" diseases. */ 182 /* negative/zero food denotes "perpetual" diseases. */
186 if (disease->stats.food > 0) 183 if (disease->stats.food > 0)
187 { 184 {
188 disease->stats.food--; 185 disease->stats.food--;
186
189 if (disease->stats.food == 0) 187 if (!disease->stats.food)
190 { 188 {
191 remove_symptoms (disease); /* remove the symptoms of this disease */ 189 remove_symptoms (disease); /* remove the symptoms of this disease */
192 grant_immunity (disease); 190 grant_immunity (disease);
193 remove_ob (disease); 191 disease->destroy ();
194 free_object (disease);
195 return 1; 192 return 1;
196 } 193 }
197 } 194 }
198 } 195 }
196
199 /* check to see if we infect others */ 197 /* check to see if we infect others */
200 check_infection (disease); 198 check_infection (disease);
201 199
202 /* impose or modify the symptoms of the disease */ 200 /* impose or modify the symptoms of the disease */
203 if (disease->env && is_susceptible_to_disease (disease->env, disease)) 201 if (disease->env && is_susceptible_to_disease (disease->env, disease))
220 218
221 while ((symptom = find_symptom (disease)) != NULL) 219 while ((symptom = find_symptom (disease)) != NULL)
222 { 220 {
223 if (!victim) 221 if (!victim)
224 victim = symptom->env; 222 victim = symptom->env;
225 remove_ob (symptom); 223
226 free_object (symptom); 224 symptom->destroy ();
227 } 225 }
226
228 if (victim) 227 if (victim)
229 fix_player (victim); 228 victim->update_stats ();
230 return 0; 229 return 0;
231} 230}
232 231
233/* argument is a disease */ 232/* argument is a disease */
234object * 233object *
236{ 235{
237 object *walk; 236 object *walk;
238 237
239 /* check the inventory for symptoms */ 238 /* check the inventory for symptoms */
240 for (walk = disease->env->inv; walk; walk = walk->below) 239 for (walk = disease->env->inv; walk; walk = walk->below)
241 if (!strcmp (walk->name, disease->name) && walk->type == SYMPTOM) 240 if (walk->name == disease->name && walk->type == SYMPTOM)
242 return walk; 241 return walk;
243 return NULL; 242 return NULL;
244} 243}
245 244
246/* searches around for more victims to infect */ 245/* searches around for more victims to infect */
274 { 273 {
275 sint16 i2, j2; 274 sint16 i2, j2;
276 mflags = get_map_flags (map, &map2, i, j, &i2, &j2); 275 mflags = get_map_flags (map, &map2, i, j, &i2, &j2);
277 276
278 if (!(mflags & P_OUT_OF_MAP) && (mflags & P_IS_ALIVE)) 277 if (!(mflags & P_OUT_OF_MAP) && (mflags & P_IS_ALIVE))
279 for (tmp = get_map_ob (map2, i2, j2); tmp; tmp = tmp->above) 278 for (tmp = GET_MAP_OB (map2, i2, j2); tmp; tmp = tmp->above)
280 infect_object (tmp, disease, 0); 279 infect_object (tmp, disease, 0);
281 } 280 }
282 281
283 return 1; 282 return 1;
284} 283}
322 * (eg, level 1 cold, level 2 cold, level 3 cold, etc), as long as 321 * (eg, level 1 cold, level 2 cold, level 3 cold, etc), as long as
323 * they were cast in that same order. Instead, change it so that 322 * they were cast in that same order. Instead, change it so that
324 * if you diseased, you can't get diseased more. 323 * if you diseased, you can't get diseased more.
325 */ 324 */
326 325
327 for ( /* tmp initialized in if, above */ ; tmp; tmp = tmp->below) 326 for ( /* tmp initialised in if, above */ ; tmp; tmp = tmp->below)
328 { 327 {
329 if (tmp->type == SIGN && !strcmp (tmp->name, disease->name) && tmp->level >= disease->level) 328 if (tmp->type == SIGN && tmp->name == disease->name && tmp->level >= disease->level)
330 return 0; /*Immune! */ 329 return 0; /* Immune! */
331 else if (tmp->type == DISEASE && !strcmp (tmp->name, disease->name)) 330 else if (tmp->type == DISEASE && tmp->name == disease->name)
332 return 0; /* already diseased */ 331 return 0; /* already diseased */
333 } 332 }
334 333
335 /* If we've gotten this far, go ahead and infect the victim. */ 334 /* If we've gotten this far, go ahead and infect the victim. */
336 new_disease = get_object (); 335 new_disease = disease->clone ();
337 copy_object (disease, new_disease);
338 new_disease->stats.food = disease->stats.maxgrace; 336 new_disease->stats.food = disease->stats.maxgrace;
339 new_disease->value = disease->stats.maxhp; 337 new_disease->value = disease->stats.maxhp;
340 new_disease->stats.wc -= disease->last_grace; /* self-limiting factor */ 338 new_disease->stats.wc -= disease->last_grace; /* self-limiting factor */
341 339
342 /* Unfortunately, set_owner does the wrong thing to the skills pointers 340 /* Unfortunately, set_owner does the wrong thing to the skills pointers
343 * resulting in exp going into the owners *current* chosen skill. 341 * resulting in exp going into the owners *current* chosen skill.
344 */ 342 */
345 343
346 if (get_owner (disease)) 344 if (disease->owner)
347 { 345 {
348 set_owner (new_disease, disease->owner); 346 new_disease->set_owner (disease->owner);
349 347
350 /* Only need to update skill if different */ 348 /* Only need to update skill if different */
351 if (new_disease->skill != disease->skill) 349 if (new_disease->skill != disease->skill)
352 new_disease->skill = disease->skill; 350 new_disease->skill = disease->skill;
353 } 351 }
355 { /* for diseases which are passed by hitting, set owner and praying skill */ 353 { /* for diseases which are passed by hitting, set owner and praying skill */
356 if (disease->env && disease->env->type == PLAYER) 354 if (disease->env && disease->env->type == PLAYER)
357 { 355 {
358 object *player = disease->env; 356 object *player = disease->env;
359 357
360 set_owner (new_disease, player); 358 new_disease->set_owner (player);
361 359
362 /* the skill pointer for these diseases should already be set up - 360 /* the skill pointer for these diseases should already be set up -
363 * hardcoding in 'praying' is not the right approach. 361 * hardcoding in 'praying' is not the right approach.
364 */ 362 */
365 } 363 }
366 } 364 }
367 365
368 insert_ob_in_ob (new_disease, victim); 366 insert_ob_in_ob (new_disease, victim->head_ ());
369 /* This appears to be a horrible case of overloading 'NO_PASS' 367 /* This appears to be a horrible case of overloading 'NO_PASS'
370 * for meaning in the diseases. 368 * for meaning in the diseases.
371 */ 369 */
372 new_disease->move_block = 0; 370 new_disease->move_block = 0;
373 if (new_disease->owner && new_disease->owner->type == PLAYER) 371 if (new_disease->owner && new_disease->owner->type == PLAYER)
432 if (victim->head) 430 if (victim->head)
433 tmp = victim->head->inv; 431 tmp = victim->head->inv;
434 else 432 else
435 tmp = victim->inv; 433 tmp = victim->inv;
436 434
437 for ( /* tmp initialized in if, above */ ; tmp; tmp = tmp->below) 435 for ( /* tmp initialised in if, above */ ; tmp; tmp = tmp->below)
438 { 436 {
439 if (tmp->type == SIGN) /* possibly an immunity, or diseased */ 437 if (tmp->type == SIGN) /* possibly an immunity, or diseased */
440 if (!strcmp (tmp->name, disease->name) && tmp->level >= disease->level) 438 if (tmp->name == disease->name && tmp->level >= disease->level)
441 return 0; /*Immune! */ 439 return 0; /*Immune! */
442 } 440 }
443 441
444 new_symptom = get_archetype (ARCH_SYMPTOM); 442 new_symptom = get_archetype ("symptom");
445 443
446 /* Something special done with dam. We want diseases to be more 444 /* Something special done with dam. We want diseases to be more
447 * random in what they'll kill, so we'll make the damage they 445 * random in what they'll kill, so we'll make the damage they
448 * do random, note, this has a weird effect with progressive diseases. 446 * do random, note, this has a weird effect with progressive diseases.
449 */ 447 */
451 { 449 {
452 int dam = disease->stats.dam; 450 int dam = disease->stats.dam;
453 451
454 /* reduce the damage, on average, 50%, and making things random. */ 452 /* reduce the damage, on average, 50%, and making things random. */
455 453
456 dam = random_roll (1, FABS (dam), victim, PREFER_LOW); 454 dam = random_roll (1, abs (dam), victim, PREFER_LOW);
457 if (disease->stats.dam < 0) 455 if (disease->stats.dam < 0)
458 dam = -dam; 456 dam = -dam;
459 new_symptom->stats.dam = dam; 457 new_symptom->stats.dam = dam;
460 } 458 }
461 459
462 460
463 new_symptom->stats.maxsp = disease->stats.maxsp; 461 new_symptom->stats.maxsp = disease->stats.maxsp;
464 new_symptom->stats.food = new_symptom->stats.maxgrace; 462 new_symptom->stats.food = new_symptom->stats.maxgrace;
465 463
466 new_symptom->name = new_symptom->name_pl = disease->name; 464 new_symptom->name = new_symptom->name_pl = disease->name;
467 465
468 new_symptom->level = disease->level; 466 new_symptom->level = disease->level;
469 new_symptom->speed = disease->speed; 467 new_symptom->speed = disease->speed;
470 new_symptom->value = 0; 468 new_symptom->value = 0;
469
470 for (int i = 0; i < NUM_STATS; ++i)
471 new_symptom->stats.Str = disease->stats.Str; 471 new_symptom->stats.stat (i) = disease->stats.stat (i);
472 new_symptom->stats.Dex = disease->stats.Dex; 472
473 new_symptom->stats.Con = disease->stats.Con;
474 new_symptom->stats.Wis = disease->stats.Wis;
475 new_symptom->stats.Int = disease->stats.Int;
476 new_symptom->stats.Pow = disease->stats.Pow;
477 new_symptom->stats.Cha = disease->stats.Cha;
478 new_symptom->stats.sp = disease->stats.sp; 473 new_symptom->stats.sp = disease->stats.sp;
479 new_symptom->stats.food = disease->last_eat; 474 new_symptom->stats.food = disease->last_eat;
480 new_symptom->stats.maxsp = disease->stats.maxsp; 475 new_symptom->stats.maxsp = disease->stats.maxsp;
481 new_symptom->last_sp = disease->last_sp; 476 new_symptom->last_sp = disease->last_sp;
482 new_symptom->stats.exp = 0; 477 new_symptom->stats.exp = 0;
483 new_symptom->stats.hp = disease->stats.hp; 478 new_symptom->stats.hp = disease->stats.hp;
484 new_symptom->msg = disease->msg; 479 new_symptom->msg = disease->msg;
485 new_symptom->attacktype = disease->attacktype; 480 new_symptom->attacktype = disease->attacktype;
486 new_symptom->other_arch = disease->other_arch; 481 new_symptom->other_arch = disease->other_arch;
487 482
488 set_owner (new_symptom, disease->owner); 483 new_symptom->set_owner (disease->owner);
489 484
490 if (new_symptom->skill != disease->skill) 485 if (new_symptom->skill != disease->skill)
491 new_symptom->skill = disease->skill; 486 new_symptom->skill = disease->skill;
492 487
493 new_symptom->move_block = 0; 488 new_symptom->move_block = 0;
494 insert_ob_in_ob (new_symptom, victim); 489 insert_ob_in_ob (new_symptom, victim);
495 return 1; 490 return 1;
496 } 491 }
497 492
498 /* now deal with progressing diseases: we increase the debility 493 /* now deal with progressing diseases: we increase the debility
499 * caused by the symptoms. 494 * caused by the symptoms.
500 */ 495 */
501
502 if (disease->stats.ac != 0) 496 if (disease->stats.ac)
503 { 497 {
504 float scale; 498 symptom->value = clamp (symptom->value + disease->stats.ac, 0, 100*100);
505 499
506 symptom->value += disease->stats.ac;
507 scale = 1.0 + symptom->value / 100.0; 500 float scale = 1.f + symptom->value / 100.f;
501
508 /* now rescale all the debilities */ 502 /* now rescale all the debilities */
509 symptom->stats.Str = (int) (scale * disease->stats.Str); 503 for (int i = 0; i < NUM_STATS; ++i)
510 symptom->stats.Dex = (int) (scale * disease->stats.Dex); 504 symptom->stats.stat (i) = clamp (scale * disease->stats.stat (i), -MAX_STAT, MAX_STAT);
511 symptom->stats.Con = (int) (scale * disease->stats.Con); 505
512 symptom->stats.Wis = (int) (scale * disease->stats.Wis);
513 symptom->stats.Int = (int) (scale * disease->stats.Int);
514 symptom->stats.Pow = (int) (scale * disease->stats.Pow);
515 symptom->stats.Cha = (int) (scale * disease->stats.Cha);
516 symptom->stats.dam = (int) (scale * disease->stats.dam); 506 symptom->stats.dam = clamp (scale * disease->stats.dam , -1024, 1024);
517 symptom->stats.sp = (int) (scale * disease->stats.sp);
518 symptom->stats.food = (int) (scale * disease->last_eat); 507 symptom->stats.food = clamp (scale * disease->last_eat , -1024, 1024);
519 symptom->stats.maxsp = (int) (scale * disease->stats.maxsp); 508 symptom->stats.maxsp = clamp (scale * disease->stats.maxsp, -1024, 1024);
520 symptom->last_sp = (int) (scale * disease->last_sp); 509 symptom->last_sp = clamp (scale * disease->last_sp , -1024, 1024);
510 symptom->stats.sp = clamp (scale * disease->stats.sp , -1024, 1024);
511 symptom->stats.hp = clamp (scale * disease->stats.hp , -1024, 1024);
521 symptom->stats.exp = 0; 512 symptom->stats.exp = 0;
522 symptom->stats.hp = (int) (scale * disease->stats.hp); 513
523 symptom->msg = disease->msg; 514 symptom->msg = disease->msg;
524 symptom->attacktype = disease->attacktype; 515 symptom->attacktype = disease->attacktype;
525 symptom->other_arch = disease->other_arch; 516 symptom->other_arch = disease->other_arch;
526 } 517 }
518
527 SET_FLAG (symptom, FLAG_APPLIED); 519 SET_FLAG (symptom, FLAG_APPLIED);
528 fix_player (victim); 520 victim->update_stats ();
521
529 return 1; 522 return 1;
530} 523}
531
532 524
533/* grants immunity to plagues we've seen before. */ 525/* grants immunity to plagues we've seen before. */
534int 526int
535grant_immunity (object *disease) 527grant_immunity (object *disease)
536{ 528{
541 if (disease->last_heal) 533 if (disease->last_heal)
542 return 0; 534 return 0;
543 /* first, search for an immunity of the same name */ 535 /* first, search for an immunity of the same name */
544 for (walk = disease->env->inv; walk; walk = walk->below) 536 for (walk = disease->env->inv; walk; walk = walk->below)
545 { 537 {
546 if (walk->type == 98 && !strcmp (disease->name, walk->name)) 538 if (walk->type == 98 && disease->name == walk->name)
547 { 539 {
548 walk->level = disease->level; 540 walk->level = disease->level;
549 return 1; /* just update the existing immunity. */ 541 return 1; /* just update the existing immunity. */
550 } 542 }
551 } 543 }
568 object *new_ob; 560 object *new_ob;
569 int sp_reduce; 561 int sp_reduce;
570 562
571 if (victim == NULL || victim->map == NULL) 563 if (victim == NULL || victim->map == NULL)
572 { /* outside a monster/player, die immediately */ 564 { /* outside a monster/player, die immediately */
573 remove_ob (symptom); 565 symptom->destroy ();
574 free_object (symptom);
575 return 0; 566 return 0;
576 } 567 }
577 568
578 if (symptom->stats.dam > 0) 569 if (symptom->stats.dam > 0)
579 hit_player (victim, symptom->stats.dam, symptom, symptom->attacktype, 1); 570 hit_player (victim, symptom->stats.dam, symptom, symptom->attacktype, 1);
598 object *tmp; 589 object *tmp;
599 590
600 tmp = victim; 591 tmp = victim;
601 if (tmp->head != NULL) 592 if (tmp->head != NULL)
602 tmp = tmp->head; 593 tmp = tmp->head;
603 for ( /*tmp initialized above */ ; tmp != NULL; tmp = tmp->more) 594 for ( /*tmp initialised above */ ; tmp != NULL; tmp = tmp->more)
604 { 595 {
605 new_ob = arch_to_object (symptom->other_arch); 596 new_ob = arch_to_object (symptom->other_arch);
606 new_ob->x = tmp->x; 597 new_ob->x = tmp->x;
607 new_ob->y = tmp->y; 598 new_ob->y = tmp->y;
608 new_ob->map = victim->map; 599 new_ob->map = victim->map;
612 new_draw_info (NDI_UNIQUE | NDI_RED, 0, victim, symptom->msg); 603 new_draw_info (NDI_UNIQUE | NDI_RED, 0, victim, symptom->msg);
613 604
614 return 1; 605 return 1;
615} 606}
616 607
617
618/* possibly infect due to direct physical contact 608/* possibly infect due to direct physical contact
619 i.e., AT_PHYSICAL-- called from "hit_player_attacktype" */ 609 * i.e., AT_PHYSICAL-- called from "hit_player_attacktype" */
620
621int 610int
622check_physically_infect (object *victim, object *hitter) 611check_physically_infect (object *victim, object *hitter)
623{ 612{
624 object *walk;
625
626 /* search for diseases, give every disease a chance to infect */ 613 /* search for diseases, give every disease a chance to infect */
627 for (walk = hitter->inv; walk != NULL; walk = walk->below) 614 for (object *disease = hitter->inv; disease; disease = disease->below)
628 if (walk->type == DISEASE) 615 if (disease->type == DISEASE)
629 infect_object (victim, walk, 0); 616 infect_object (victim, disease, 0);
617
630 return 1; 618 return 1;
631} 619}
632 620
633/* find a disease in someone*/ 621// find a disease in someone
634object * 622object *
635find_disease (object *victim) 623find_disease (object *victim)
636{ 624{
637 object *walk; 625 for (object *disease = victim->inv; disease; disease = disease->below)
638
639 for (walk = victim->inv; walk; walk = walk->below)
640 if (walk->type == DISEASE) 626 if (disease->type == DISEASE)
641 return walk; 627 return disease;
628
642 return NULL; 629 return 0;
643} 630}
644 631
645/* do the cure disease stuff, from the spell "cure disease" */ 632/* do the cure disease stuff, from the spell "cure disease" */
646
647int 633int
648cure_disease (object *sufferer, object *caster) 634cure_disease (object *sufferer, object *caster)
649{ 635{
650 object *disease, *next; 636 object *disease, *next;
651 int casting_level; 637 int casting_level;
660 { 646 {
661 next = disease->below; 647 next = disease->below;
662 648
663 if (disease->type == DISEASE) 649 if (disease->type == DISEASE)
664 { /* attempt to cure this disease */ 650 { /* attempt to cure this disease */
665 /* If caster lvel is higher than disease level, cure chance 651 /* If caster level is higher than disease level, cure chance
666 * is automatic. If lower, then the chance is basically 652 * is automatic. If lower, then the chance is basically
667 * 1 in level_diff - if there is a 5 level difference, chance 653 * 1 in level_diff - if there is a 5 level difference, chance
668 * is 1 in 5. 654 * is 1 in 5.
669 */ 655 */
670 if ((casting_level >= disease->level) || (!(random_roll (0, (disease->level - casting_level - 1), caster, PREFER_LOW)))) 656 if ((casting_level >= disease->level) || (!(random_roll (0, (disease->level - casting_level - 1), caster, PREFER_LOW))))
671 { 657 {
672
673 remove_symptoms (disease); 658 remove_symptoms (disease);
674 remove_ob (disease);
675 cure = 1; 659 cure = 1;
660
676 if (caster) 661 if (caster)
677 change_exp (caster, disease->stats.exp, caster->chosen_skill ? &caster->chosen_skill->skill : (const char *) 0, 0); 662 change_exp (caster, disease->stats.exp, caster->chosen_skill ? caster->chosen_skill->skill : (const char *) 0, 0);
678 free_object (disease); 663
664 disease->destroy ();
679 } 665 }
680 } 666 }
681 } 667 }
668
682 if (cure) 669 if (cure)
683 { 670 {
684 /* Only draw these messages once */ 671 /* Only draw these messages once */
685 if (caster) 672 if (caster)
686 new_draw_info_format (NDI_UNIQUE, 0, caster, "You cure a disease!"); 673 new_draw_info_format (NDI_UNIQUE, 0, caster, "You cure a disease!");
674
687 new_draw_info (NDI_UNIQUE, 0, sufferer, "You no longer feel diseased."); 675 new_draw_info (NDI_UNIQUE, 0, sufferer, "You no longer feel diseased.");
688 } 676 }
677
689 return 1; 678 return 1;
690} 679}
691 680
692/* reduces disease progression: reduce_symptoms 681/* reduces disease progression: reduce_symptoms
693 * return true if we actually reduce a disease. 682 * return true if we actually reduce a disease.
694 */ 683 */
695
696int 684int
697reduce_symptoms (object *sufferer, int reduction) 685reduce_symptoms (object *sufferer, int reduction)
698{ 686{
699 object *walk; 687 object *walk;
700 int success = 0; 688 int success = 0;
704 if (walk->type == SYMPTOM) 692 if (walk->type == SYMPTOM)
705 { 693 {
706 if (walk->value > 0) 694 if (walk->value > 0)
707 { 695 {
708 success = 1; 696 success = 1;
709 walk->value = MAX (0, walk->value - 2 * reduction); 697 walk->value = max (0, walk->value - 2 * reduction);
710 /* give the disease time to modify this symptom, 698 /* give the disease time to modify this symptom,
711 * and reduce its severity. */ 699 * and reduce its severity. */
712 walk->speed_left = 0; 700 walk->speed_left = 0;
713 } 701 }
714 } 702 }
715 } 703 }
704
716 if (success) 705 if (success)
717 new_draw_info (NDI_UNIQUE, 0, sufferer, "Your illness seems less severe."); 706 new_draw_info (NDI_UNIQUE, 0, sufferer, "Your illness seems less severe.");
707
718 return success; 708 return success;
719} 709}

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines