--- handler.c Sun Jun 29 12:58:04 1997
+++ new/handler.c Sun Jun 29 13:08:43 1997
@@ -2440,6 +2440,7 @@
if ( extra_flags & ITEM_ANTI_CLERIC ) strcat( buf, " anti-cleric" );
if ( extra_flags & ITEM_ANTI_DRUID ) strcat( buf, " anti-druid" );
if ( extra_flags & ITEM_ANTI_VAMPIRE ) strcat( buf, " anti-vampire" );
+ if ( extra_flags & ITEM_ANTI_DEMON ) strcat( buf, " anti-demon" );
if ( extra_flags & ITEM_ORGANIC ) strcat( buf, " organic" );
if ( extra_flags & ITEM_METAL ) strcat( buf, " metal" );
if ( extra_flags & ITEM_DONATION ) strcat( buf, " donation" );
@@ -3610,7 +3611,8 @@
void add_kill( CHAR_DATA *ch, CHAR_DATA *mob )
{
int x;
- sh_int vnum, track;
+ int vnum;
+ sh_int track;
if ( IS_NPC(ch) )
{
@@ -3649,7 +3651,8 @@
int times_killed( CHAR_DATA *ch, CHAR_DATA *mob )
{
int x;
- sh_int vnum, track;
+ int vnum;
+ sh_int track;
if ( IS_NPC(ch) )
{
@@ -3671,4 +3674,241 @@
if ( ch->pcdata->killed[x].vnum == 0 )
break;
return 0;
+}
+
+/* Cloning routines... for SMAUG.
+ * -- Azure (azure@pobox.com) '97
+ */
+
+/*
+ * from mud_prog.c
+ */
+void mob_act_add( CHAR_DATA *mob );
+void obj_act_add( OBJ_DATA *obj );
+
+OBJ_DATA *clone_object_nested( OBJ_DATA *obj )
+{
+ OBJ_DATA *clone, *cObj, *tObj;
+ AFFECT_DATA *paf, *taf;
+ EXTRA_DESCR_DATA *ed, *ted;
+ MPROG_ACT_LIST *act, *tact;
+
+ clone = clone_object( obj );
+ clone->count = obj->count;
+ clone->mpactnum = 0;
+ clone->mpscriptpos = obj->mpscriptpos;
+
+ /* Affects... */
+ if ( obj->first_affect )
+ for ( taf = obj->first_affect; taf; taf = taf->next )
+ {
+ CREATE( paf, AFFECT_DATA, 1 );
+ paf->type = taf->type;
+ paf->duration = taf->duration;
+ paf->location = taf->location;
+ paf->modifier = taf->modifier;
+ paf->bitvector = taf->bitvector;
+ paf->next = NULL;
+ paf->prev = NULL;
+
+ LINK( paf, clone->first_affect, clone->last_affect, next, prev );
+ top_affect++;
+ }
+
+ /* Extra descriptions */
+ if ( obj->first_extradesc )
+ for ( ted = obj->first_extradesc; ted; ted = ted->next )
+ {
+ CREATE( ed, EXTRA_DESCR_DATA, 1 );
+ ed->keyword = QUICKLINK( ted->keyword );
+ ed->description = QUICKLINK( ted->description );
+ ed->next = NULL;
+ ed->prev = NULL;
+
+ LINK( ed,
+ clone->first_extradesc, clone->last_extradesc,
+ prev, next );
+ top_ed++;
+ }
+
+ /* Object Programs */
+ if ( obj->mpact )
+ {
+ for ( tact = obj->mpact; tact; tact = obj->mpact->next )
+ {
+ CREATE( act, MPROG_ACT_LIST, 1 );
+ if ( clone->mpactnum > 0 )
+ act->next = clone->mpact;
+ else
+ act->next = NULL;
+
+
+ act->buf = QUICKLINK( tact->buf );
+ act->ch = tact->ch;
+ act->obj = tact->obj;
+ act->vo = tact->vo;
+
+ clone->mpactnum++;
+ clone->mpact = act;
+
+ obj_act_add( clone );
+ }
+
+ /* Check... */
+ if ( clone->mpactnum != obj->mpactnum )
+ bug( "Clone_object_nested: clone's mpactnum != mob's mpactnum", 0 );
+ }
+
+ for ( cObj = obj->first_content; cObj; cObj = cObj->next_content )
+ tObj = obj_to_obj( clone_object_nested( cObj ), clone );
+ return clone;
+}
+
+
+CHAR_DATA *clone_mobile_nested( CHAR_DATA *mob )
+{
+ CHAR_DATA *clone;
+ OBJ_DATA *tobj, *obj;
+ MPROG_ACT_LIST *act, *tact;
+ AFFECT_DATA *paf;
+
+ if ( !mob )
+ {
+ bug( "Clone_mobile: NULL mob." );
+ return NULL;
+ }
+
+ CREATE( clone, CHAR_DATA, 1 );
+ clear_char( clone );
+
+ clone->pIndexData = mob->pIndexData;
+
+ clone->editor = NULL;
+ clone->name = QUICKLINK( mob->name );
+ clone->short_descr = QUICKLINK( mob->short_descr );
+ clone->long_descr = QUICKLINK( mob->long_descr );
+ clone->description = QUICKLINK( mob->description );
+ clone->spec_fun = mob->spec_fun;
+
+ clone->mpscriptpos = mob->mpscriptpos;
+
+ clone->level = mob->level;
+ clone->act = mob->act;
+ clone->affected_by = mob->affected_by;
+ clone->alignment = mob->alignment;
+ clone->sex = mob->sex;
+
+ clone->armor = mob->armor;
+ clone->max_hit = mob->max_hit;
+ clone->hit = mob->hit;
+ clone->max_mana = mob->max_mana;
+ clone->mana = mob->mana;
+ clone->max_move = mob->max_move;
+ clone->move = mob->move;
+ clone->practice = mob->practice;
+ clone->gold = mob->gold;
+ clone->exp = mob->exp;
+ clone->position = mob->position;
+ clone->defposition = mob->defposition;
+ clone->barenumdie = mob->barenumdie;
+ clone->baresizedie = mob->baresizedie;
+ clone->mobthac0 = mob->mobthac0;
+ clone->hitplus = mob->hitplus;
+ clone->damplus = mob->damplus;
+
+ clone->perm_str = mob->perm_str;
+ clone->perm_dex = mob->perm_dex;
+ clone->perm_wis = mob->perm_wis;
+ clone->perm_int = mob->perm_int;
+ clone->perm_con = mob->perm_con;
+ clone->perm_cha = mob->perm_cha;
+ clone->perm_lck = mob->perm_lck;
+ clone->hitroll = mob->hitroll;
+ clone->damroll = mob->damroll;
+ clone->race = mob->race;
+ clone->class = mob->class;
+ clone->xflags = mob->xflags;
+ clone->saving_poison_death = mob->saving_poison_death;
+ clone->saving_wand = mob->saving_wand;
+ clone->saving_para_petri = mob->saving_para_petri;
+ clone->saving_breath = mob->saving_breath;
+ clone->saving_spell_staff = mob->saving_spell_staff;
+ clone->height = mob->height;
+ clone->weight = mob->weight;
+ clone->resistant = mob->resistant;
+ clone->immune = mob->immune;
+ clone->susceptible = mob->susceptible;
+ clone->attacks = mob->attacks;
+ clone->numattacks = mob->numattacks;
+ clone->defenses = mob->defenses;
+ clone->speaks = mob->speaks;
+ clone->speaking = mob->speaking;
+ clone->wimpy = mob->wimpy;
+ clone->mental_state = mob->mental_state;
+ clone->emotional_state = mob->emotional_state;
+ clone->mobinvis = mob->mobinvis;
+
+ /* Affect Data */
+ if ( mob->first_affect )
+ for ( paf = mob->first_affect; paf; paf=paf->next )
+ affect_to_char( clone, paf );
+
+ /* HHF Data */
+ if ( mob->hunting )
+ start_hunting( clone, mob );
+ if ( mob->hating )
+ start_hating( clone, mob );
+ if ( mob->fearing )
+ start_fearing( clone, mob );
+
+ /* Mob Programs Act Data */
+ if ( mob->mpact )
+ {
+ for ( tact = mob->mpact; tact; tact = mob->mpact->next )
+ {
+ CREATE( act, MPROG_ACT_LIST, 1 );
+ if ( clone->mpactnum > 0 )
+ act->next = clone->mpact;
+ else
+ act->next = NULL;
+
+
+ act->buf = QUICKLINK( tact->buf );
+ act->ch = tact->ch;
+ act->obj = tact->obj;
+ act->vo = tact->vo;
+
+ clone->mpactnum++;
+ clone->mpact = act;
+
+ mob_act_add( clone );
+ }
+
+ /* Check... */
+ if ( clone->mpactnum != mob->mpactnum )
+ bug( "Clone_mobile_nested: clone's mpactnum != mob's mpactnum", 0 );
+ }
+
+ /* Skip timer stuff */
+
+ /* Objects
+ * -- First, drop the sucker into a room... any room.
+ */
+ char_to_room( clone, mob->in_room );
+ if ( mob->first_carrying )
+ for ( tobj = mob->first_carrying; tobj; tobj=tobj->next_content )
+ {
+ obj = clone_object_nested( tobj );
+ obj->wear_loc = tobj->wear_loc;
+ obj = obj_to_char( obj, clone );
+ }
+ char_from_room( clone );
+ /*
+ * Insert in list.
+ */
+ add_char( clone );
+ clone->pIndexData->count++;
+ nummobsloaded++;
+
+ return clone;
}