--- deliantra/server/server/spell_attack.C 2007/06/09 21:16:12 1.41
+++ deliantra/server/server/spell_attack.C 2007/11/08 19:43:28 1.49
@@ -1,25 +1,24 @@
/*
- * This file is part of Crossfire TRT, the Roguelike Realtime MORPG.
+ * This file is part of Deliantra, the Roguelike Realtime MMORPG.
*
- * Copyright (©) 2005,2006,2007 Marc Alexander Lehmann / Robin Redeker / the Crossfire TRT team
+ * Copyright (©) 2005,2006,2007 Marc Alexander Lehmann / Robin Redeker / the Deliantra team
* Copyright (©) 2002-2003,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.
+ * Deliantra 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
+ * The authors can be reached via e-mail to
*/
/* This file contains all the spell attack code. Grouping this code
@@ -346,7 +345,7 @@
***************************************************************************/
/* expands an explosion. op is a piece of the
- * explosion - this expans it in the different directions.
+ * explosion - this expands it in the different directions.
* At least that is what I think this does.
*/
void
@@ -486,6 +485,8 @@
op->move_on = 0;
tmp->insert_at (op, op);
+ tmp->play_sound (tmp->sound);
+
/* remove the firebullet */
op->destroy ();
}
@@ -1088,7 +1089,6 @@
* dir = direction being cast
* spell = spell object
*/
-
int
cast_smite_spell (object *op, object *caster, int dir, object *spell)
{
@@ -1176,7 +1176,6 @@
return 1;
}
-
/****************************************************************************
*
* MAGIC MISSILE code.
@@ -1256,17 +1255,14 @@
* make this work for non-living objects, we would have to
* give them the capability to have an inventory. b.t.
*/
-
int
make_object_glow (object *op, int radius, int time)
{
- object *tmp;
-
/* some things are unaffected... */
if (op->path_denied & PATH_LIGHT)
return 0;
- tmp = get_archetype (FORCE_NAME);
+ object *tmp = get_archetype (FORCE_NAME);
tmp->speed = 0.01;
tmp->stats.food = time;
SET_FLAG (tmp, FLAG_IS_USED_UP);
@@ -1274,19 +1270,11 @@
if (tmp->glow_radius > MAX_LIGHT_RADII)
tmp->glow_radius = MAX_LIGHT_RADII;
- tmp->x = op->x;
- tmp->y = op->y;
- if (tmp->speed < MIN_ACTIVE_SPEED)
- tmp->speed = MIN_ACTIVE_SPEED; /* safety */
tmp = insert_ob_in_ob (tmp, op);
+
if (tmp->glow_radius > op->glow_radius)
op->glow_radius = tmp->glow_radius;
- if (!tmp->env || op != tmp->env)
- {
- LOG (llevError, "make_object_glow() failed to insert glowing force in %s\n", &op->name);
- return 0;
- }
return 1;
}
@@ -1387,8 +1375,10 @@
return 0;
}
+ tmp = tmp->head_ ();
+
/* If we've already got a force of this type, don't add a new one. */
- for (force = tmp->inv; force != NULL; force = force->below)
+ for (force = tmp->inv; force; force = force->below)
{
if (force->type == FORCE && force->subtype == FORCE_CHANGE_ABILITY)
{
@@ -1404,10 +1394,11 @@
}
}
- if (force == NULL)
+ if (!force)
{
force = get_archetype (FORCE_NAME);
force->subtype = FORCE_CHANGE_ABILITY;
+
if (spell_ob->race)
force->name = spell_ob->race;
else
@@ -1427,11 +1418,11 @@
new_draw_info (NDI_UNIQUE, 0, op, "You recast the spell while in effect.");
}
else
- {
- new_draw_info (NDI_UNIQUE, 0, op, "Recasting the spell had no effect.");
- }
+ new_draw_info (NDI_UNIQUE, 0, op, "Recasting the spell had no effect.");
+
return 1;
}
+
force->duration = spell_ob->duration + SP_level_duration_adjust (caster, spell_ob) * 50;
force->speed = 1.f;
force->speed_left = -1.f;
@@ -1972,16 +1963,12 @@
return 1;
}
-
-
-
/* cast_cause_disease: this spell looks along from the
* player and infects someone.
* op is the player/monster, caster is the object, dir is the direction
* to cast, disease_arch is the specific disease, and type is the spell number
* perhaps this should actually be in disease.c?
*/
-
int
cast_cause_disease (object *op, object *caster, object *spell, int dir)
{
@@ -1998,6 +1985,7 @@
*/
if (!dir)
dir = op->facing;
+
if (!dir)
return 0; /* won't find anything if casting on ourself, so just return */
@@ -2041,7 +2029,7 @@
disease->stats.wc += dur_mod / 2;
if (disease->magic > 0)
- disease->magic += dur_mod / 4;
+ disease->magic += dur_mod / 8;
if (disease->stats.maxhp > 0)
disease->stats.maxhp += dur_mod;