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

Comparing deliantra/server/common/living.C (file contents):
Revision 1.28 by root, Tue Jan 9 00:22:01 2007 UTC vs.
Revision 1.35 by root, Wed Mar 14 04:12:27 2007 UTC

1/* 1/*
2 CrossFire, A Multiplayer game for X-windows 2 * CrossFire, A Multiplayer game for X-windows
3 3 *
4 Copyright (C) 2005, 2006, 2007 Marc Lehmann & Crossfire+ Development Team 4 * Copyright (C) 2005, 2006, 2007 Marc Lehmann & Crossfire+ Development Team
5 Copyright (C) 2002 Mark Wedel & Crossfire Development Team 5 * Copyright (C) 2002 Mark Wedel & Crossfire Development Team
6 Copyright (C) 1992 Frank Tore Johansen 6 * Copyright (C) 1992 Frank Tore Johansen
7 7 *
8 This program is free software; you can redistribute it and/or modify 8 * This program is free software; you can redistribute it and/or modify
9 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
10 the Free Software Foundation; either version 2 of the License, or 10 * the Free Software Foundation; either version 2 of the License, or
11 (at your option) any later version. 11 * (at your option) 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,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of 14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details. 16 * GNU General Public License 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
19 along with this program; if not, write to the Free Software 19 * along with this program; if not, write to the Free Software
20 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 20 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
21 21 *
22 The authors can be reached via e-mail at <crossfire@schmorp.de> 22 * The authors can be reached via e-mail at <crossfire@schmorp.de>
23*/ 23 */
24 24
25#include <global.h> 25#include <global.h>
26#include <funcpoint.h> 26#include <funcpoint.h>
27 27
28/* Handy little macro that adds exp and keeps it within bounds. Since 28/* Handy little macro that adds exp and keeps it within bounds. Since
677 */ 677 */
678 678
679void 679void
680object::drain_stat () 680object::drain_stat ()
681{ 681{
682 drain_specific_stat (RANDOM () % NUM_STATS); 682 drain_specific_stat (rndm (NUM_STATS));
683} 683}
684 684
685void 685void
686object::drain_specific_stat (int deplete_stats) 686object::drain_specific_stat (int deplete_stats)
687{ 687{
755 return; 755 return;
756 756
757 /* Randomly change the players luck. Basically, we move it 757 /* Randomly change the players luck. Basically, we move it
758 * back neutral (if greater>0, subtract, otherwise add) 758 * back neutral (if greater>0, subtract, otherwise add)
759 */ 759 */
760 if (RANDOM () % (FABS (tmp->stats.luck)) >= RANDOM () % 30) 760 if (rndm (abs (tmp->stats.luck)) >= rndm (30))
761 { 761 {
762 int diff = tmp->stats.luck > 0 ? -1 : 1; 762 int diff = tmp->stats.luck > 0 ? -1 : 1;
763 763
764 stats.luck += diff; 764 stats.luck += diff;
765 tmp->stats.luck += diff; 765 tmp->stats.luck += diff;
926 speed = arch->clone.speed; 926 speed = arch->clone.speed;
927 927
928 /* OK - we've reset most all the objects attributes to sane values. 928 /* OK - we've reset most all the objects attributes to sane values.
929 * now go through and make adjustments for what the player has equipped. 929 * now go through and make adjustments for what the player has equipped.
930 */ 930 */
931
932 for (tmp = inv; tmp; tmp = tmp->below) 931 for (tmp = inv; tmp; tmp = tmp->below)
933 { 932 {
934 /* See note in map.c:update_position about making this additive 933 /* See note in map.c:update_position about making this additive
935 * since light sources are never applied, need to put check here. 934 * since light sources are never applied, need to put check here.
936 */ 935 */
1021 if (speed_reduce_from_disease == 0) 1020 if (speed_reduce_from_disease == 0)
1022 speed_reduce_from_disease = 1; 1021 speed_reduce_from_disease = 1;
1023 } 1022 }
1024 1023
1025 /* Pos. and neg. protections are counted seperate (-> pro/vuln). 1024 /* Pos. and neg. protections are counted seperate (-> pro/vuln).
1026 * (Negative protections are calculated extactly like positive.) 1025 * (Negative protections are calculated exactly like positive.)
1027 * Resistance from potions are treated special as well. If there's 1026 * Resistance from potions are treated special as well. If there's
1028 * more than one potion-effect, the bigger prot.-value is taken. 1027 * more than one potion-effect, the bigger prot.-value is taken.
1029 */ 1028 */
1030 if (tmp->type != POTION) 1029 if (tmp->type != POTION)
1031 { 1030 {
1040 potion_resist[i] = MAX (potion_resist[i], tmp->resist[i]); 1039 potion_resist[i] = MAX (potion_resist[i], tmp->resist[i]);
1041 else 1040 else
1042 potion_resist[i] = tmp->resist[i]; 1041 potion_resist[i] = tmp->resist[i];
1043 } 1042 }
1044 else if (tmp->resist[i] > 0) 1043 else if (tmp->resist[i] > 0)
1045 prot[i] += ((100 - prot[i]) * tmp->resist[i]) / 100; 1044 prot[i] += ((100 - prot[i]) * tmp->resist[i]) / 100;
1046 else if (tmp->resist[i] < 0) 1045 else if (tmp->resist[i] < 0)
1047 vuln[i] += ((100 - vuln[i]) * (-tmp->resist[i])) / 100; 1046 vuln[i] += ((100 - vuln[i]) * -tmp->resist[i]) / 100;
1048 } 1047 }
1049 } 1048 }
1050 1049
1051 /* There may be other things that should not adjust the attacktype */ 1050 /* There may be other things that should not adjust the attacktype */
1052 if (tmp->type != BOW && tmp->type != SYMPTOM) 1051 if (tmp->type != BOW && tmp->type != SYMPTOM)
1515 if (type == PLAYER) 1514 if (type == PLAYER)
1516 { 1515 {
1517 esrv_update_stats (contr); 1516 esrv_update_stats (contr);
1518 esrv_update_spells (contr); 1517 esrv_update_spells (contr);
1519 } 1518 }
1519
1520 // update the mapspace, if we are on a map
1521 if (!flag [FLAG_REMOVED] && map)
1522 map->at (x, y).flags_ = 0;
1520} 1523}
1521 1524
1522/* 1525/*
1523 * Returns true if the given player is a legal class. 1526 * Returns true if the given player is a legal class.
1524 * The function to add and remove class-bonuses to the stats doesn't 1527 * The function to add and remove class-bonuses to the stats doesn't
1609 object *skin = NULL; /* pointer to dragon skin force */ 1612 object *skin = NULL; /* pointer to dragon skin force */
1610 object *tmp = NULL; /* tmp. object */ 1613 object *tmp = NULL; /* tmp. object */
1611 char buf[MAX_BUF]; /* tmp. string buffer */ 1614 char buf[MAX_BUF]; /* tmp. string buffer */
1612 1615
1613 /* now grab the 'dragon_ability'-forces from the player's inventory */ 1616 /* now grab the 'dragon_ability'-forces from the player's inventory */
1617 shstr_cmp dragon_ability_force ("dragon_ability_force");
1618 shstr_cmp dragon_skin_force ("dragon_skin_force");
1619
1614 for (tmp = who->inv; tmp != NULL; tmp = tmp->below) 1620 for (tmp = who->inv; tmp; tmp = tmp->below)
1615 {
1616 if (tmp->type == FORCE) 1621 if (tmp->type == FORCE)
1617 {
1618 if (strcmp (tmp->arch->name, "dragon_ability_force") == 0) 1622 if (tmp->arch->name == dragon_ability_force)
1619 abil = tmp; 1623 abil = tmp;
1620 if (strcmp (tmp->arch->name, "dragon_skin_force") == 0) 1624 else if (tmp->arch->name == dragon_skin_force)
1621 skin = tmp; 1625 skin = tmp;
1622 } 1626
1623 }
1624 /* if the force is missing -> bail out */ 1627 /* if the force is missing -> bail out */
1625 if (abil == NULL) 1628 if (abil == NULL)
1626 return; 1629 return;
1627 1630
1628 /* The ability_force keeps track of maximum level ever achieved. 1631 /* The ability_force keeps track of maximum level ever achieved.
1951 del_exp = check_exp_loss (tmp, (sint64) (tmp->stats.exp * fraction)); 1954 del_exp = check_exp_loss (tmp, (sint64) (tmp->stats.exp * fraction));
1952 tmp->stats.exp -= del_exp; 1955 tmp->stats.exp -= del_exp;
1953 player_lvl_adj (op, tmp); 1956 player_lvl_adj (op, tmp);
1954 } 1957 }
1955 } 1958 }
1959
1956 if (flag != SK_SUBTRACT_SKILL_EXP) 1960 if (flag != SK_SUBTRACT_SKILL_EXP)
1957 { 1961 {
1958 del_exp = check_exp_loss (op, exp); 1962 del_exp = check_exp_loss (op, exp);
1959 op->stats.exp -= del_exp; 1963 op->stats.exp -= del_exp;
1960 player_lvl_adj (op, NULL); 1964 player_lvl_adj (op, NULL);
1961 } 1965 }
1962} 1966}
1963
1964
1965 1967
1966/* change_exp() - changes experience to a player/monster. This 1968/* change_exp() - changes experience to a player/monster. This
1967 * does bounds checking to make sure we don't overflow the max exp. 1969 * does bounds checking to make sure we don't overflow the max exp.
1968 * 1970 *
1969 * The exp passed is typically not modified much by this function - 1971 * The exp passed is typically not modified much by this function -
1970 * it is assumed the caller has modified the exp as needed. 1972 * it is assumed the caller has modified the exp as needed.
1971 * skill_name is the skill that should get the exp added. 1973 * skill_name is the skill that should get the exp added.
1972 * flag is what to do if player doesn't have the skill. 1974 * flag is what to do if player doesn't have the skill.
1973 * these last two values are only used for players. 1975 * these last two values are only used for players.
1974 */ 1976 */
1975
1976void 1977void
1977change_exp (object *op, sint64 exp, const char *skill_name, int flag) 1978change_exp (object *op, sint64 exp, const char *skill_name, int flag)
1978{ 1979{
1979 1980
1980#ifdef EXP_DEBUG 1981#ifdef EXP_DEBUG
2025 else 2026 else
2026 /* note that when you lose exp, it doesn't go against 2027 /* note that when you lose exp, it doesn't go against
2027 * a particular skill, so we don't need to pass that 2028 * a particular skill, so we don't need to pass that
2028 * along. 2029 * along.
2029 */ 2030 */
2030 subtract_player_exp (op, FABS (exp), skill_name, flag); 2031 subtract_player_exp (op, abs (exp), skill_name, flag);
2031
2032 } 2032 }
2033} 2033}
2034 2034
2035/* Applies a death penalty experience, the size of this is defined by the 2035/* Applies a death penalty experience, the size of this is defined by the
2036 * settings death_penalty_percentage and death_penalty_levels, and by the 2036 * settings death_penalty_percentage and death_penalty_levels, and by the

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines