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.18 by root, Sat Jan 20 22:09:54 2007 UTC vs.
Revision 1.26 by root, Thu Jun 7 18:58:30 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 (C) 2005, 2006, 2007 Marc Lehmann & Crossfire+ Development Team 4 * Copyright (©) 2005,2006,2007 Marc Alexander Lehmann / Robin Redeker / the Crossfire TRT team
5 * Copyright (C) 2002 Mark Wedel & Crossfire Development Team 5 * Copyright (©) 2002,2007 Mark Wedel & Crossfire Development Team
6 * Copyright (C) 1992 Frank Tore Johansen 6 * Copyright (©) 1992,2007 Frank Tore Johansen
7 * 7 *
8 * 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 it
9 * it under the terms of the GNU General Public License as published by 9 * under the terms of the GNU General Public License as published by the Free
10 * the Free Software Foundation; either version 2 of the License, or 10 * Software Foundation; either version 2 of the License, or (at your option)
11 * (at your option) any later version. 11 * any later version.
12 * 12 *
13 * 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, but
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of 14 * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
16 * GNU General Public License for more details. 16 * for more details.
17 * 17 *
18 * 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 along
19 * along with this program; if not, write to the Free Software 19 * with Crossfire TRT; if not, write to the Free Software Foundation, Inc. 51
20 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 20 * Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
21 * 21 *
22 * The authors can be reached via e-mail to <crossfire@schmorp.de> 22 * The authors can be reached via e-mail to <crossfire@schmorp.de>
23 */ 23 */
24 24
25/* This file contains all the code implementing diseases, 25/* This file contains all the code implementing diseases,
26 except for odds and ends in attack.c and in 26 * except for odds and ends in attack.c and in
27 living.c*/ 27 * living.c
28 28 */
29
30 29
31/* 30/*
32 31
33For DISEASES: 32For DISEASES:
34Stat Property Definition 33Stat Property Definition
237{ 236{
238 object *walk; 237 object *walk;
239 238
240 /* check the inventory for symptoms */ 239 /* check the inventory for symptoms */
241 for (walk = disease->env->inv; walk; walk = walk->below) 240 for (walk = disease->env->inv; walk; walk = walk->below)
242 if (!strcmp (walk->name, disease->name) && walk->type == SYMPTOM) 241 if (walk->name == disease->name && walk->type == SYMPTOM)
243 return walk; 242 return walk;
244 return NULL; 243 return NULL;
245} 244}
246 245
247/* searches around for more victims to infect */ 246/* searches around for more victims to infect */
325 * if you diseased, you can't get diseased more. 324 * if you diseased, you can't get diseased more.
326 */ 325 */
327 326
328 for ( /* tmp initialised in if, above */ ; tmp; tmp = tmp->below) 327 for ( /* tmp initialised in if, above */ ; tmp; tmp = tmp->below)
329 { 328 {
330 if (tmp->type == SIGN && !strcmp (tmp->name, disease->name) && tmp->level >= disease->level) 329 if (tmp->type == SIGN && tmp->name == disease->name && tmp->level >= disease->level)
331 return 0; /* Immune! */ 330 return 0; /* Immune! */
332 else if (tmp->type == DISEASE && !strcmp (tmp->name, disease->name)) 331 else if (tmp->type == DISEASE && tmp->name == disease->name)
333 return 0; /* already diseased */ 332 return 0; /* already diseased */
334 } 333 }
335 334
336 /* If we've gotten this far, go ahead and infect the victim. */ 335 /* If we've gotten this far, go ahead and infect the victim. */
337 new_disease = disease->clone (); 336 new_disease = disease->clone ();
363 * hardcoding in 'praying' is not the right approach. 362 * hardcoding in 'praying' is not the right approach.
364 */ 363 */
365 } 364 }
366 } 365 }
367 366
368 insert_ob_in_ob (new_disease, victim); 367 insert_ob_in_ob (new_disease, victim->head_ ());
369 /* This appears to be a horrible case of overloading 'NO_PASS' 368 /* This appears to be a horrible case of overloading 'NO_PASS'
370 * for meaning in the diseases. 369 * for meaning in the diseases.
371 */ 370 */
372 new_disease->move_block = 0; 371 new_disease->move_block = 0;
373 if (new_disease->owner && new_disease->owner->type == PLAYER) 372 if (new_disease->owner && new_disease->owner->type == PLAYER)
435 tmp = victim->inv; 434 tmp = victim->inv;
436 435
437 for ( /* tmp initialised in if, above */ ; tmp; tmp = tmp->below) 436 for ( /* tmp initialised in if, above */ ; tmp; tmp = tmp->below)
438 { 437 {
439 if (tmp->type == SIGN) /* possibly an immunity, or diseased */ 438 if (tmp->type == SIGN) /* possibly an immunity, or diseased */
440 if (!strcmp (tmp->name, disease->name) && tmp->level >= disease->level) 439 if (tmp->name == disease->name && tmp->level >= disease->level)
441 return 0; /*Immune! */ 440 return 0; /*Immune! */
442 } 441 }
443 442
444 new_symptom = get_archetype (ARCH_SYMPTOM); 443 new_symptom = get_archetype ("symptom");
445 444
446 /* Something special done with dam. We want diseases to be more 445 /* 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 446 * 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. 447 * do random, note, this has a weird effect with progressive diseases.
449 */ 448 */
466 new_symptom->name = new_symptom->name_pl = disease->name; 465 new_symptom->name = new_symptom->name_pl = disease->name;
467 466
468 new_symptom->level = disease->level; 467 new_symptom->level = disease->level;
469 new_symptom->speed = disease->speed; 468 new_symptom->speed = disease->speed;
470 new_symptom->value = 0; 469 new_symptom->value = 0;
470
471 for (int i = 0; i < NUM_STATS; ++i)
471 new_symptom->stats.Str = disease->stats.Str; 472 new_symptom->stats.stat (i) = disease->stats.stat (i);
472 new_symptom->stats.Dex = disease->stats.Dex; 473
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; 474 new_symptom->stats.sp = disease->stats.sp;
479 new_symptom->stats.food = disease->last_eat; 475 new_symptom->stats.food = disease->last_eat;
480 new_symptom->stats.maxsp = disease->stats.maxsp; 476 new_symptom->stats.maxsp = disease->stats.maxsp;
481 new_symptom->last_sp = disease->last_sp; 477 new_symptom->last_sp = disease->last_sp;
482 new_symptom->stats.exp = 0; 478 new_symptom->stats.exp = 0;
493 new_symptom->move_block = 0; 489 new_symptom->move_block = 0;
494 insert_ob_in_ob (new_symptom, victim); 490 insert_ob_in_ob (new_symptom, victim);
495 return 1; 491 return 1;
496 } 492 }
497 493
498 /* now deal with progressing diseases: we increase the debility 494 /* now deal with progressing diseases: we increase the debility
499 * caused by the symptoms. 495 * caused by the symptoms.
500 */ 496 */
501
502 if (disease->stats.ac != 0) 497 if (disease->stats.ac != 0)
503 { 498 {
504 float scale;
505
506 symptom->value += disease->stats.ac; 499 symptom->value += disease->stats.ac;
500
507 scale = 1.0 + symptom->value / 100.0; 501 float scale = 1.f + symptom->value / 100.f;
502
508 /* now rescale all the debilities */ 503 /* now rescale all the debilities */
504 for (int i = 0; i < NUM_STATS; ++i)
509 symptom->stats.Str = (int) (scale * disease->stats.Str); 505 symptom->stats.stat (i) = scale * disease->stats.stat (i);
510 symptom->stats.Dex = (int) (scale * disease->stats.Dex); 506
511 symptom->stats.Con = (int) (scale * disease->stats.Con);
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); 507 symptom->stats.dam = scale * disease->stats.dam;
517 symptom->stats.sp = (int) (scale * disease->stats.sp); 508 symptom->stats.sp = scale * disease->stats.sp;
518 symptom->stats.food = (int) (scale * disease->last_eat); 509 symptom->stats.food = scale * disease->last_eat;
519 symptom->stats.maxsp = (int) (scale * disease->stats.maxsp); 510 symptom->stats.maxsp = scale * disease->stats.maxsp;
520 symptom->last_sp = (int) (scale * disease->last_sp); 511 symptom->last_sp = scale * disease->last_sp;
521 symptom->stats.exp = 0; 512 symptom->stats.exp = 0;
522 symptom->stats.hp = (int) (scale * disease->stats.hp); 513 symptom->stats.hp = scale * disease->stats.hp;
514
523 symptom->msg = disease->msg; 515 symptom->msg = disease->msg;
524 symptom->attacktype = disease->attacktype; 516 symptom->attacktype = disease->attacktype;
525 symptom->other_arch = disease->other_arch; 517 symptom->other_arch = disease->other_arch;
526 } 518 }
519
527 SET_FLAG (symptom, FLAG_APPLIED); 520 SET_FLAG (symptom, FLAG_APPLIED);
528 victim->update_stats (); 521 victim->update_stats ();
522
529 return 1; 523 return 1;
530} 524}
531
532 525
533/* grants immunity to plagues we've seen before. */ 526/* grants immunity to plagues we've seen before. */
534int 527int
535grant_immunity (object *disease) 528grant_immunity (object *disease)
536{ 529{
541 if (disease->last_heal) 534 if (disease->last_heal)
542 return 0; 535 return 0;
543 /* first, search for an immunity of the same name */ 536 /* first, search for an immunity of the same name */
544 for (walk = disease->env->inv; walk; walk = walk->below) 537 for (walk = disease->env->inv; walk; walk = walk->below)
545 { 538 {
546 if (walk->type == 98 && !strcmp (disease->name, walk->name)) 539 if (walk->type == 98 && disease->name == walk->name)
547 { 540 {
548 walk->level = disease->level; 541 walk->level = disease->level;
549 return 1; /* just update the existing immunity. */ 542 return 1; /* just update the existing immunity. */
550 } 543 }
551 } 544 }
611 new_draw_info (NDI_UNIQUE | NDI_RED, 0, victim, symptom->msg); 604 new_draw_info (NDI_UNIQUE | NDI_RED, 0, victim, symptom->msg);
612 605
613 return 1; 606 return 1;
614} 607}
615 608
616
617/* possibly infect due to direct physical contact 609/* possibly infect due to direct physical contact
618 i.e., AT_PHYSICAL-- called from "hit_player_attacktype" */ 610 * i.e., AT_PHYSICAL-- called from "hit_player_attacktype" */
619
620int 611int
621check_physically_infect (object *victim, object *hitter) 612check_physically_infect (object *victim, object *hitter)
622{ 613{
623 object *walk;
624
625 /* search for diseases, give every disease a chance to infect */ 614 /* search for diseases, give every disease a chance to infect */
626 for (walk = hitter->inv; walk != NULL; walk = walk->below) 615 for (object *disease = hitter->inv; disease; disease = disease->below)
627 if (walk->type == DISEASE) 616 if (disease->type == DISEASE)
628 infect_object (victim, walk, 0); 617 infect_object (victim, disease, 0);
618
629 return 1; 619 return 1;
630} 620}
631 621
632/* find a disease in someone*/ 622// find a disease in someone
633object * 623object *
634find_disease (object *victim) 624find_disease (object *victim)
635{ 625{
636 object *walk; 626 for (object *disease = victim->inv; disease; disease = disease->below)
637
638 for (walk = victim->inv; walk; walk = walk->below)
639 if (walk->type == DISEASE) 627 if (disease->type == DISEASE)
640 return walk; 628 return disease;
629
641 return NULL; 630 return 0;
642} 631}
643 632
644/* do the cure disease stuff, from the spell "cure disease" */ 633/* do the cure disease stuff, from the spell "cure disease" */
645
646int 634int
647cure_disease (object *sufferer, object *caster) 635cure_disease (object *sufferer, object *caster)
648{ 636{
649 object *disease, *next; 637 object *disease, *next;
650 int casting_level; 638 int casting_level;
659 { 647 {
660 next = disease->below; 648 next = disease->below;
661 649
662 if (disease->type == DISEASE) 650 if (disease->type == DISEASE)
663 { /* attempt to cure this disease */ 651 { /* attempt to cure this disease */
664 /* If caster lvel is higher than disease level, cure chance 652 /* If caster level is higher than disease level, cure chance
665 * is automatic. If lower, then the chance is basically 653 * is automatic. If lower, then the chance is basically
666 * 1 in level_diff - if there is a 5 level difference, chance 654 * 1 in level_diff - if there is a 5 level difference, chance
667 * is 1 in 5. 655 * is 1 in 5.
668 */ 656 */
669 if ((casting_level >= disease->level) || (!(random_roll (0, (disease->level - casting_level - 1), caster, PREFER_LOW)))) 657 if ((casting_level >= disease->level) || (!(random_roll (0, (disease->level - casting_level - 1), caster, PREFER_LOW))))
670 { 658 {
671
672 remove_symptoms (disease); 659 remove_symptoms (disease);
673 cure = 1; 660 cure = 1;
674 661
675 if (caster) 662 if (caster)
676 change_exp (caster, disease->stats.exp, caster->chosen_skill ? &caster->chosen_skill->skill : (const char *) 0, 0); 663 change_exp (caster, disease->stats.exp, caster->chosen_skill ? caster->chosen_skill->skill : (const char *) 0, 0);
677 664
678 disease->destroy (); 665 disease->destroy ();
679 } 666 }
680 } 667 }
681 } 668 }
669
682 if (cure) 670 if (cure)
683 { 671 {
684 /* Only draw these messages once */ 672 /* Only draw these messages once */
685 if (caster) 673 if (caster)
686 new_draw_info_format (NDI_UNIQUE, 0, caster, "You cure a disease!"); 674 new_draw_info_format (NDI_UNIQUE, 0, caster, "You cure a disease!");
675
687 new_draw_info (NDI_UNIQUE, 0, sufferer, "You no longer feel diseased."); 676 new_draw_info (NDI_UNIQUE, 0, sufferer, "You no longer feel diseased.");
688 } 677 }
678
689 return 1; 679 return 1;
690} 680}
691 681
692/* reduces disease progression: reduce_symptoms 682/* reduces disease progression: reduce_symptoms
693 * return true if we actually reduce a disease. 683 * return true if we actually reduce a disease.

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines