cotn25/area/
cotn25/src/
/***********************************
 * Different needed function calls *
 ***********************************/

#if defined(macintosh)
#include <types.h>
#else
#include <sys/types.h>
#endif
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h> /* close */
#include <time.h>
#include "merc.h"


/*
 * This function have always been broken, perhaps
 * one day in the future I'll make a functionel
 * piece of code, but untill then, it's more
 * guessing the right size than anything else.
 */
char *get_dystopia_banner(char *title, int size)
{
  int tSize = strlen(title);
  int patternsize, bufferspaces = 0, blockcount, i;
  static char buf[200];

  /* just so we can use strcat */
  buf[0] = '\0';

  /* calculating the amount of patterns on each side of the title */
  patternsize = (size - tSize)/2;
  if (!(patternsize % 4))
    patternsize -= 4;
  else
    while(patternsize % 4) patternsize--;
  patternsize /= 4;

  /* calculating buffer spaces */
  while ((tSize + bufferspaces) % 4) bufferspaces++;
  blockcount = bufferspaces/2;

  if (patternsize < 1)
  {
    strcat(buf, "#0<>== #G");
    strcat(buf, title);
    strcat(buf, " #0==<>#n");  
  }
  else
  {
    /* first add patterns */
    strcat(buf, "#0<>==");
    for (i = 1; i < patternsize; i++)
      strcat(buf, "<>==");
    /* add the title */
    if (tSize)
    {
      strcat(buf, "#G ");
      while (bufferspaces > blockcount)
      {
        bufferspaces--;
        strcat(buf, " ");
      }
    }
    else strcat(buf, "<>");
    strcat(buf, title);
    if (tSize)
    {
      strcat(buf, "#0 ");
      while (bufferspaces > 0)
      {
        bufferspaces--;
        strcat(buf, " ");
      }
    }
    /* add secondary patterns */
    for (i = 0; i < patternsize; i++)
      strcat(buf, "==<>");
    strcat(buf, "#n");
  }

  return buf;
}


void strip_aggression(CHAR_DATA *ch)
{
  if (IS_NPC(ch)) return;

  ch->pcdata->agg_counter     = 0;
  ch->pcdata->aggress_towards = 0;
  ch->pcdata->aggress_from    = 0;
}


/*
 * Is astr contained within bstr ?
 *
 */
bool is_contained( const char *astr, const char *bstr )
{
  int i, alen, blen, count;
   
  alen = strlen(astr);
  blen = strlen(bstr);
  if (alen > blen) return FALSE;
  for (i = 0; i <= (blen - alen); i++)
  {
    count = 0;
    while (count < alen && UPPER(astr[count]) == UPPER(bstr[i+count])) count++;
    if (count == alen) return TRUE;
  }
  return FALSE;
}

bool is_contained2( const char *astr, const char *bstr )
{
  int i, alen, blen, count;
   
  alen = strlen(astr);
  blen = strlen(bstr);
  if (alen > blen) return FALSE;
  for (i = 0; i <= (blen - alen); i++)
  {
    count = 0;
    while (count < alen && astr[count] == bstr[i+count]) count++;
    if (count == alen) return TRUE;
  }
  return FALSE;
}

int get_next_playerid()
{
  top_playerid++;
  save_coreinfo();
  return top_playerid;
}


int strlen2(const char *s)
{
  int i, b, count=0;

  if (s[0] == '\0') return 0;
  b = strlen(s);
  for (i = 0; i < b; i++)
  {
    if (s[i] == '#') count++;
  }
  return (b + 7 * count);
}

void win_prize( CHAR_DATA *ch )
{
  int i,vnum;
  OBJ_DATA *obj;
  OBJ_INDEX_DATA *pIndex;
  
  if (IS_NPC(ch)) return;
  i = number_range(1,100);
  if (i < 50) vnum = OBJ_VNUM_PROTOPLASM;
  else if (i < 65) vnum = 33851;
  else if (i < 75) vnum = 33852;
  else if (i < 80) vnum = 33853;
  else if (i < 85) vnum = 33854;
  else if (i < 90) vnum = 33855;
  else if (i < 95) vnum = 33856;
  else vnum = 33857;
  if ((pIndex = get_obj_index(vnum)) == NULL)
  {
    bug("BAD PRIZE!!",0);
    return;
  }
  obj = create_object(pIndex, 50);
  if (vnum == OBJ_VNUM_PROTOPLASM)
  {
    obj->level = 1;
    free_string(obj->short_descr);
    free_string(obj->name);
    free_string(obj->description);
    obj->short_descr = str_dup("A prize token");
    obj->description = str_dup("A token lies on the floor");
    obj->name = str_dup("prize token");
    obj->value[0] = number_range(100,300);
    obj->item_type = ITEM_QUEST;
  }
  obj_to_char(obj,ch);
  return;
}

void log_string2(const char *str)
{
  char *strtime;

  strtime = ctime(&current_time);
  strtime[strlen(strtime)-1] = '\0';
  fprintf(stderr, "%s :: %s\n", strtime, str);

  return;
}

void init_vt100(DESCRIPTOR_DATA *d, char *xbuf)
{
  CHAR_DATA *ch;
  char buf[MAX_STRING_LENGTH];
  int i;

  if ((ch = d->character) == NULL)
  {
    bug("Init_vt100: No character", 0);
    return;
  }
  if ((i = atoi(xbuf)) < 10)
  {
    send_to_char("VT100 Failed.\n\r", ch);
    return;
  }
  ch->pcdata->vt100_size = i;
  SET_BIT(ch->pcdata->tempflag, TEMP_VT100);
  sprintf(buf, "\e[%d;1H%s%s\e[1;1H%s%s\e[1;%dr",
    i, VT_CLEAR_LINE, VT_SAVECURSOR, VT_SETWIN_CLEAR, VT_CLEAR_SCREEN, i - 2);
  send_to_char(buf, ch);
  send_to_char("VT100 Initialized.\n\r", ch);
  return;
}

void check_help_soundex(char *argument, CHAR_DATA *ch)
{
  HELP_DATA *pHelp;
  char buf[MAX_STRING_LENGTH];
  char tbuf[MAX_STRING_LENGTH];
  char arg[MAX_INPUT_LENGTH];
  char keyword[MAX_INPUT_LENGTH];
  char *str;
  bool found = FALSE;

  one_argument(argument, arg);

  if (arg[0] == '\0') return;

  sprintf(buf, "\n\r[Perhaps:");
  for (pHelp = first_help; pHelp; pHelp = pHelp->next)
  {
    if (pHelp->level > ch->level) continue;

    str = pHelp->keyword;
    str = one_argument(str, keyword);
    while (keyword[0] != '\0')
    {
      if (SoundexMatch(GetSoundexKey(arg), GetSoundexKey(keyword)) > 75)
      {
        found = TRUE;
        sprintf(tbuf, " %s", keyword);
        strcat(buf, tbuf);
      }
      str = one_argument(str, keyword);
    }
  }
  strcat(buf, "]\n\r");
  if (found) send_to_char(buf, ch);
}


void do_clearstats2( CHAR_DATA *ch, char *argument )
{
    OBJ_DATA *obj;
    OBJ_DATA *obj_next;
    if (IS_NPC(ch)) return;

    powerdown(ch); /* remove class shit */

    for ( obj = ch->carrying; obj != NULL; obj = obj_next )
    {
        obj_next = obj->next_content;
        if ( obj->wear_loc != WEAR_NONE )
        {obj_from_char(obj); obj_to_char(obj,ch);}
    }
     
    while ( ch->affected )
      affect_remove( ch, ch->affected );
      
    if (IS_SET(ch->affected_by, AFF_POLYMORPH)) REMOVE_BIT(ch->affected_by, AFF_POLYMORPH);
    if (IS_SET(ch->affected_by, AFF_ETHEREAL)) REMOVE_BIT(ch->affected_by, AFF_ETHEREAL);  
    if (IS_EXTRA(ch,EXTRA_DRAGON)) REMOVE_BIT(ch->extra, EXTRA_DRAGON);
    
    ch->affected_by      = 0;
    ch->armor            = 100;
    ch->hit              = UMAX( 1, ch->hit  );
    ch->mana             = UMAX( 1, ch->mana );
    ch->move             = UMAX( 1, ch->move );
    ch->hitroll          = 0;
    ch->damroll          = 0;
    ch->saving_throw     = 0;
    ch->pcdata->mod_str  = 0;
    ch->pcdata->mod_int  = 0;
    ch->pcdata->mod_wis  = 0;
    ch->pcdata->mod_dex  = 0;
    ch->pcdata->mod_con  = 0;
    ch->pcdata->followers = 0;
    if (IS_SET(ch->newbits, NEW_DFORM)) REMOVE_BIT(ch->newbits, NEW_DFORM);
    if (IS_POLYAFF(ch, POLY_ZULOFORM)) REMOVE_BIT(ch->polyaff, POLY_ZULOFORM);
    if (IS_SET(ch->newbits, NEW_CUBEFORM)) REMOVE_BIT(ch->newbits, NEW_CUBEFORM);
    if (IS_SET(ch->polyaff, POLY_DRAGON))  REMOVE_BIT(ch->polyaff, POLY_DRAGON);
    save_char_obj( ch );
    send_to_char("Your stats have been cleared.  Please rewear your equipment.\n\r",ch);
    return;
}

/*
 *  If an item have a bad char in it's short/long/name desc, the mud
 *  will freeze when the char with that item tries to log on, so use
 *  this check on any renaming of items (glamour/reshape/etc).
 */
bool has_bad_chars(CHAR_DATA *ch, char *argument)
{
  int i;
  
  if ( argument[0] == '\0' ) return FALSE;
  for (i = 0; argument[i] != '\0' ; i++)  
  {
    if (argument[i] == '~') return TRUE;
  }
  return FALSE;
}

void ragnarok_stop()
{
  DESCRIPTOR_DATA *d;
  
  ragnarok = FALSE;
  do_info(NULL,"#CPeace has been restored in the realms, the time of ragnarok is no more#n");
  for (d = descriptor_list; d != NULL; d = d->next)
  {
    if (d->character && d->connected == CON_PLAYING)
    {
      d->character->fight_timer = 0;
      d->character->pcdata->safe_counter = 5;
      do_call(d->character,"all");
      do_restore(d->character,"self");
    }
  }
  return;
}

/* agrr_test by blade of E, version 1.31. */
void aggr_test(CHAR_DATA * ch)
{
  char buf[60];
  CHAR_DATA *wch;
  CHAR_DATA *wch_next;
  CHAR_DATA *victim;
    
  if (!IS_NPC(ch) && ch->level < 7 && ch->in_room != NULL && !IS_SET(ch->in_room->room_flags,ROOM_SAFE))
  {  
    for ( wch = ch->in_room->people; wch != NULL; wch = wch_next )
    {
      wch_next = wch->next_in_room;
      if ( !IS_NPC(wch) || !IS_SET(wch->act, ACT_AGGRESSIVE)
         || wch->fighting != NULL || IS_AFFECTED(wch, AFF_CHARM)
         || !IS_AWAKE(wch) || ( IS_SET(wch->act, ACT_WIMPY) && IS_AWAKE(ch))
         || !can_see( wch, ch ) || number_bits(2) == 0)
      {
        continue;
      }
      victim = wch;
      if ( victim == NULL ) continue;
      sprintf(buf,"%s screams and attacks!\n\r", victim->name);
      send_to_char(buf, ch);
      multi_hit( victim, ch, TYPE_UNDEFINED );
    }
  }
  return;
}  

void powerdown(CHAR_DATA *ch)
{
  if (IS_NPC(ch)) return;

    if (IS_CLASS(ch, CLASS_DEMON) || IS_CLASS(ch, CLASS_HELLS_SOLDIER) || IS_CLASS(ch, CLASS_BETRAYER) 
    || IS_CLASS(ch, CLASS_SHADOW_FIEND) || IS_CLASS(ch, CLASS_SHADOW_DRAGON))
  {
    if (IS_POLYAFF(ch, POLY_ZULOFORM))  /* demonform */
    {
      REMOVE_BIT(ch->polyaff, POLY_ZULOFORM);
      REMOVE_BIT(ch->affected_by, AFF_POLYMORPH);
      free_string( ch->morph );
      ch->morph = str_dup( "" );
    }
  }
  else if (IS_CLASS(ch, CLASS_DROW) || IS_CLASS(ch, CLASS_BLACK_ASSASSIN)
  || IS_CLASS(ch, CLASS_STALKER) || IS_CLASS(ch, CLASS_SHADOWBORN))

  {
    if (IS_SET(ch->newbits,NEW_DFORM)) /* spiderform */
    {
      free_string(ch->morph);
      ch->morph = str_dup("");
      REMOVE_BIT(ch->newbits,NEW_DFORM);
      REMOVE_BIT(ch->newbits,THIRD_HAND);
      REMOVE_BIT(ch->newbits,FOURTH_HAND);
    }
  }
    else if (IS_CLASS(ch, CLASS_UNDEAD_LYCAN) || IS_CLASS(ch, CLASS_HELL_SPAWN) 
    || IS_CLASS(ch, CLASS_VAMPIRIC_MIST) || IS_CLASS(ch, CLASS_VAMPIRE))

  {
    if (IS_EXTRA(ch, EXTRA_DRAGON)) /* dragonform */
    {
      REMOVE_BIT(ch->extra,EXTRA_DRAGON);
      free_string( ch->morph );
      ch->morph = str_dup( "" );
    }
    if (IS_POLYAFF(ch, POLY_ZULOFORM)) /* zuloform */
    {
      REMOVE_BIT(ch->polyaff, POLY_ZULOFORM);
      REMOVE_BIT(ch->affected_by, AFF_POLYMORPH);
      free_string( ch->morph );
      ch->morph = str_dup( "" );
    }
  }
    else if (IS_CLASS(ch, CLASS_TANARRI) || IS_CLASS(ch, CLASS_DEVA) 
    || IS_CLASS(ch, CLASS_HELL_SPAWN) || IS_CLASS(ch, CLASS_BAATEZU))
  {
    if (ch->pcdata->powers[TANARRI_FURY_ON] == 1)  /* fury */
      ch->pcdata->powers[TANARRI_FURY_ON] = 0;
  }
//else if (IS_CLASS(ch, CLASS_SHAPESHIFTER))
//{
//  if (IS_SET(ch->affected_by, AFF_POLYMORPH)) /* reset form */
//  {
//    ch->pcdata->powers[SHAPE_FORM]=0;
//    REMOVE_BIT(ch->affected_by, AFF_POLYMORPH);
//    free_string(ch->morph);
//    ch->morph=str_dup("");
//  }
//}
//else if (IS_CLASS(ch, CLASS_DROID))
//{
//  if (IS_SET(ch->newbits, NEW_CUBEFORM))  /* avatar of Lloth */
//  {
//    REMOVE_BIT(ch->newbits, NEW_CUBEFORM);
//    REMOVE_BIT(ch->affected_by, AFF_POLYMORPH);  
//    free_string(ch->morph);
//    ch->morph=str_dup("");
//  }
//
    else if (IS_CLASS(ch, CLASS_UNDEAD_KNIGHT) || IS_CLASS(ch, CLASS_UNDEAD_ASSASSIN)
    || IS_CLASS(ch, CLASS_NAZGUL) || IS_CLASS(ch, CLASS_NECROMANCER))
  {
    if (IS_SET(ch->pcdata->powers[AURAS], MIGHT_AURA))  /* aura of might */
      REMOVE_BIT(ch->pcdata->powers[AURAS], MIGHT_AURA);
  }
    else if (IS_CLASS(ch, CLASS_HEAVENS_SOLDIER) || IS_CLASS(ch, CLASS_TYPHON)
    || IS_CLASS(ch, CLASS_ANGEL) || IS_CLASS(ch, CLASS_SILVER_DRAGON))
  {
    if (IS_SET(ch->newbits, NEW_CUBEFORM)) /* godly favor */
    {
      REMOVE_BIT(ch->newbits, NEW_CUBEFORM);
      REMOVE_BIT(ch->affected_by, AFF_POLYMORPH);
      free_string(ch->morph);
      ch->morph=str_dup("");
    }
  }
  return;
}

int needed (CHAR_DATA *ch)
{
int ratio;
if (IS_NPC(ch)) return 0;
//if ((ch->pkill + ch->pdeath) == 0) ratio = 0;
if (ch->status == 0) ratio = 0;
if (ch->status > 0) 
{
ratio = (ch->status * 100);
}

return ratio;
}

int get_ratio(CHAR_DATA *ch)
{
  int ratio;

  if (IS_NPC(ch)) return 0;
  if ((ch->pkill + ch->pdeath) == 0) ratio = 0; // to avoid divide by zero.
  else if (ch->pkill > 0)
    ratio = ch->pkill * 100 * ((ch->pkill * ch->pkill) - (ch->pdeath * ch->pdeath))/((ch->pkill + ch->pdeath) * (ch->pkill + ch->pdeath));
  else
    ratio = 100 * ((ch->pkill * ch->pkill) - (ch->pdeath * ch->pdeath))/((ch->pkill + ch->pdeath) * (ch->pkill + ch->pdeath));
  return ratio;
}

bool multicheck(CHAR_DATA *ch)
{
  CHAR_DATA *gch;
  char buf[MAX_STRING_LENGTH];

  for (gch = char_list; gch; gch = gch->next)
  {
    if (IS_NPC(gch)) continue;
    if (gch == ch) continue;
    if (strlen(gch->lasthost) > 2)
    {
      if (gch->desc)
      {
        if (!str_cmp(gch->desc->host, ch->desc->host))
        {
          sprintf(buf,"%s has connected from the same IP as %s", ch->name, gch->name);
          log_string(buf);
//          sprintf(buf,"%s And %s Are MULTIPLAYING BITCHES!", ch->name, gch->name);
//          do_info(ch,buf);
//          do_quit(%s, gch-> );

          return TRUE;
        }
      }
      else if (!str_cmp(gch->lasthost, ch->desc->host))
      {
        sprintf(buf,"%s has connected from the same IP as %s", ch->name, gch->name);
        log_string(buf);
        return TRUE;
      }
    }
  }
  return FALSE;
}

bool reachedDecapLimit( CHAR_DATA *ch )
{
  AFFECT_DATA *paf;
  OBJ_DATA *obj;
  int limit = 0, objhps = 0, spellhps = 0;
  int hps, i;
     
  if (IS_NPC(ch)) return TRUE;
  if (ch->level > 6) return FALSE;
    
//if (!IS_CLASS(ch, CLASS_SAMURAI))
//{
//  for (paf = ch->affected; paf != NULL; paf = paf->next)
//  {
//    if (paf->location == APPLY_HIT)
//      spellhps += paf->modifier;
//  } 
//}
  for (i = 0; i < MAX_WEAR; i++)
  {
    if ((obj = get_eq_char(ch, i)) == NULL) continue;
//  if (IS_CLASS(ch, CLASS_SAMURAI) && obj->pIndexData->vnum != 33177) continue;
    for (paf = obj->pIndexData->affected; paf; paf = paf->next)
    {
      if (paf->location == APPLY_HIT)
        objhps += paf->modifier;
    }
    for (paf = obj->affected; paf; paf = paf->next)
    {
      if (paf->location == APPLY_HIT)
        objhps += paf->modifier;
    }
  }

  hps = (ch->max_hit - (spellhps + objhps));

  if (hps > 10000) limit += 10;
  else limit += hps/1000;
  if ((hps -= 10000) > 10000) limit += 20;
  else if (hps > 0) limit += 2 * hps/1000;
  if ((hps -= 10000) > 10000) limit += 30;
  else if (hps > 0) limit += 3 * hps/1000;
  if ((hps -= 10000) > 10000) limit += 40;
  else if (hps > 0) limit += 4 * hps/1000;
  if ((hps -= 10000) > 10000) limit += 50;  
  else if (hps > 0) limit += 5 * hps/1000;
  if ((hps -= 10000) > 10000) limit += 60;
  else if (hps > 0) limit += 6 * hps/1000;
     
  if (is_upgrade(ch)) limit *= (2 + ch->pcdata->upgrade_level);
     
  /*
   * For those with no skill
   */
  limit += ch->pdeath;   

  if (limit > ch->pkill) return FALSE;
  else return TRUE;
}

void death_info(char *str)
{
  DESCRIPTOR_DATA *d;
  char buf[MAX_STRING_LENGTH];

  if (str[0] == '\0') return;

  sprintf(buf, "#0/\\/\\ #RDe#Ya#Rth #0/\\/\\#n %s\n\r", str);

  for (d = descriptor_list; d != NULL; d = d->next)
  {
    if (d->connected == CON_PLAYING && d->character != NULL)
      send_to_char(buf, d->character);
  }
  return;
}

void avatar_info(char *str)
{
  DESCRIPTOR_DATA *d;
  char buf[MAX_STRING_LENGTH];

  if (str[0] == '\0') return;

  sprintf(buf, "#p-=#P[ #WAvatar #P]#p=-#n %s\n\r", str);

  for (d = descriptor_list; d != NULL; d = d->next) 
  {  
    if (d->connected == CON_PLAYING && d->character != NULL)                                              
      send_to_char(buf, d->character);
  }  
  return;
}

void leave_info(char *str)
{
  DESCRIPTOR_DATA *d;

  if (str[0] == '\0') return;

  for (d = descriptor_list; d != NULL; d = d->next) 
  {  
    if (d->connected == CON_PLAYING && d->character != NULL)                                              
    {    
      send_to_char("#G+#g-#G+ #0Leaves #G+#g-#G+#n ", d->character); 
      send_to_char(str, d->character); 
      send_to_char("\n\r", d->character); 
    }    
  }  
  return;
}

void enter_info(char *str)
{
  DESCRIPTOR_DATA *d;

  if (str[0] == '\0') return;

  for (d = descriptor_list; d != NULL; d = d->next) 
  {
    if (d->connected == CON_PLAYING && d->character != NULL)
    {
      send_to_char("#0=#w-#0= #WEnters #0=#w-#0=#n ", d->character); 
      send_to_char(str, d->character); 
      send_to_char("\n\r", d->character); 
    }
  }
  return;
}

int getMight(CHAR_DATA *ch)
{
  AFFECT_DATA *paf;
  OBJ_DATA *obj;
  int spellhps = 0;
  int objhps = 0;
  int might, temp, i;

for (i = 0; i < MAX_WEAR; i++)
{
  if ((obj = get_eq_char(ch, i)) == NULL) continue;
  for (paf = obj->pIndexData->affected; paf != NULL; paf = paf->next)
  {
    if (paf->location == APPLY_HIT)
      objhps += paf->modifier;
  }
  for (paf = obj->affected; paf; paf = paf->next)
  {
    if (paf->location == APPLY_HIT)
      objhps += paf->modifier;
  }
  }

  might = (ch->max_hit - (spellhps + objhps))/5500;
 

  if (ch->symbioteac > 0)
  might += ch->symbioteac / 10;

  if (ch->symbiotedc > 0)
  might += ch->symbiotedc / 10;

  if (ch->symbiotedr > 0)
  might += ch->symbiotedr / 5;

  if (ch->symbiotehr > 0)
  might += ch->symbiotehr / 5;


  for (i = 0; i < 5; i++)  might += UMIN(2, ch->spl[i]/100);
  for (i = 0; i < 19; i++) might += UMIN(4, ch->wpn[i]/50);
  for (i = 1; i < 11; i++) might += UMIN(4, ch->stance[i]/50);
  if (IS_SET(ch->newbits, NEW_MASTERY)) might += 20;
  if (ch->stance[23] != -1) might += 250;
  else if (ch->stance[22] != -1) might += 100;
  else if (ch->stance[21] != -1) might += 50;
  else if (ch->stance[20] != -1) might += 50;
  else if (ch->stance[19] != -1) might += 50;
  if (ch->pcdata->powers[18] > 0) might += ch->pcdata->powers[18] * 50;
  if (ch->pcdata->powers[19] > 0) might += ch->pcdata->powers[19] * 50;

  might += ch->pResist * 10;
  might += ch->pcdata->legend * 10;
  might += ch->pRank * 10;
  might += ch->pcRaceLevel;



  if (might >= 150)
  {
//    if (ch->pcdata->rune_count > 0) might += UMIN(150, ch->pcdata->rune_count * 10);
//    if (ch->pcdata->platinum_count > 0) might += UMIN(350, ch->pcdata->platinum_count * 40);
//    if (ch->pcdata->arti_count > 0) might += UMIN(400, ch->pcdata->arti_count * 40);
    if ((temp = get_ratio(ch)) >= 500) might += UMIN(100, temp / 50);  // 10 points for each pkpower.
//    if (ch->pcdata->upgrade_level > 0) might += ch->pcdata->upgrade_level * 270;
    if (ch->pStatus > 0) might += ch->pStatus * 100;
  }
  return might;
}

void forge_affect(OBJ_DATA *obj, int value)
{
  AFFECT_DATA paf;

  paf.type           = 0;
  paf.duration       = -1;
  paf.location       = APPLY_HITROLL;
  paf.modifier       = value;   
  paf.bitvector      = 0;
  affect_to_obj(obj, &paf);
    
  paf.type           = 0;
  paf.duration       = -1;
  paf.location       = APPLY_DAMROLL;
  paf.modifier       = value;
  paf.bitvector      = 0;
  affect_to_obj(obj, &paf);
}

void dump_last_command()
{
  FILE *fp;
  char buf[MAX_STRING_LENGTH];

  fp = fopen("../src/crash.txt","a");
  fprintf (fp,"Last command typed : %s\n",last_command);
  fflush(fp);
  fclose(fp);

  /*
   * creates a note to the immortals
   */
  sprintf(buf, "It seems we have crashed, the last command typed was\n\r\n\r");
  strcat(buf, last_command);
  strcat(buf, "\n\r\n\rPlease remember that this doesn't mean that this caused the crash.\n\r\n\rRegards,\n\r\n\rThe Crash Code");
  make_note("Immortal", "Crash Code", "imm", "We Crashed", 7, buf);

} 

void update_revision(CHAR_DATA *ch)
{
  OBJ_DATA *obj;
  int i;

  if (IS_NPC(ch)) return;
  if (ch->pcdata->revision == CURRENT_REVISION) return;

  /*
   * We don't end cases with break, since we want the player to be fully updated.
   */
  switch (ch->pcdata->revision)
  {
    case 0:
      for (i = 0; i < MAX_WEAR; i++)
      {
        if ((obj = get_eq_char(ch, i)) == NULL) continue;
        if (obj->pIndexData->vnum >= 814 && obj->pIndexData->vnum <= 825) ch->pcdata->rune_count++;
      }
      ch->pcdata->revision++;
    default: break;
  }
  return;
}
bool in_fortress(CHAR_DATA *ch)
{
  if (!ch->in_room) return FALSE;
  if (ch->in_room->vnum >= 151 && ch->in_room->vnum <= 170) return TRUE;
  return FALSE;
}

bool in_arena(CHAR_DATA *ch)
{
  if (!ch->in_room) return FALSE;
  if (ch->in_room->vnum >= 50 && ch->in_room->vnum <= 67) return TRUE;
  return FALSE;
}


void logout_message(CHAR_DATA *ch)
{
  static char * const he_she  [] = { "XX", "he",  "she" };
  static char * const him_her [] = { "XX", "him", "her" };
  static char * const his_her [] = { "XX", "his", "her" };
 
  DESCRIPTOR_DATA *d;
  char buf[400]; // that should be plenty.
  const char *dmess;
  const char *i;
  char *ptr2;
  char *ptr;
  int size;
  
  size = strlen2(ch->pcdata->logoutmessage);
  if (size > 380)
  {
    bug("Bad logoutmessage.",0);
    return;
  }
    
  ptr2  = "#C<- #RLeaves #C->#n ";
  ptr   = buf;
  dmess = ch->pcdata->logoutmessage;
  
  while ((*ptr = *ptr2) != '\0')
    ++ptr, ++ptr2;
   
  while (*dmess != '\0')
  {
    if ( *dmess != '$' )
    {
      *ptr++ = *dmess++;
      continue;
    }
    ++dmess;
    switch (*dmess)
    {
      default:  i = ""; break;
      case 'n': i = ch->name; break;
      case 'e': i = he_she  [URANGE(1, ch->sex, 2)]; break;
      case 'm': i = him_her [URANGE(1, ch->sex, 2)]; break;
      case 's': i = his_her [URANGE(1, ch->sex, 2)]; break;
    }
    ++dmess;
    /* copying the data into the pointer */
    while ((*ptr = *i) != '\0')
      ++ptr, ++i;
  }
  *ptr++ = '\n';
  *ptr++ = '\r';
  
  for (d = descriptor_list; d; d = d->next)   
  {
    if (d->lookup_status != STATUS_DONE) continue;
    if (d->connected != CON_PLAYING ) continue;
    write_to_buffer( d, buf, ptr - buf );
  }
  return;
}
  
void update_mudinfo()
{
        DESCRIPTOR_DATA *d;
        int       i, pcount = 0;

        /*
         * Each week, the data is stored to a file, and
         * the variable cleared.
         */
        if (mudinfo[MUDINFO_UPDATED] > 20160)
        {
                write_mudinfo_database();
                for (i = 0; i < (MUDINFO_MAX - 2); i++)
                {
                        mudinfo[i] = 0;
                }
                log_string("Mudinfo database updated.");
        }

        /*
         * Increase update count 
         */
        mudinfo[MUDINFO_UPDATED]++;

        /*
         * Outdate the output data 
         */

        if (total_output > mudinfo[MUDINFO_DATA_PEAK])
                mudinfo[MUDINFO_DATA_PEAK] = total_output;

        /*
         * The stored data 
         */
        if (mudinfo[MUDINFO_BYTE] > 1048576)    // 1 megabyte
        {
                mudinfo[MUDINFO_MBYTE]++;
                mudinfo[MUDINFO_BYTE] -= 1048576;
        }
        mudinfo[MUDINFO_BYTE] += total_output;

        /*
         * The temp data 
         */
        if (mudinfo[MUDINFO_BYTE_S] > 1048576)  // 1 megabyte
        {
                mudinfo[MUDINFO_MBYTE_S]++;
                mudinfo[MUDINFO_BYTE_S] -= 1048576;
        }
        mudinfo[MUDINFO_BYTE_S] += total_output;

        /*
         * We clear the counter 
         */
        total_output = 0;

        for (d = descriptor_list; d; d = d->next)
        {
                if (d->connected == CON_PLAYING
                    && d->lookup_status == STATUS_DONE)
                {
                        if (d->character)
                        {
                                if (d->character->level < 13)
                                {
                                        pcount++;
                                        if (d->out_compress)
                                                mudinfo[MUDINFO_MCCP_USERS]++;
                                        else
                                                mudinfo[MUDINFO_OTHER_USERS]++;
                                        if (IS_SET
                                            (d->character->act, PLR_SOUND))
                                                mudinfo[MUDINFO_MSP_USERS]++;
                                }
                        }
                }
        }

        if (pcount > mudinfo[MUDINFO_PEAK_USERS])
                mudinfo[MUDINFO_PEAK_USERS] = pcount;

        save_mudinfo();
}

void tie_message(CHAR_DATA *ch, CHAR_DATA *victim)
{
  static char * const he_she  [] = { "XX", "he",  "she" };
  static char * const him_her [] = { "XX", "him", "her" };
  static char * const his_her [] = { "XX", "his", "her" };
  DESCRIPTOR_DATA *d;
  char buf[400]; // that should be plenty.
  const char *dmess;
  const char *i;
  char *ptr2;
  char *ptr;
  int size;
   
  size = strlen2(ch->pcdata->tiemessage);
  if (size > 380)
  {
    bug("Bad tiemessage.",0);
    return;
  }
  
  ptr2  = "#C<- #RTie #C->#n ";
  ptr   = buf;
  dmess = ch->pcdata->tiemessage;
   
  while ((*ptr = *ptr2) != '\0')
    ++ptr, ++ptr2;
   
  while (*dmess != '\0')
  {
    if ( *dmess != '$' )
    {
      *ptr++ = *dmess++;
      continue;
    }
    ++dmess;
    switch (*dmess)
    {
      default:  i = ""; break;
      case 'n': i = ch->name; break;
      case 'e': i = he_she  [URANGE(1, ch->sex, 2)]; break;
      case 'm': i = him_her [URANGE(1, ch->sex, 2)]; break;
      case 's': i = his_her [URANGE(1, ch->sex, 2)]; break;
      case 'N': i = victim->name; break;
      case 'S': i = his_her [URANGE(1, victim->sex, 2)]; break;
      case 'M': i = him_her [URANGE(1, victim->sex, 2)]; break;
      case 'E': i = he_she  [URANGE(1, victim->sex, 2)]; break;
    }
    ++dmess;
    /* copying the data into the pointer */   
    while ((*ptr = *i) != '\0')
      ++ptr, ++i;
  }
  *ptr++ = '\n';
  *ptr++ = '\r';
  
  for (d = descriptor_list; d; d = d->next)
  {
    if (d->lookup_status != STATUS_DONE) continue;
    if (d->connected != CON_PLAYING ) continue;
    write_to_buffer( d, buf, ptr - buf );
  }
  return;
}

void login_message(CHAR_DATA *ch)
{
  static char * const he_she  [] = { "XX", "he",  "she" };
  static char * const him_her [] = { "XX", "him", "her" };
  static char * const his_her [] = { "XX", "his", "her" };
   
  DESCRIPTOR_DATA *d;
  char buf[400]; // that should be plenty.
  const char *dmess;
  const char *i;
  char *ptr2;
  char *ptr;
  int size;
  
  size = strlen2(ch->pcdata->loginmessage);
  if (size > 380)
  {
    bug("Bad loginmessage.",0); 
    return;
  }

  ptr2  = "#C<- #REnters #C->#n ";
  ptr   = buf;
  dmess = ch->pcdata->loginmessage;
      
  while ((*ptr = *ptr2) != '\0')
    ++ptr, ++ptr2;

  while (*dmess != '\0')
  {  
    if ( *dmess != '$' )
    {
      *ptr++ = *dmess++;
      continue;
    }
    ++dmess;
    switch (*dmess)
    {
      default:  i = ""; break;
      case 'n': i = ch->name; break;
      case 'e': i = he_she  [URANGE(1, ch->sex, 2)]; break;
      case 'm': i = him_her [URANGE(1, ch->sex, 2)]; break;
      case 's': i = his_her [URANGE(1, ch->sex, 2)]; break;
    }
    ++dmess;
    /* copying the data into the pointer */
    while ((*ptr = *i) != '\0')
      ++ptr, ++i;
  }
  *ptr++ = '\n';
  *ptr++ = '\r';
    
  for (d = descriptor_list; d; d = d->next)
  {
    if (d->lookup_status != STATUS_DONE) continue;
    if (d->connected != CON_PLAYING ) continue;
    write_to_buffer( d, buf, ptr - buf );
  }
  return;
}

void special_decap_message(CHAR_DATA *ch, CHAR_DATA *victim)
{  
  static char * const he_she  [] = { "XX", "he",  "she" };
  static char * const him_her [] = { "XX", "him", "her" };
  static char * const his_her [] = { "XX", "his", "her" };
  DESCRIPTOR_DATA *d;
  char buf[400]; // that should be plenty.
  const char *dmess;
  const char *i;
  char *ptr2;
  char *ptr;
  int size;
   
  size = strlen2(ch->pcdata->decapmessage);
  if (size > 380)
  {
    bug("Bad decapmessage.",0);
    return;
  }

  ptr2  = "#C<- #RDeath #C->#n ";
  ptr   = buf;
  dmess = ch->pcdata->decapmessage;

  while ((*ptr = *ptr2) != '\0')
    ++ptr, ++ptr2;

  while (*dmess != '\0')
  {
    if ( *dmess != '$' )
    {
      *ptr++ = *dmess++;
      continue;
    }
    ++dmess;
    switch (*dmess)
    {
      default:  i = ""; break;
      case 'n': i = ch->name; break;
      case 'e': i = he_she  [URANGE(1, ch->sex, 2)]; break;
      case 'm': i = him_her [URANGE(1, ch->sex, 2)]; break;
      case 's': i = his_her [URANGE(1, ch->sex, 2)]; break;
      case 'N': i = victim->name; break;
      case 'S': i = his_her [URANGE(1, victim->sex, 2)]; break;
      case 'M': i = him_her [URANGE(1, victim->sex, 2)]; break;
      case 'E': i = he_she  [URANGE(1, victim->sex, 2)]; break;
    }
    ++dmess;
    /* copying the data into the pointer */
    while ((*ptr = *i) != '\0')
      ++ptr, ++i;
  }
  *ptr++ = '\n';
  *ptr++ = '\r';
  
  for (d = descriptor_list; d; d = d->next)
  {
    if (d->lookup_status != STATUS_DONE) continue;
    if (d->connected != CON_PLAYING ) continue;
    write_to_buffer( d, buf, ptr - buf );
  }
  return;
}

void avatar_message(CHAR_DATA *ch)
{  
  static char * const he_she  [] = { "XX", "he",  "she" };
  static char * const him_her [] = { "XX", "him", "her" };
  static char * const his_her [] = { "XX", "his", "her" };

  DESCRIPTOR_DATA *d; 
  char buf[400]; // that should be plenty.
  const char *dmess;
  const char *i;
  char *ptr2;
  char *ptr;  
  int size;

  size = strlen2(ch->pcdata->avatarmessage);
  if (size > 380)
  {
    bug("Bad avatarmessage.",0);
    return;
  }

  ptr2  = "#C<- #RAvatar #C->#n ";
  ptr   = buf;
  dmess = ch->pcdata->avatarmessage;
  
  while ((*ptr = *ptr2) != '\0')
    ++ptr, ++ptr2;
   
  while (*dmess != '\0')
  {
    if ( *dmess != '$' )
    {
      *ptr++ = *dmess++;
      continue;
    }
    ++dmess;
    switch (*dmess)
    {
      default:  i = ""; break;
      case 'n': i = ch->name; break;
      case 'e': i = he_she  [URANGE(0, ch->sex, 1)]; break;
      case 'm': i = him_her [URANGE(0, ch->sex, 1)]; break;
      case 's': i = his_her [URANGE(0, ch->sex, 1)]; break;
    }
    ++dmess;
    /* copying the data into the pointer */
    while ((*ptr = *i) != '\0')
      ++ptr, ++i;
  }
  *ptr++ = '\n';
  *ptr++ = '\r'; 
   
  for (d = descriptor_list; d; d = d->next)
  {
    if (d->lookup_status != STATUS_DONE) continue;
    if (d->connected != CON_PLAYING ) continue;
    write_to_buffer( d, buf, ptr - buf );
  }
  return;
} 
char *strip_ansi(char *str)
{
  static char buf[MAX_STRING_LENGTH];
  char *ptr;

  buf[0] = '\0';
  ptr = buf;

  while (*str != '\0')
  {
    if (*str != '#') *ptr++ = *str++;
    else if (*(++str) != '\0') str++;
  }
  *ptr = '\0';
  return buf;
}
char *line_indent(char *text, int wBegin, int wMax)
{
  static char buf[MAX_STRING_LENGTH];
  char *ptr;
  char *ptr2;
  int count = 0;
  bool stop = FALSE;
  int wEnd = 0;

  buf[0] = '\0';
  ptr = text;
  ptr2 = buf;

  while (!stop)
  {
    if (count == 0)
    {
      if (*ptr == '\0') wEnd = wMax - wBegin;
      else if (strlen(ptr) < (wMax - wBegin)) wEnd = wMax - wBegin;
      else
      {
        int x = 0;

        while (*(ptr + (wMax - wBegin - x)) != ' ') x++;
        wEnd = wMax - wBegin - (x - 1);
        if (wEnd < 1) wEnd = wMax - wBegin;
      }
    }
    if (count == 0 && *ptr == ' ') ptr++;
    else if (++count != wEnd)
    {
      if ((*ptr2++ = *ptr++) == '\0') stop = TRUE;
    }
    else if (*ptr == '\0')
    {
      stop = TRUE;
      *ptr2 = '\0';
    }
    else
    {
      int k;

      count = 0;
      *ptr2++ = '\n';
      *ptr2++ = '\r';
      for (k = 0; k < wBegin; k++)
        *ptr2++ = ' ';
    }
  }
  return buf;
}
char *get_exits(CHAR_DATA *ch)
{
  extern char *const dir_name[];
  static char buf[MAX_STRING_LENGTH];
  EXIT_DATA *pexit;
  bool found;
  int door;

  buf[0] = '\0';

  if (!check_blind(ch)) return "";
 
  sprintf(buf, "#c-#C=#r[#CExits#c:#C");

  found = FALSE;
  for (door = 0; door <= 5; door++)
  {
    if ((pexit = ch->in_room->exit[door]) != NULL && pexit->to_room != NULL)
    {
      found = TRUE;
      if (IS_SET(pexit->exit_info, EX_CLOSED))
      {
        strcat(buf, " #0(#C");
        strcat(buf, dir_name[door]);
        strcat(buf, "#0)#C");
      }
      else
      {  
        strcat(buf, " ");
        strcat(buf, dir_name[door]);
      }
    }
  }
  if (!found)
    strcat(buf, " none");
  strcat(buf, "#0]#n\n\r");

  return buf;
}

void recycle_descriptors()
{
  DESCRIPTOR_DATA *dclose;
  DESCRIPTOR_DATA *dclose_next;

  for (dclose = descriptor_list; dclose; dclose = dclose_next)
  {
    dclose_next = dclose->next;   
    if (dclose->lookup_status != STATUS_CLOSED) continue;
   
    /*
     * First let's get it out of the descriptor list.
     */
    if ( dclose == descriptor_list )
    {
      descriptor_list = descriptor_list->next;
    }
    else 
    {  
      DESCRIPTOR_DATA *d;
   
      for (d = descriptor_list; d && d->next != dclose; d = d->next)
        ;
      if (d != NULL)
        d->next = dclose->next;
      else
      {
        bug( "Recycle_descriptors: dclose not found.", 0 );
        continue;
      }
    }

    /*
     * Clear out that memory
     */
    free_string( dclose->host );
    free_mem( dclose->outbuf, dclose->outsize );
      
    /*
     * Mccp
     */
    if (dclose->out_compress)
    {
      deflateEnd(dclose->out_compress);
      free_mem(dclose->out_compress_buf, COMPRESS_BUF_SIZE);
      free_mem(dclose->out_compress, sizeof(z_stream));
    }
   
    /*
     * Bye bye mr. Descriptor.
     */
    close( dclose->descriptor );
      
    /* 
     * And then we recycle
     */
    dclose->next        = descriptor_free;
    descriptor_free     = dclose;
  }
}


void update_ragnarok()
{
  if (ragnarok_safe_timer > 0)
    ragnarok_safe_timer--;
  if (--ragnarok_on_timer <= 0 && ragnarok)
  {
    ragnarok_stop();
    ragnarok_safe_timer = 120;  /* 120 minutes of safe after a ragnarok */
  }
}

void update_doubleexp()
{
  if (pulse_doubleexp > 0)
  {
    if (--pulse_doubleexp == 0)
    {
      global_exp = FALSE;
      pulse_doubleexp = -1;
      do_info(NULL,"#GH#Ra#Gp#Rp#Gy #GH#Ro#Gu#Rr #0(#7ENDED#0)#n");
    }
  }
}

void update_doubleqps()
{
  if (pulse_doubleqp > 0)
  {
    if ( --pulse_doubleqp == 0)
    {
      global_qp = FALSE;
      pulse_doubleqp = -1;
      do_info(NULL,"#GQ#RU#GE#RS#GT#RO#GR#RS #GD#RE#GL#RI#GG#RH#GT #0(#7ENDED#0)#n");
    }
  }
}
/*
void update_doublecps()
{
  if (pulse_doublecp > 0)
  {
    if ( --pulse_doublecp == 0)
    {
      global_cp = FALSE;
      pulse_doublecp = -1;
      do_info(NULL,"#GP#RO#GW#RE#GR #GH#RO#GU#RR#0(#7ENDED#0)#n");
    }
  }
}

*/
void update_maze()
{ 
/*
char buf[MAX_STRING_LENGTH];

  if ((pulse_mazelast > 0) && (mazestart))
{
pulse_mazelast--;
}

 if (pulse_mazelast == 0) 
{
close_maze();
pulse_mazelast = -1;
}  


if (mazeopen)
{
if (--pulse_mazetime <=1)
{

if (pulse_mazetime == 0)
{
clear_maze();
}
}    


if (pulse_mazetime != 0 && (pulse_mazetime == 10 || pulse_mazetime == 5 || pulse_mazetime == 1) && (mazeopen))
{
sprintf(buf,"Players in the maze have %d more minutes to find the exit.\n\r",pulse_mazetime);
do_info(NULL,buf);
}
}
  if (--pulse_mazeopen <= 1)
  {
    if (pulse_mazeopen > 0) open_maze();
    else if (pulse_mazeopen == 0)
    {
      pulse_mazeopen = -1;
      close_maze();
    }
  }
*/
}



void update_arena()
{
  if (--pulse_arena <= 1)
  {
    if (pulse_arena > 0) open_arena();
    else if (pulse_arena == 0)
    {
      pulse_arena = -1;
      close_arena();
    }
  }
}

void recycle_dummys()
{
  DUMMY_ARG *dummy;
  DUMMY_ARG *dummy_next;
        
  for (dummy = dummy_list; dummy; dummy = dummy_next)
  {
    dummy_next = dummy->next;
    if (dummy->status == 1) continue;  // being used

    if (dummy == dummy_list)
    {
      dummy_list = dummy_list->next;
    } 
    else
    {
      DUMMY_ARG *prev;
        
      /* we find the prev dummy arg */
      for (prev = dummy_list; prev && prev->next != dummy; prev = prev->next)
        ;
      if (prev != NULL)
        prev->next = dummy->next;
      else
      {
        bug( "Recycle_dymmys: dummy not found.", 0 );  
        continue;
      }
      
      /* recycle */  
      dummy->next = dummy_free;
      dummy_free = dummy;
    }
  }     
}