--- deliantra/server/common/living.C 2007/05/28 21:21:40 1.65
+++ deliantra/server/common/living.C 2007/07/22 14:17:56 1.72
@@ -1,23 +1,22 @@
/*
- * This file is part of Crossfire TRT, the Multiplayer Online Role Playing Game.
+ * This file is part of Crossfire TRT, the Roguelike Realtime MORPG.
*
* Copyright (©) 2005,2006,2007 Marc Alexander Lehmann / Robin Redeker / the Crossfire TRT team
* Copyright (©) 2002,2007 Mark Wedel & Crossfire Development Team
* Copyright (©) 1992,2007 Frank Tore Johansen
*
- * Crossfire TRT is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License as published by the Free
- * Software Foundation; either version 2 of the License, or (at your option)
- * any later version.
+ * Crossfire TRT is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
*
- * This program is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
- * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
- * for more details.
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
*
- * You should have received a copy of the GNU General Public License along
- * with Crossfire TRT; if not, write to the Free Software Foundation, Inc. 51
- * Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
*
* The authors can be reached via e-mail to
*/
@@ -313,8 +312,8 @@
*/
if (nstat < 1 && i * flag < 0)
nstat = 1;
- else if (nstat > 20 + op->arch->clone.stats.stat (j))
- nstat = 20 + op->arch->clone.stats.stat (j);
+ else if (nstat > 20 + op->arch->stats.stat (j))
+ nstat = 20 + op->arch->stats.stat (j);
if (nstat != ostat)
{
@@ -424,7 +423,7 @@
/* becoming UNDEAD... a special treatment for this flag. Only those not
* originally undead may change their status
*/
- if (!QUERY_FLAG (&op->arch->clone, FLAG_UNDEAD))
+ if (!QUERY_FLAG (op->arch, FLAG_UNDEAD))
if (QUERY_FLAG (op, FLAG_UNDEAD) != QUERY_FLAG (&refop, FLAG_UNDEAD))
{
success = 1;
@@ -435,7 +434,7 @@
}
else
{
- op->race = op->arch->clone.race;
+ op->race = op->arch->race;
new_draw_info (NDI_UNIQUE, 0, op, "Your lifeforce returns!");
}
}
@@ -687,7 +686,7 @@
{
for (int i = 0; i < NUM_STATS; ++i)
{
- sint8 v = arch->clone.stats.stat (i);
+ sint8 v = arch->stats.stat (i);
stats.stat (i) -= v;
contr->orig_stats.stat (i) -= v;
}
@@ -701,7 +700,7 @@
{
for (int i = 0; i < NUM_STATS; ++i)
{
- sint8 v = arch->clone.stats.stat (i);
+ sint8 v = arch->stats.stat (i);
stats.stat (i) += v;
contr->orig_stats.stat (i) += v;
}
@@ -762,23 +761,23 @@
CLEAR_FLAG (this, FLAG_STEALTH);
CLEAR_FLAG (this, FLAG_BLIND);
- if (!QUERY_FLAG (&arch->clone, FLAG_REFL_SPELL )) CLEAR_FLAG (this, FLAG_REFL_SPELL);
- if (!QUERY_FLAG (&arch->clone, FLAG_REFL_MISSILE)) CLEAR_FLAG (this, FLAG_REFL_MISSILE);
- if (!QUERY_FLAG (&arch->clone, FLAG_UNDEAD )) CLEAR_FLAG (this, FLAG_UNDEAD);
- if (!QUERY_FLAG (&arch->clone, FLAG_SEE_IN_DARK )) CLEAR_FLAG (this, FLAG_SEE_IN_DARK);
-
- path_attuned = arch->clone.path_attuned;
- path_repelled = arch->clone.path_repelled;
- path_denied = arch->clone.path_denied;
- glow_radius = arch->clone.glow_radius;
- move_type = arch->clone.move_type;
+ if (!QUERY_FLAG (arch, FLAG_REFL_SPELL )) CLEAR_FLAG (this, FLAG_REFL_SPELL);
+ if (!QUERY_FLAG (arch, FLAG_REFL_MISSILE)) CLEAR_FLAG (this, FLAG_REFL_MISSILE);
+ if (!QUERY_FLAG (arch, FLAG_UNDEAD )) CLEAR_FLAG (this, FLAG_UNDEAD);
+ if (!QUERY_FLAG (arch, FLAG_SEE_IN_DARK )) CLEAR_FLAG (this, FLAG_SEE_IN_DARK);
+
+ path_attuned = arch->path_attuned;
+ path_repelled = arch->path_repelled;
+ path_denied = arch->path_denied;
+ glow_radius = arch->glow_radius;
+ move_type = arch->move_type;
chosen_skill = 0;
/* initializing resistances from the values in player/monster's
* archetype clone
*/
- memcpy (&resist, &arch->clone.resist, sizeof (resist));
+ memcpy (&resist, &arch->resist, sizeof (resist));
for (i = 0; i < NROFATTACKS; i++)
{
@@ -790,8 +789,8 @@
potion_resist[i] = 0;
}
- wc = arch->clone.stats.wc;
- stats.dam = arch->clone.stats.dam;
+ wc = arch->stats.wc;
+ stats.dam = arch->stats.dam;
/* for players which cannot use armour, they gain AC -1 per 3 levels,
* plus a small amount of physical resist, those poor suckers. ;)
@@ -802,14 +801,14 @@
*/
if (!QUERY_FLAG (this, FLAG_USE_ARMOUR) && type == PLAYER)
{
- ac = MAX (-10, arch->clone.stats.ac - level / 3);
+ ac = MAX (-10, arch->stats.ac - level / 3);
prot[ATNR_PHYSICAL] += ((100 - prot[AT_PHYSICAL]) * (80 * level / settings.max_level)) / 100;
}
else
- ac = arch->clone.stats.ac;
+ ac = arch->stats.ac;
- stats.luck = arch->clone.stats.luck;
- speed = arch->clone.speed;
+ stats.luck = arch->stats.luck;
+ speed = arch->speed;
/* OK - we've reset most all the objects attributes to sane values.
* now go through and make adjustments for what the player has equipped.
@@ -867,6 +866,8 @@
{
if (type == PLAYER)
{
+ contr->item_power += tmp->item_power;
+
if (tmp == contr->combat_ob || tmp == contr->ranged_ob)
if (tmp != current_weapon
&& (tmp->type != SKILL || tmp->subtype != SK_PRAYING)
@@ -890,12 +891,11 @@
tmp->type == DISEASE || tmp->type == FORCE ||
tmp->type == SKILL)
{
- contr->digestion += tmp->stats.food;
+ contr->digestion = clamp (int (contr->digestion) + tmp->stats.food, MIN_DIGESTION, MAX_DIGESTION);
contr->gen_hp += tmp->stats.hp;
contr->gen_sp += tmp->stats.sp;
contr->gen_grace += tmp->stats.grace;
contr->gen_sp_armour += tmp->gen_sp_armour;
- contr->item_power += tmp->item_power;
}
} /* if this is a player */
else
@@ -962,7 +962,7 @@
if (QUERY_FLAG (tmp, FLAG_BLIND )) SET_FLAG (this, FLAG_BLIND);
if (QUERY_FLAG (tmp, FLAG_SEE_IN_DARK )) SET_FLAG (this, FLAG_SEE_IN_DARK);
- if (QUERY_FLAG (tmp, FLAG_UNDEAD) && !QUERY_FLAG (&arch->clone, FLAG_UNDEAD))
+ if (QUERY_FLAG (tmp, FLAG_UNDEAD) && !QUERY_FLAG (arch, FLAG_UNDEAD))
SET_FLAG (this, FLAG_UNDEAD);
if (QUERY_FLAG (tmp, FLAG_MAKE_INVIS))
@@ -1323,7 +1323,7 @@
speed -= 1;
if (attacktype == 0)
- attacktype = arch->clone.attacktype;
+ attacktype = arch->attacktype;
} /* End if player */
if (added_speed >= 0)
@@ -1380,8 +1380,8 @@
}
/* I want to limit the power of small monsters with big weapons: */
- if (type != PLAYER && arch && stats.dam > arch->clone.stats.dam * 3)
- stats.dam = arch->clone.stats.dam * 3;
+ if (type != PLAYER && arch && stats.dam > arch->stats.dam * 3)
+ stats.dam = arch->stats.dam * 3;
stats.wc = clamp (wc, MIN_WC, MAX_WC);
stats.ac = clamp (ac, MIN_AC, MAX_AC);
@@ -1511,14 +1511,11 @@
char buf[MAX_BUF]; /* tmp. string buffer */
/* now grab the 'dragon_ability'-forces from the player's inventory */
- shstr_cmp dragon_ability_force ("dragon_ability_force");
- shstr_cmp dragon_skin_force ("dragon_skin_force");
-
for (tmp = who->inv; tmp; tmp = tmp->below)
if (tmp->type == FORCE)
- if (tmp->arch->name == dragon_ability_force)
+ if (tmp->arch->archname == shstr_dragon_ability_force)
abil = tmp;
- else if (tmp->arch->name == dragon_skin_force)
+ else if (tmp->arch->archname == shstr_dragon_skin_force)
skin = tmp;
/* if the force is missing -> bail out */