/***************************************************************************
* Original Diku Mud copyright (C) 1990, 1991 by Sebastian Hammer, *
* Michael Seifert, Hans Henrik St{rfeldt, Tom Madsen, and Katja Nyboe. *
* *
* Merc Diku Mud improvments copyright (C) 1992, 1993 by Michael *
* Chastain, Michael Quan, and Mitchell Tse. *
* *
* In order to use any part of this Merc Diku Mud, you must comply with *
* both the original Diku license in 'license.doc' as well the Merc *
* license in 'license.txt'. In particular, you may not remove either of *
* these copyright notices. *
* *
* Much time and thought has gone into this software and you are *
* benefitting. We hope that you share your changes too. What goes *
* around, comes around. *
***************************************************************************/
#include <glib.h>
#if defined(macintosh)
#include <types.h>
#else
#include <sys/types.h>
#endif
#include <ctype.h>
#include <stdio.h>
#include <string.h>
#include <time.h>
#include <merc.h>
#include <recycle.h>
#include <olc.h>
#include <interp.h>
#include <fight.h>
#include <tables.h>
extern GMemChunk *sphere_mem_chunk;
SPHERE_DATA *sphere_free;
/* Mage handlers */
/*
* Apply or remove an affect to a character.
*/
void sphere_modify( CHAR_DATA *ch, SPHERE_DATA *paf, bool fAdd )
{
/*Sphere_affected_by needz {4] */
if ( fAdd )
{
SET_BIT( ch->sphere_affected_by[paf->type], paf->bitvector );
switch ( paf->type )
{
default:
bug("Sphere Modify: Unknown Type",0);
return;
case TYPE_SPHERE_ADDED:
SET_BIT(ch->added,paf->bitvector);
break;
case TYPE_SPHERE_AFFECT:
SET_BIT(ch->affected_by,paf->bitvector);
break;
case TYPE_SPHERE_ACT:
SET_BIT(ch->act,paf->bitvector);
break;
case TYPE_SPHERE_SPAFFECT:
SET_BIT(ch->sphere_spaffect,paf->bitvector);
break;
case TYPE_SIGHT:
SET_BIT(ch->sight,paf->bitvector);
break;
case TYPE_PLANE:
ch->plane = paf->bitvector;
break;
}
}
else
{
if (paf->bitvector == PLR_WIZINVIS)
ch->invis_level = 0;
REMOVE_BIT( ch->sphere_affected_by[paf->type], paf->bitvector );
switch ( paf->type )
{
default:
bug("Sphere Modify: Unknown Type",0);
return;
case TYPE_SPHERE_ADDED:
REMOVE_BIT(ch->added,paf->bitvector);
break;
case TYPE_SPHERE_AFFECT:
REMOVE_BIT(ch->affected_by,paf->bitvector);
break;
case TYPE_SPHERE_ACT:
REMOVE_BIT(ch->act,paf->bitvector);
break;
case TYPE_SPHERE_SPAFFECT:
REMOVE_BIT(ch->sphere_spaffect,paf->bitvector);
break;
case TYPE_SIGHT:
REMOVE_BIT(ch->sight,paf->bitvector);
break;
case TYPE_PLANE:
ch->plane = PLANE_NORMAL;
break;
}
}
return;
}
SPHERE_DATA *new_sphere(void)
{
static SPHERE_DATA af_zero;
SPHERE_DATA *af;
if (sphere_free == NULL)
af = g_chunk_new (SPHERE_DATA, sphere_mem_chunk);
else
{
af = sphere_free;
sphere_free = sphere_free->next;
}
*af = af_zero;
VALIDATE(af);
return af;
}
void free_sphere(SPHERE_DATA *af)
{
if (!IS_VALID(af))
return;
INVALIDATE(af);
af->next = sphere_free;
sphere_free = af;
}
/*
* Remove an affect from a char.
*/
void sphere_remove( CHAR_DATA *ch, SPHERE_DATA *paf )
{
if ( ch->sphere_affected == NULL )
{
bug( "Sphere_remove: no affect.", 0 );
return;
}
sphere_modify( ch, paf, FALSE );
if ( paf == ch->sphere_affected )
{
ch->sphere_affected = paf->next;
}
else
{
SPHERE_DATA *prev;
for ( prev = ch->sphere_affected; prev != NULL; prev = prev->next )
{
if ( prev->next == paf )
{
prev->next = paf->next;
break;
}
}
if ( prev == NULL )
{
bug( "Sphere_remove: cannot find paf.", 0 );
return;
}
}
free_sphere(paf);
return;
}
/*
* Give an affect to a char.
*/
void sphere_to_char( CHAR_DATA *ch, SPHERE_DATA *paf )
{
SPHERE_DATA *paf_new;
paf_new = new_sphere();
*paf_new = *paf;
paf_new->next = ch->sphere_affected;
ch->sphere_affected = paf_new;
sphere_modify( ch, paf_new, TRUE );
return;
}
SPHERE_DATA *find_spaffect( CHAR_DATA *ch, int bitvector)
{
SPHERE_DATA *paf;
SPHERE_DATA *paf_next;
for ( paf = ch->sphere_affected; paf != NULL; paf = paf_next )
{
paf_next = paf->next;
if ( paf->bitvector == bitvector )
return paf;
}
return NULL;
}