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

Comparing deliantra/server/server/spell_util.C (file contents):
Revision 1.125 by root, Mon Nov 12 03:48:34 2012 UTC vs.
Revision 1.126 by root, Wed Nov 21 12:12:03 2012 UTC

255 return spop; 255 return spop;
256 256
257 return 0; 257 return 0;
258} 258}
259 259
260/* 260/*
261 * Look at object 'op' and see if they know the spell 261 * Look at object 'op' and see if they know the spell
262 * spname. This is pretty close to check_spell_known 262 * spname. This is pretty close to check_spell_known
263 * above, but it uses a looser matching mechanism. 263 * above, but it uses a looser matching mechanism.
264 * returns the matching spell object, or NULL. 264 * returns the matching spell object, or NULL.
265 * If we match multiple spells but don't get an 265 * If we match multiple spells but don't get an
266 * exact match, we also return NULL. 266 * exact match, we also return NULL.
267 */ 267 */
268object * 268object *
269lookup_spell_by_name (object *op, const char *spname) 269object::find_spell (shstr_cmp name) const
270{ 270{
271 object *spob1 = 0, *spob2 = 0;
272 int nummatch = 0;
273
274 if (!spname)
275 return 0;
276
277 /* Try to find the spell. We store the results in spob1
278 * and spob2 - spob1 is only taking the length of
279 * the past spname, spob2 uses the length of the spell name.
280 */
281 for (object *spob = op->inv; spob; spob = spob->below) 271 for (object *spob = inv; spob; spob = spob->below)
282 { 272 if (spob->name == name && spob->type == SPELL)
283 if (spob->type == SPELL)
284 {
285 // TODO: WTF?
286 if (!strncmp (spob->name, spname, strlen (spname)))
287 {
288 nummatch++;
289 spob1 = spob;
290 }
291 else if (!strncmp (spob->name, spname, strlen (spob->name)))
292 {
293 /* if spells have ambiguous names, it makes matching
294 * really difficult. (eg, fire and fireball would
295 * fall into this category). It shouldn't be hard to
296 * make sure spell names don't overlap in that fashion.
297 */
298 if (spob2)
299 LOG (llevError, "Found multiple spells with overlapping base names: %s, %s\n", &spob2->name, &spob->name);
300
301 spob2 = spob;
302 }
303 }
304 }
305 /* if we have best match, return it. Otherwise, if we have one match
306 * on the loser match, return that, otehrwise null
307 */
308 if (spob2)
309 return spob2; 273 return spob;
310 274
311 if (spob1 && nummatch == 1)
312 return spob1;
313
314 return NULL; 275 return 0;
315} 276}
316 277
317/* reflwall - decides weither the (spell-)object sp_op will 278/* reflwall - decides weither the (spell-)object sp_op will
318 * be reflected from the given mapsquare. Returns 1 if true. 279 * be reflected from the given mapsquare. Returns 1 if true.
319 * (Note that for living creatures there is a small chance that 280 * (Note that for living creatures there is a small chance that

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines